Регионы / локали и извлечение DateTimes (из строк) из базы данных - PullRequest
0 голосов
/ 05 февраля 2012

В последнее время у меня было несколько проблем с клиентами, которые используют настройку Windows Region, отличную от меня.Я не могу найти способ исправить это.Ошибка выглядит следующим образом:

Инициализатор типа для InventoryDataTable вызвал исключение.---> System.TypeInitializationException: инициализатор типа для InventoryDataTable вызвал исключение.---> System.FormatException: строка не была распознана как допустимый DateTime.

Ошибка возникает, когда пользователи загружают приложение и их настройки региона не совпадают с моими.Приложение загружает набор данных и пытается получить небольшой объем данных, прежде чем разрешить пользователю войти в систему. Когда это удаляется, проблема возникает сразу после входа пользователя в приложение.

Кажется, я не могу найти правильные настройки, чтобы заставить пользователя использовать либо мой Регион, либо позволить приложению самостоятельно определить его ...

Точная ошибка:

System.InvalidOperationException: An error occurred creating the form. See Exception.InnerException for details.  The error is: The type initializer for 'InventoryDataTable' threw an exception. ---> System.TypeInitializationException: The type initializer for 'InventoryDataTable' threw an exception. ---> System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
   at System.DateTime.Parse(String s)
   at Invasion_3042_v2.INVDataSet.InventoryDataTable..cctor() in C:\Users\Tdata\Desktop\I2.original\Invasion 3042 v2\INVDataSet.Designer.vb:line 7588
   --- End of inner exception stack trace ---
   at Invasion_3042_v2.INVDataSet.InventoryDataTable..ctor()
   at Invasion_3042_v2.INVDataSet.InitClass() in C:\Users\Tdata\Desktop\I2.original\Invasion 3042 v2\INVDataSet.Designer.vb:line 4296
   at Invasion_3042_v2.INVDataSet..ctor() in C:\Users\Tdata\Desktop\I2.original\Invasion 3042 v2\INVDataSet.Designer.vb:line 447
   at Invasion_3042_v2.INV3042LOGIN.InitializeComponent() in C:\Users\Tdata\Desktop\I2.original\Invasion 3042 v2\INV3042LOGIN.Designer.vb:line 39
   at Invasion_3042_v2.INV3042LOGIN..ctor() in C:\Users\Tdata\Desktop\I2.original\Invasion 3042 v2\INV3042LOGIN.vb:line 100
   --- End of inner exception stack trace ---
   at Invasion_3042_v2.My.MyProject.MyForms.Create__Instance__[T](T Instance) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 190
   at Invasion_3042_v2.My.MyProject.MyForms.get_INV3042LOGIN()
   at Invasion_3042_v2.My.MyApplication.OnCreateMainForm() in C:\Users\Tdata\Desktop\I2.original\Invasion 3042 v2\My Project\Application.Designer.vb:line 35
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()

1 Ответ

0 голосов
/ 05 февраля 2012

Размещение реального кода, вызывающего проблему, помогло бы, но я могу выдвинуть довольно хорошее предположение о том, что происходит.

Может ли быть так, что формат даты, сохраняемый в вашей централизованной базе данных, всегдаданный формат (может быть, США?).Если это так, то очень вероятно следующее:

Дата, такая как 1/14/2012, возвращается из запроса в вашу базу данных.Код, работающий на проблемных клиентах, анализирует дату, используя, возможно, европейские региональные настройки даты.(В ЕС и большинстве других стран мира 14 января 2012 г. выражается как 14/01/2012 или дд / мм / гггг , а не ММ / дд / гггг .

Попробуйте либо указать, что вы всегда хотите использовать известный базовый региональный параметр в своем файле конфигурации, например:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" />

..., либо проанализировать даты, используя указанный параметр культуры, например, так:избегайте использования по умолчанию параметров локальной системы, которые не соответствуют вашим ожиданиям на стороне сервера.

DateTime.Parse("1/14/2012", new CultureInfo("en-US")); // or whatever culture your server database expects...
...