Linq-to-SQL和DateTime怪异

时间:2011-11-04 14:12:38

标签: asp.net sql-server-2005 linq-to-sql datetime 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

但是,在一个客户的网站上,由于我们尚未明确的原因,此更新将转换为:

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中将其语言设置为English .....并且该设置在其他地方是相同的(例如,在我们的测试服务器基础设施上)。

所以我的问题是:

  1. 为什么在地球上 Linq-to-SQL突然创建了一个完全不同的表示同一个DateTime发送到SQL Server?是否有任何旋钮可以控制它?

  2. 为什么ADO.NET和SQL Server 2005 SP2数据库无法正确处理UPDATE语句?我们的日志中出现错误:

  3.   

    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时的行为方式不同。

    • 使用SQL Server 2005 ,我们的日期变为:Nov 4 2011 02:15:25PM
    • 使用SQL Server 2008 ,我们的日期将变为:2011-11-04 02:15:25PM

1 个答案:

答案 0 :(得分:3)

我认为你可能会追逐错误的问题。

我先检查一下:

  1. 您的LINQ to SQL架构/数据库模型准确无误。
  2. 您的问题逻辑,以确保新的DateTime值无法超出范围。请特别注意,它不能是DateTime.MinValueDateTime.MaxValue
  3. 您没有在应用程序中进行任何字符串解析。
  4. SQL Server没有任何触发器(特别是代替    触发器,可能正在修改更新语句。)
  5. 我猜测你(或你的客户)首先得到'SqlTypeException - SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间'错误消息,经过调查,您发现了日期显示方式的不同。

    你没有提到信息的来源,所以我假设像SQL分析器一样。

    然而,日期显示问题可能是红鲱鱼,因为它应该不是问题。

      

    使用SQL Server 2005,我们的日期将变为:2011年11月4日下午02:15:25

         

    使用SQL Server 2008,我们的日期变为:2011-11-04 02:15:25 PM

    我不确定你到底是什么意思。 SQL不会将'转'日期转换为字符串,因为它不会将日期存储为字符串,但内部表示是一个数字(类似于自1900年1月1日以来的天数)。

    如果您的日期是显示,请于2011年11月4日下午02:15:25,那么这取决于显示信息的程序。

    另外,据我所知,如果你使用的是DateTime参数(如果数据库模型准确的话,LINQ to SQL应该这样做),那么从客户端发送到SQL Server的信息就是SQL数字DateTime的表示。这应该避免客户端和服务器之间的任何日期时间转换问题。例如,当您查看SQL事件探查器时,它不会显示日期的数字表示形式,这对大多数人来说意味着很少,但尝试提供帮助并将值显示为字符串。

    重要的一点是,如果SQL或SQL分析器设法将日期时间参数显示为“2011年11月4日02:15:25 PM”,那么它知道它是一个有效日期,并且它确切知道该日期是什么。

    所以我怀疑显示格式问题可能无关紧要。

    然后,问题就是客户为什么会收到SqlTypeException - SqlDateTime overflow错误消息。

    要做的第一件事是检查您要设置的日期值,这需要在应用程序级别而不是在SQL Server服务器上完成,因为它不会那么远。 (这是我认为这不是SQL配置问题的另一个原因。)

      由于某种原因,似乎.NET无法将2011年11月4日02:15:25 PM解释为有效的DateTime

    除非您有一些DateTime.Parse命令,否则我看不到.NET甚至尝试将字符串解释为日期,如果是这样,那么问题就出现了与LINQ或SQL无关。