2013-03-27 29 views
3

那里。 我正在开发一个简单的界面,得到SQLServer的数据和我使用的功能DateTime.ToString(String)DateTime.ToString(格式)不同PC上的意外行为

实际的代码DP.Value.ToString("yyyy-MM-dd HH:mm:00"), 其中DP是一个DateTimePicker控件。

所有工作正常,而我测试它在我自己的笔记本电脑上。但是,当我将编译后的代码移到另一台电脑上时,结果会有所不同。 例如:它从2013-03-27 22:02变为2013-03-27 22.02,取代'。'在一小时内用':'。 但是这足以导致我的应用程序崩溃,因为SQLServer生成的日期无效。

可能是什么罪魁祸首? 两台PC都安装了SQLServer 2008 R2(和相同的排序规则)和.NET Framework 4.0 Client Profile。 我见过一个区别是,我SQLServer的有英语(美国)语言属性,而其他有意大利设置好的,但是我应该与格式字符串克服它...

+2

为什么您将值作为*字符串*传递给SQL?使用参数化SQL并将参数值设置为DateTime。 – 2013-03-27 21:17:01

+0

这是我第一次尝试这种类型的项目,我想先做一些事情,就像写一个查询一样。 – VirtualFurla 2013-03-27 21:25:25

+0

是的,所以写一个查询 - 带参数。它更干净,不受SQL注入攻击,并且没有转换问题。你将不得不迟早地开始使用参数 - 从一开始就这样做,所以你不会陷入坏习惯。 – 2013-03-27 21:35:30

回答

3

你不指定文化,因此当前使用的文化。在另一个系统上,“。”用于时间说明符,而不是“:”。

您可以specify a culture explicitly,但是,为了避免这种情况:

var str = DP.Value.ToString("yyyy-MM-dd HH:mm:00", CultureInfo.InvariantCulture); 

话虽这么说,使用参数化查询和保持价值为DateTime是不是传递一个日期作为字符串更好的习惯。

+0

非常感谢,这解决了我的问题。就像我说的那样,我试图简单地做一些事情,以查询的形式写出来。那么我会尝试不同的解决方案。 – VirtualFurla 2013-03-27 21:28:19

+0

我只是不明白为什么当你已经指定了字符串格式时,它们并没有使它通用。 – 2018-01-15 20:11:20

2

可能是什么罪魁祸首?

用户的文化设置。

一些文化使用.,一些:作为时间分隔符。

解决方案?

使用CultureInfo.InvariantCulture(或选定CultureInfo),以确保一致性:

DP.Value.ToString("yyyy-MM-dd HH:mm:00", CultureInfo.InvariantCulture) 
+0

非常感谢。它解决了这个问题。 – VirtualFurla 2013-03-27 21:29:02