System.Data.SqlTypes.SqlTypeException:SQLDATETIME溢

2019-09-22 03:03发布

我与C#.NET,也SQL Server 2008中的工作。

我有以下错误,尽量把我的项目中运行测试单元时。

   System.Data.SqlTypes.SqlTypeException:
   SqlDateTime overflow. Must be between
   1/1/1753 12:00:00 AM and 12/31/9999
   11:59:59 PM..

数据库表

Column Name: createddate 
Type: datetime
Default Value: (getdate())
Allow Nulls: No.

我不想插入createddate作为我的INSERT查询的一部分。

当我手动输入一些数据到数据库表中,我得到了以下错误:

   The row was successfully committed
   to the database. However, a problem
   occurred when attempting  to retrieve
   the data back after commit. Because
   of this the displayed data within the
   row is read-only. To fix this
   problem, please re-run the query.

我不明白为什么我收到此错误,无法找到任何人谁拥有了这个问题。 任何人都可以帮忙吗?

Answer 1:

马特是最有可能在正确的轨道上。 您已经定义为您的列的默认值 - 但是,如果你真的插入您的数据库表中的东西,才会生效。

当你做一个单元测试,就像你说的,你最有可能初始化DateTime变量的东西(或人 - 那么这将是DateTime.MinValue,这是01/01/0001),然后您发送到SQL Server而这个值超出了SQL Server的DATETIME的有效范围(如错误中明确规定)。

所以,你需要做的是一个行添加到您的.NET单元测试初始化​​DateTime变量为“DateTime.Today”:

DateTime myDateTime = DateTime.Today

然后插入到SQL Server。

OR:你可以改变你的SQL INSERT语句,以便它不适合该列中插入值 - 它看起来像现在,它确实做到这一点(并试图插入 - 用于SQL Server - 无效的日期到表)。 如果你没有在你的INSERT指定列,那么该列默认getdate()会踢,插入今天的日期到列。



Answer 2:

您正在使用的LINQ to SQL编写单元测试?

如果你是,它可能会绕过GETDATE()默认值,并使用一些其他的值,而不是落在有效范围之外。



Answer 3:

我得到了同样的问题,我使用LINQ与VS2010自动生成数据类文件。 在我意识到LINQ的未使用默认值( GetDate()但它会发送一个Datetime.Min值。 作为结果的SQL服务器将拒绝这个日期“01/01/0001”,因为它不在范围内。

我所做的修复它是将值始终设置为Datetime.NowDatetime.Today等的LINQ不会再发送坏闵datetime值。



Answer 4:

你可能在你的单元测试得到溢出错误,因为你正在传递与价值DateTime.MinValue这是允许的范围SQL的日期时间之外的日期时间未初始化。

我想手动修改表时,我看到了错误消息,这是没有问题的,只是刷新表。



Answer 5:

您使用的数据上下文类的设置与DBML文件和所有的爵士乐吗? 如果是这样,那么您可以在您的DBML文件单击该字段,并设置了“自动生成的Value属性”设置为True。 Visual Studio中必须已经知道与PKEY领域要做到这一点,但对于这些“时间戳”之类的动作设定



文章来源: System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow