使用datetime的Linq-To-Sql问题?
-
06-07-2019 - |
题
好的,我正在使用SQL Server Express 2008和.Net 3.5(c#)
我在数据库中有几个datetime字段,并且我正在尝试对一行进行编辑(使用Linq-to-Sql)我收到错误“未找到或未更改行”。
我花了一些时间来获取生成的SQL,似乎问题是由附加到datetime的毫秒引起的。
生成的SQL不起作用,
@p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45]
@p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36]
@p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27]
AND ([SignUpDate] = @p5)
AND ([LastActivityDate] = @p6)
AND ([LastLoginDate] = @p7)
如果我自己修改它就好了,
@p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45.390]
@p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36.733]
@p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27.747]
AND ([SignUpDate] = @p5)
AND ([LastActivityDate] = @p6)
AND ([LastLoginDate] = @p7)
我有什么方法可以解决这个问题?
只是添加这是我的编辑代码,
var UserToEdit = this.GetUser(UserId);
UserToEdit.Forename = Fields["Forename"];
UserToEdit.Surname = Fields["Surname"];
UserToEdit.DateOfBirth = Convert.ToDateTime(Fields["DateOfBirth"]);
UserToEdit.DisplayName = Fields["DisplayName"];
UserToEdit.TelephoneNumber = Fields["TelephoneNumber"];
_db.SubmitChanges();
解决方案
请参阅此链接
System.Data.Linq.ChangeConflictException:找不到行或更改
# High precision datetime fields are used. The solution is to set
UpdateCheck永远不会为该列 你的DBML文件
这解决了我的问题,但感觉有点像黑客。
我打开这个看他人的想法。
其他提示
检查这篇文章,它解释了我们需要密切关注DateTime列,检查dbml和数据库之间的不同数据类型,最后解释LinQ乐观并发方法。
where foo.SignupDate >= signUpDate
&& foo.SignUpDate < signUpDate.AddSeconds(1)
&& foo.LastActivityDate >= lastActivityDate
&& foo.LastActivityDate < lastActivityDate.AddSeconds(1)
&& foo.LastLoginDate >= lastActivityDate
&& foo.LastLoginDate < lastActivityDate.AddSeconds(1)
由于您的示例中唯一的区别是毫秒,因此我将使用SQL事件探查器来确定原始Select是否返回毫秒。然后看看你是否可以解决这个问题。行数据似乎包含毫秒,但您的选择不会返回它们。
在您这样做之后,您仍然遇到问题,我们可以看到下一步将会是什么。
基本上,MSSQL架构和Linq数据上下文在上述配置中不能很好地协同工作。您可以更改数据库架构或数据上下文。
更改MSSQL数据类型
我们正在使用 smalldatetime 当a datetime 可以使用href =“https://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes”rel =“nofollow noreferrer”> 1分钟的准确度。
将LINQ更改为SQL数据上下文
如果您需要比1分钟更高的准确度,请查看LiamB自己对将UpdateCheck设置为Never 的答案。数据上下文。