asp.net - Linq-to-SQL 和 DateTime 的怪异

标签 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 ,运行更新的用户帐户的语言设置为 English在 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 无法真正解释该 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
  • 最佳答案

    我想你可能追错了问题。

    我会先检查:

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

  • 我猜您(或您的客户)从获取 'SqlTypeException - SqlDateTime 溢出开始。必须在 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间”错误消息,经过调查,您注意到日期显示方式的不同。

    你没有提到信息来自哪里,所以我假设像 SQL profiler 这样的东西。

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

    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:25PM,那么这取决于显示信息的程序。

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

    重要的一点是,如果 SQL 或 SQL 探查器设法将日期时间参数显示为“Nov 4 2011 02:15:25PM”,那么它就知道这是一个有效日期,并且它确切地知道那是什么日期。

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

    然后留下了关于为什么您的客户收到 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 无关。

    关于asp.net - Linq-to-SQL 和 DateTime 的怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8010507/

    相关文章:

    c# - EF 6 从没有导航属性的其他表中选择

    c# - Facebook 未检测到 og 标签

    asp.net - 完成方法后面的代码后执行javascript方法?

    asp.net - sql查询修复表中的电话号码问题

    sql - Insert 语句中的多个 Select 语句出错

    performance - SQL Server中的 "OR"是否短路?

    asp.net - 使用 LINQ 的解决方案结构

    asp.net-mvc-3 - Linq to SQL 无法转换对象

    asp.net - 您在 ASP.NET 网站管理工具上选择的数据存储存在问题

    c# - Azure 中的 ASP.Net 应用程序缓存 "Web App"