我遇到了一个问题,即 C# DateTime 字符串无法转换为 SQL DateTime,因为它被神秘地格式化为英国日期 (dd/MM/yyyy)。以下是一系列事件:
- 在美国的远程服务器上创建一个对象并序列化为 xml。
- xml 在 CA 的本地计算机上反序列化回对象。序列化日期如下所示:2011-07-13T09:56:57.0542425
- 应用程序尝试将对象保存到调用前面提到的存储过程的数据库中。它(不必要地)将日期转换为字符串,然后使用 Convert.ToString(DateTime) 将其作为参数传递给存储过程。
- sproc 失败并出现 SqlException“将数据类型 nvarchar 转换为 datetime 时出错”,因为它收到的 DateTime 类型参数的字符串是 dd/MM/yyyy 格式(并且数据库语言是美国英语)。
现在,代码不应该将日期时间转换为字符串,只是为了在 SQL 中转换回日期时间,但是在一年多来一切都很好之后,这个问题才开始发生(在多台计算机上)。所以我认为数据库或操作系统的文化必须最近发生了变化,导致它们使用不同的日期格式。令我惊讶的是,将操作系统(Windows 7)从英语(加拿大)更改为英语(美国)并重新启动后,问题仍然存在。更令人困惑的是,无论区域设置如何,当在本地创建相同类型的对象而不是反序列化时,都不会发生错误。唯一的区别是序列化版本发生在 Windows 服务中,而本地创建的对象版本发生在 Windows 应用程序中。他们都使用自己的调用 Convert.ToString(DateTime) 的程序集副本,但他们使用的是该程序集的相同版本。我完全糊涂了。
PS .NET 2.0 和 SQL Server 2005