15

我们在这里对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,运行更新的用户帐户的语言设置为EnglishSQL Server ..... 并且该设置在其他地方是相同的(例如,在我们的测试服务器上基础设施)。

所以我的问题真的是:

  1. 为什么Linq-to-SQL 会突然创建一个完全不同的表示DateTime来发送到 SQL Server?有没有旋钮可以控制这个?

  2. 为什么 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
4

1 回答 1

3

我想你可能追错了问题。

我会先检查:

  1. 您的LINQ to SQL模式/数据库模型是准确的。
  2. 您的问题逻辑,以确保新的 DateTime 值不会超出范围。特别是,检查它不能是DateTime.MinValueor 或DateTime.MaxValue
  3. 你没有在你的应用程序中做任何字符串到日期解析。
  4. SQL Server 没有任何触发器(特别是没有触发器,它可能正在修改更新语句)。

我猜你(或你的客户)从得到 '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: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 似乎无法真正将 2011 年 11 月 4 日 02:15:25PM 解释为有效的 DateTime

除非您有一些命令,否则我看不出.NET会在哪里尝试将字符串解释为日期DateTime.Parse,如果是这种情况,那么问题与 LINQ 或 SQL 无关。

于 2011-11-05T16:05:58.183 回答