2

我遇到了一个问题,即 C# DateTime 字符串无法转换为 SQL DateTime,因为它被神秘地格式化为英国日期 (dd/MM/yyyy)。以下是一系列事件:

  1. 在美国的远程服务器上创建一个对象并序列化为 xml。
  2. xml 在 CA 的本地计算机上反序列化回对象。序列化日期如下所示:2011-07-13T09:56:57.0542425
  3. 应用程序尝试将对象保存到调用前面提到的存储过程的数据库中。它(不必要地)将日期转换为字符串,然后使用 Convert.ToString(DateTime) 将其作为参数传递给存储过程。
  4. sproc 失败并出现 SqlException“将数据类型 nvarchar 转换为 datetime 时出错”,因为它收到的 DateTime 类型参数的字符串是 dd/MM/yyyy 格式(并且数据库语言是美国英语)。

现在,代码不应该将日期时间转换为字符串,只是为了在 SQL 中转换回日期时间,但是在一年多来一切都很好之后,这个问题才开始发生(在多台计算机上)。所以我认为数据库或操作系统的文化必须最近发生了变化,导致它们使用不同的日期格式。令我惊讶的是,将操作系统(Windows 7)从英语(加拿大)更改为英语(美国)并重新启动后,问题仍然存在。更令人困惑的是,无论区域设置如何,当在本地创建相同类型的对象而不是反序列化时,都不会发生错误。唯一的区别是序列化版本发生在 Windows 服务中,而本地创建的对象版本发生在 Windows 应用程序中。他们都使用自己的调用 Convert.ToString(DateTime) 的程序集副本,但他们使用的是该程序集的相同版本。我完全糊涂了。

PS .NET 2.0 和 SQL Server 2005

4

3 回答 3

2

为什么不强制DateTime.ToString()使用您特别想要的文化的格式 - 或指定与您的 SQL 函数期望相匹配的自定义格式规则?

对于自定义格式,您可以在此处查看或对于文化特定格式,您可以在此处查看

于 2011-08-05T18:50:52.780 回答
1

我不相信DateTime除了简单的 64 位整数之外还有任何东西 - 基本上它是以刻度为单位的日期/时间,以及在前几位编码的“种类”。所以创建一个新DateTime的是在本地创建的。换句话说,恐怕我怀疑您关于“在本地创建相同类型的对象”时会发生什么的说法。

这就是我要开始调查的地方 - 摆脱数据库调用,但只需记录调用的结果Convert.ToString(serializedDateTime)Convert.ToString(new DateTime(2011, 7, 25))(作为日期的示例,字符串表示可以清楚地表明事情的方向)。如果你能得到两种不同的日期格式,我会感到非常惊讶——一种用于反序列化的值,另一种用于本地创建的值。

反序列化后得到什么“类型” DateTime(即获取Kind属性的结果)?有了这些信息,您应该能够构造一个完全相等的DateTime值。

于 2011-08-05T18:51:53.817 回答
1

该服务是否可能在具有错误区域设置的帐户下运行?

如果是这样,那么Microsoft 的这些说明可能适用。

于 2011-08-05T19:22:29.650 回答