区域/语言环境和从数据库中提取日期时间(来自字符串)

时间:2012-02-05 01:34:30

标签: vb.net datetime dataset

我最近遇到的一些问题是使用与我不同的Windows区域设置的客户端。我似乎无法找到解决方法。错误如下:

'InventoryDataTable'的类型初始值设定项引发了异常。 ---> System.TypeInitializationException:'InventoryDataTable'的类型初始值设定项引发了异常。 ---> System.FormatException:String未被识别为有效的DateTime。

当用户加载应用程序并且他们的区域设置与我自己的设置不匹配时,会发生错误。应用程序加载数据集并尝试在允许用户登录之前接收少量数据。删除此数据后,问题会在用户登录到应用程序后立即发生。

我似乎找不到合适的设置来强制用户使用我的Region,或允许应用程序自己解决它...

确切错误:

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 :(得分:0)

发布导致问题的实际代码会有所帮助,但我可以很好地猜测发生了什么。

存储在集中式数据库中的日期格式是否总是给定格式(可能是美国?)。如果是这样,可能发生的事情如下:

从查询中将1/14/2012之类的日期返回到您的数据库。在您的问题客户端上运行的代码正在使用欧洲日期区域设置解析日期。 (在欧盟和世界上大多数其他国家,2012年1月14日表示为14/01/2012又名 dd / MM / yyyy ,而不是 MM / dd / yyyy

尝试在配置文件中指定您始终使用已知的基本区域设置,如下所示:

<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...