atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

DataTableでのロールバックを手軽に実装する

DataTableは、ただのデータの入れ物ではない。CLRのメモリ上でDBのトランザクションCRUDやコミット/ロールバックなど)と同様の処理を実装するための、各種メソッドが提供されている*1

ロールバックを実装するための方法も提供されている。しかしその仕様は複雑で、非接続型データアクセスの全容を知らずには使いこなすことができないように思われる*2

そこで、手軽にロールバックを実装する方法を考えた。その方法とは以下のとおりである。

  1. <オリジナルDataTable>.Copy()とし、テンポラリDataTableを作成する
  2. 後にロールバックするかもしれない全ての変更操作は、テンポラリDataTableに対し行う
  3. ロールバックするには、テンポラリDataTableを破棄する
  4. コミットするには、オリジナルDataTableに対し以下の手順を行う
    1. <オリジナルDataTable>.Clear()
    2. <オリジナルDataTable>.Merge(<テンポラリDataTable>)

DataTableのAcceptChangesRejectChangesなどの使い方を覚えるのも良いが、Copy→Clear→Mergeの方がシンプルで使いやすいのではないか。

*1:正確にはDataTableだけで実現されているのではなく、非接続型データアクセスコンポーネント群で実現されている

*2:私も使いこなすことができていない