1

好的,我正在使用 SQL Server Express 2008 和 .Net 3.5 (c#)

我在数据库中有几个日期时间字段,并且正在尝试对一行进行编辑(使用 Linq-to-Sql)我收到错误“未找到或更改行”。

我花了一些时间获取生成的 SQL,似乎问题是由附加到日期时间的毫秒数引起的。

生成的 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();
4

5 回答 5

4

看到这个链接,

System.Data.Linq.ChangeConflictException:未找到或更改行

# High precision datetime fields are used. The solution is to set

UpdateCheck 永远不要为您的 DBML 文件的该列

这解决了我的问题,但感觉有点像黑客。

我把这个打开,看看别人怎么想。

于 2009-10-23T10:24:19.663 回答
1

查看这篇文章,它解释了我们需要关注 DateTime 列,检查 dbml 和您的数据库之间的不同数据类型,最后解释了 LinQ 乐观并发方法。

于 2011-07-29T16:38:25.243 回答
0
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)
于 2009-10-23T09:42:13.447 回答
0

由于您的示例中唯一的区别是毫秒,因此我将使用 SQL Profiler 来确定原始 Select 是否返回毫秒。然后看看你能不能解决这个问题。行数据似乎包含毫秒,但您的选择没有返回它们。

在你这样做之后,你仍然有问题,我们可以看到下一步会是什么。

于 2009-10-23T09:54:51.627 回答
0

基本上,MSSQL 模式和 Linq 数据上下文在上述配置中不能很好地一起运行。您可以更改数据库架构或数据上下文。

更改 MSSQL 数据类型

当可以使用1 分钟的精度时,我们使用smalldatetime而不是datetime 。

将 LINQ 更改为 SQL 数据上下文

如果您需要超过 1 分钟的准确度,请查看 LiamB 自己的答案,将数据上下文中的列的UpdateCheck 设置为 Never

于 2016-08-05T08:15:57.213 回答