使用Linq to SQL DataContext在日期正确时INSERT上的SqlDateTime溢出

时间:2010-03-23 11:35:53

标签: linq-to-sql insert sqldatetime

我使用连接到SQL Server的Linq DataContext进行INSERT时出现SqlDateTime溢出错误(必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM。)我做SubmitChanges()时的数据库。

当我使用调试器时,日期值是正确的。即使我临时更新代码以将日期值设置为DateTime.Now它也不会执行插入。

有没有人找到解决这种行为的方法?也许有办法检查datacontext提交给数据库的SQL。

5 个答案:

答案 0 :(得分:1)

您是否在设计器中将字段设置为自动生成?如果这不是问题,我建议设置数据上下文操作的日志记录到控制台并检查生成的实际SQL以确保它插入该列,然后向后追踪以找到问题。

 context.Log = Console.Out;

FWIW,我经常在设计器中将我的“CreatedTime”和“LastUpdatedTime”列设置为自动生成(和readonly),并为它们提供合适的默认值或使用DB触发器设置插入或更新时的值。当您将其设置为自动生成时,即使已修改,也不会将其包含在插入/更新中。如果列不允许空值,则需要提供另一种设置值的方法,即默认约束和/或触发器。

答案 1 :(得分:1)

您确定要查看正确的日期列吗?发生在我身上一次,错误结果是由另一个在提交之前未设置的非可空日期列引起的。

答案 2 :(得分:0)

我最近遇到过这个。 这个错误也可能说“有些东西阻止了保存!”。因为在我的情况下,问题不是DateTime值。

我以为我正在为主键传递值,而到达的内容是“null”。作为关键,它不能为空 - 所以我的问题完全在别的地方。通过解析null,问题就消失了。

我们都讨厌误导错误 - 这就是其中之一。

最后,作为一个建议...如果您确实发现日期转换成问题,那么根本不要使用日期! .NET的DateTime类支持“Ticks”值。它还可以实例化一个新的DateTime(ticks);太。唯一的问题是,Javascript中的ticks的实现在历史上有不同的起点。因此,如果您尝试从C#获取DateTimes到Javascript,则可能需要在刻度之间进行转换。

答案 3 :(得分:0)

我建议您更改项目的目标框架。也许SQL Server比.Net Framework更新。我看到同样的问题:
我项目的目标框架是3.5 SQL Server是2012年

然后我改为4.0。这个问题已经解决了。

答案 4 :(得分:0)

底线:观察您对SubmitChanges()的调用顺序,并确保所有“已提交”的对象实际上已准备好提交。当我正在设置新LINQ对象的属性(例如,新“tblContact”的“.FirstName”)时,这经常发生在我身上,然后一些条件逻辑需要创建单独的相关记录(例如,一个新的“tblAddress”记录),所以代码去创建“tblAddress”并尝试SubmitChanges()保存该记录,但SubmitChanges()然后也尝试插入未完成的“tblContact”记录,这可能是尚未设置所需的“BirthDate”字段值。因此,当我插入“tblAddress”对象/记录时,异常会发生,但实际上是指“tblContact”对象/记录缺少“BirthDate”。