1

我不明白 ADO.NET 如何识别并发冲突,除非它在它的“黑匣子”内做超出我告诉它做的事情。

我在 SQL Server 2000 中的更新查询执行类似于以下示例的操作,该示例已简化;如果客户端传递给存储过程的 rowversion 与数据库中的 rowversion 不匹配,则 where 子句将失败,并且不会更新任何行:

      create proc UpdateFoo
      @rowversion timestamp OUTPUT,
      @id int,
      @foodescription varchar(255)

      as UPDATE FOO set description = @foodescription
      where id = @id and rowversion = @rowversion;

      if @@ROWCOUNT = 1
           select @rowversion from foo where id = @id;

我创建一个 SqlCommand 对象并填充参数并将命令对象分配给 SqlDataAdapter 的 UpdateCommand 属性。然后我调用数据适配器的 Update 方法。

确实应该存在并发错误,因为我故意更改数据库行以强制执行新的行版本。但是 ADO.NET 是如何知道这一点的呢?它做的不仅仅是执行命令吗?

在 SqlDataAdapter 的 RowUpdated 事件中会出现并发错误:

   MySqlDataAdapter += (sender, evt) =>
     {
       if ((evt.Status == UpdateStatus.Continue) && (evt.StatementType == StatementType.Update))
           {
                  // update succeeded
           }
           else
           { 

            // update failed, check evt.Errors
            }
      } 

ADO.NET 是否比较行版本?它在看@@rowcount 吗?

4

0 回答 0