mar*_*c_s 15 asp.net datetime sql-server-2005 linq-to-sql update-statement
我们在这里使用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
Run Code Online (Sandbox Code Playgroud)
但是,在一个客户的网站上,由于我们尚未明确的原因,此更新将转换为:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = 'Nov 4 2011 02:15:25PM', @ID = 555
Run Code Online (Sandbox Code Playgroud)
由于某种原因,然后在SQL Server 2005上失败.
现在,该客户的服务器(Web服务器和SQL Server)安装了美国英语版本的Windows Server 2008; SQL Server中的语言设置为us_english,日期格式设置为mdy,运行更新的用户帐户的语言设置为EnglishSQL Server .....并且该设置在其他地方相同(例如,在我们的测试服务器上)基础设施).
所以我的问题是:
为什么 Linq-to-SQL突然创建一个完全不同的表示形式DateTime发送到SQL Server?有没有旋钮来控制它?
为什么ADO.NET和SQL Server 2005 SP2数据库无法UPDATE正确处理该语句?我们的日志中出现错误,内容如下:
SqlTypeException - SqlDateTime溢出.必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间.
它似乎是一个.NET错误(超过SQL Server错误),似乎.NET无法真正将其解释Nov 4 2011 02:15:25PM为有效DateTime的原因.当试图在SQL Server Management Studio中运行生成的UPDATE语句时,我们似乎无法"强迫"发生错误 - UPDATE快乐的工作正常.....
更新:一些进一步的调查似乎表明Linq-to-SQL在针对SQL Server 2005或2008时表现不同.
Nov 4 2011 02:15:25PM 2011-11-04 02:15:25PM 我认为你可能在追寻错误的问题。
我会首先检查:
DateTime.MinValue或DateTime.MaxValue。我猜您(或您的客户)首先会收到“SqlTypeException - SqlDateTime 溢出”。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间”错误消息,经过调查,您注意到日期显示方式的差异。
你没有提到信息来自哪里,所以我假设是 SQL 探查器之类的东西。
然而,日期显示问题可能是一个转移注意力的问题,因为它不应该是一个问题。
使用 SQL Server 2005,我们的日期变成: Nov 4 2011 02:15:25PM
使用 SQL Server 2008,我们的日期变成:2011-11-04 02:15:25PM
我不确定你的意思到底是什么。SQL 不会将日期“转换”为字符串,因为它不将日期存储为字符串,但内部表示是一个数字(类似于自 1900 年 1 月 1 日以来的天数)。
如果您的意思是您的日期显示为Nov 4 2011 02:15:25PM,那么这取决于显示该信息的程序。
另外,据我了解,如果您使用 DateTime 参数(如果数据库模型准确的话 LINQ to SQL 应该执行此操作),那么从客户端发送到 SQL Server 的信息就是该参数的 SQL 数字表示形式。约会时间。这应该避免客户端和服务器之间的任何日期时间转换问题。例如,当您查看 SQL Profiler 时,它不会向您显示日期的数字表示形式,这对大多数人来说意义不大,但会尽力提供帮助并将值显示为字符串。
重要的一点是,如果 SQL 或 SQL 探查器设法将日期时间参数显示为“2011 年 11 月 4 日 02:15:25PM”,那么它就知道这是一个有效日期,并且它确切地知道那是什么日期。
所以我怀疑显示格式问题可能无关紧要。
那么剩下的问题是为什么您的客户会收到 SqlTypeException - SqlDateTime 溢出错误消息。
首先要做的是检查您设置的日期值,这需要在应用程序级别完成,而不是在 SQL Server 服务器上完成,因为它不会达到那么远。(这是我认为这不是 SQL 配置问题的另一个原因。)
由于某种原因,.NET 似乎无法真正将 Nov 4 2011 02:15:25PM 解释为有效的日期时间
我看不出.NET会在哪里尝试将字符串解释为日期,除非您有一些DateTime.Parse命令,如果是这种情况,那么问题与 LINQ 或 SQL 无关。
| 归档时间: |
|
| 查看次数: |
2180 次 |
| 最近记录: |