我们在这里对Linq-to-SQL有非常奇怪和不一致的行为。
我们的应用程序安装在很多客户的站点上,并且在大多数情况下运行良好。Linq-to-SQL 中的一个查询更新表并将DateTime
列设置为新值。
在所有情况下——包括我们的开发和测试系统——这个 Linq-to-SQL 语句都被翻译成以下内容:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = '2011-11-04 14:15:25', @ID = 555
但是,在一个客户的站点上,由于我们(目前)尚不清楚的原因,此更新被翻译为:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = 'Nov 4 2011 02:15:25PM', @ID = 555
然后由于某种原因在SQL Server 2005上失败。
现在,该客户的服务器(Web 服务器和 SQL Server)安装了美国英语版本的 Windows Server 2008;SQL Server 中的语言设置为us_english
,日期格式设置为mdy
,运行更新的用户帐户的语言设置为English
SQL Server ..... 并且该设置在其他地方是相同的(例如,在我们的测试服务器上基础设施)。
所以我的问题真的是:
为什么Linq-to-SQL 会突然创建一个完全不同的表示
DateTime
来发送到 SQL Server?有没有旋钮可以控制这个?为什么 ADO.NET 和 SQL Server 2005 SP2 数据库不能
UPDATE
正确处理该语句?我们的日志中出现错误,内容如下:
SqlTypeException - SqlDateTime 溢出。必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59 之间。
这似乎是一个 .NET 错误(不仅仅是 SQL Server 错误),而且似乎 .NET 由于某种原因无法真正将其解释Nov 4 2011 02:15:25PM
为有效DateTime
。当尝试在SQL Server Management Studio中运行生成的 UPDATE 语句时,我们似乎无法“强制”该错误发生 -UPDATE
愉快地工作得很好.....
更新:一些进一步的调查似乎表明 Linq-to-SQL 在针对 SQL Server 2005 或 2008 时的行为有所不同。
- 使用 SQL Server 2005,我们的日期变成:
Nov 4 2011 02:15:25PM
- 使用 SQL Server 2008,我们的日期变成:
2011-11-04 02:15:25PM