【问题标题】:Linq-To-Sql issue with datetime?日期时间的 Linq-To-Sql 问题?
【发布时间】:2016-08-05 16:15:57
【问题描述】:

好的,我正在使用 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();

【问题讨论】:

    标签: c# linq-to-sql sql-server-express sql-server-2008-express


    【解决方案1】:

    查看此链接,

    System.Data.Linq.ChangeConflictException: Row not found or changed

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

    UpdateCheck 为从不用于该列 您的 DBML 文件

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

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

    【讨论】:

    • 你不应该觉得这是一个 hack。毕竟,每个用户都是由他/她的 ID 值标识的。为什么要关心 LastActivityDate ,它会在 WHERE 子句中经常改变?
    • 它主要用于乐观锁定。它允许我们检查对象自从我们得到它以来没有改变。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

      • 我自己没有编写由 Linq to SQL 生成的 SQL
      • 上面的一个linq to sql where子句。
      • 查看我的主帖的编辑,正如我最初所说的,我没有使用 LINQ 生成的对象生成 SQL 即时消息
      • 好的,我认为问题出在 select 语句上。如果在更新语句的并发检查 where 子句条件中,则关闭这些列的更新检查(如您的答案)切换到使用时间戳进行更新并发检查可能是最好的选择。 .
      【解决方案4】:

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

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

      【讨论】:

      • 只是补充一下,从 LINQ 返回的实际对象 - DateTime 对象实际上包含毫秒值。但是这个值没有添加到 LINQ Query 中?
      • 我相信这是 LINQ 的一个限制。你能在表中添加一个 TIMESTAMP 字段吗?
      【解决方案5】:

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

      更改 MSSQL 数据类型

      accuracy of 1 minute 可以使用时,我们使用smalldatetime 而不是datetime

      将 LINQ 更改为 SQL 数据上下文

      如果您需要高于 1 分钟的准确度,请查看 LiamB 自己对 set UpdateCheck to Never 的回答,了解数据上下文中的列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多