加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – Linq-to-SQL和DateTime的奇怪

发布时间:2020-12-15 23:54:05 所属栏目:asp.Net 来源:网络整理
导读:我们在这里与 Linq-to-SQL 有很奇怪的和不一致的行为. 我们的应用程序安装在不少客户的网站上,它的工作原理很好. Linq-to-SQL中的一个查询将更新表,并将DateTime列设置为新值. 在所有的情况下 – 包括我们的开发和测试系统 – 这个Linq-to-SQL语句被翻译成如
我们在这里与 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,运行更新的用户帐户的语言在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无关.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读