好的,我正在使用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 的答案。数据上下文。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top