我们的应用程序安装在不少客户的网站上,它的工作原理很好. 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,运行更新的用户帐户的语言在sql Server中设置为英文…..这个设置与其他地方相同(例如,我们的测试服务器基础设施).
所以我的问题是:
>为什么Linq-to-sql突然创建了一个完全不同的表示形式的相同DateTime来发送到sql Server?有没有旋钮来控制呢?
>为什么ADO.NET和sql Server 2005 SP2数据库不能正确处理UPDATE语句?我们的日志中出现错误:
sqlTypeException – sqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
它似乎是一个.NET错误(多于sql Server错误),似乎.NET无法真正解释为2011年11月4日02:15:25 PM作为有效的DateTime由于某些原因.当尝试在SQL Server Management Studio中运行生成的UPDATE语句时,我们似乎无法“强制”出现该错误 – UPDATE愉快地工作正常…..
更新:进一步的调查似乎表明,对于sql Server 2005或2008,Linq-to-sql的行为有所不同.
>与sql Server 2005,我们的日期变成:2011年11月4日02:15:25
>与sql Server 2008,我们的日期变成:2011-11-04 02:15:25 PM
解决方法
我会先检查一下:
>您的LINQtoSQL模式/数据库模型是准确的.
>您的问题逻辑,以确保没有办法新的DateTime值超出范围.特别是,检查它不能是DateTime.MinValue或DateTime.MaxValue.
>您在应用程序中无法执行任何字符串解析.
> sql Server没有任何触发器(特别是替代
触发器,可能是修改update语句).
我猜你(或你的客户)从获得’sqlTypeException – sqlDateTime溢出开始.必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM错误消息之间,并在调查后注意到日期显示方式的差异.
你没有提到信息来自哪里,所以我假设像sql分析器.
然而,日期显示问题可能是一个红鲱鱼,因为它不应该是一个问题.
with sql Server 2005,our dates get turned into: Nov 4 2011 02:15:25PM
with sql Server 2008,our dates get turned into: 2011-11-04 02:15:25PM
我不知道你的意思是什么sql不会将日期转换为字符串,因为它不将日期存储为字符串,但内部表示是一个数字(类似1900年1月1日以后的天数).
如果你的意思是你的日期显示为2011年11月4日02:15:25 PM,那么这是由显示信息的程序.
另外,据了解,如果您使用的是DateTime参数(如果数据库模型是准确的话,LINQ to sql应该执行的话),则从客户端发送到sql Server的信息是sql数字表示形式约会时间.这应该避免客户端和服务器之间的任何datetime转换问题.当您查看sql Profiler时,它不会显示日期的数字表示形式,这对大多数人来说意义非常小,但尝试有用,并以字符串形式显示该值.
重要的一点是,如果sql或sql分析器设法显示一个datetime参数为“2011年11月4日02:15:25 PM”,那么它知道它是一个有效的日期,它确切地知道是什么日期.
所以我怀疑显示格式问题可能是无关紧要的.
那就是为什么你的客户收到sqlTypeException – sqlDateTime溢出错误消息的问题.
首先要做的是检查你正在设置的日期值,这需要在应用程序级而不是在sql Server服务器上完成,因为它不会那么远. (这是我不认为这是sql配置问题的另一个原因.)
it seems as if .NET cannot really interpret that Nov 4 2011 02:15:25PM as a valid DateTime for some reason
我没有看到.NET甚至会尝试将字符串解释为日期,除非你有一些DateTime.Parse命令,如果是这样,那么这个问题与LINQ或sql无关.