none
DBトランザクションロールバック時、DataRow.RowStateもロールバックさせたい RRS feed

  • 質問

  • 次の様なコーディングの場合、(C)のComplete()メソッドまでたどり着けば何の問題もないのですが、

    何かエラーが発生して(B)でreturnし、(C)のComplete()メソッドまでたどり着かなかった場合、

    Complete()メソッドが処理されないままusingステートメントブロックを抜ける事になるので、

    (A)のUpdate()メソッドによるデータベースに対する更新処理はロールバックされる。

     

    この時、(A)のUpdate()メソッドによって、DataSet.MYTABLE[0].RowStateは、

    「Modified」->「Unchanged」になったまま。

     

     DataSet.MYTABLE[0].SetModified();
     TransactionScope transaction = new TransactionScope();
     using (transaction)
     {
        TableAdapter.Update(DataSet.MYTABLE);    // (A)
        if (NanikaErrorHassei)     // NanikaErrorHassei : bool型
        {
            return;    // (B)
        }
        transaction.Complete();    // (C)
     }


    そこで、本題なのですが、Update()メソッドによって、「Unchanged」になったRowStateは

    どの様に元にもどすのでしょうか?

    自力で戻すしかないのでしょうか?

     

    宜しくお願い致します。

     

    2007年8月30日 0:26

すべての返信

  • RowStateを戻すという考えとは違いますが、DataSet.MYTABLEのコピーを(A)に渡すようにして、
    (C)のあとで、DataSet.MYTABLE.AcceptChangesメソッドを呼び出してみてはいかがですか。

    [編集]
    間違い修正。
    2007年8月30日 1:07
  •  ぶるーの さんからの引用

    そこで、本題なのですが、Update()メソッドによって、「Unchanged」になったRowStateは

    どの様に元にもどすのでしょうか?

    自力で戻すしかないのでしょうか?

     

    元にもどすよりは、以下のようにしてみてはいかがでしょうか?

     

    1.GetChangesメソッドで変更行だけを含んだDataSetを作成し、それに対してUpdateを行います。

     

    RollBackしなければ以下を続けて実行します。

     

    2.上のDataSetを元のDataSetにMergeします。

     

    3.元のDataSetに対してAcceptChangesを実行します。

    2007年8月30日 5:05
    モデレータ