1

ADO.NETが「ブラックボックス」内で、私が指示している以上のことを実行していない限り、同時実行違反をどのように認識するのかわかりません。

SQL Server 2000での更新クエリは、次の例のように簡略化されています。クライアントによってストアドプロシージャに渡されたrowversionがデータベースのrowversionと一致しない場合、where-clauseは失敗し、行は更新されません。

      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