Javaと情熱のあいだ

カステラとドーナツと珈琲

C#のDataTableで変更した行を取得する。

DataTableで追加、削除、変更などが有る行を取得する。
動作としては元のオブジェクトへの参照ではなくコピーとしてDataTableが作成される。
使用の際は事前にSystem.Data.DataTable.AcceptChanges()を実行する。
GetChanges()だけを実行すると追加、削除も取得されるのでDataRowStateを指定する。

サンプル
DataTable changedRecordsTable = dataTable1.GetChanges(DataRowState.Modified);
DataRowStateの列挙体
メンバー名 説明
Added 行が DataRowCollection に追加されましたが、AcceptChanges が呼び出されていません。
Deleted DataRow の Delete メソッドを使用して行が削除されました。
Detached 行は作成されましたが、DataRowCollection の一部ではありません。 DataRow は、作成された直後からコレクションに追加されるまでの間、またはコレクションから削除された場合に、この状態になります。*1
Modified 行が変更されましたが、AcceptChanges が呼び出されていません。
Unchanged 行は AcceptChanges が最後に呼び出されてから変更されていません。
.netのコメントに書いてある概要を参考に動作を確認
//
// 概要:
//     前回 System.Data.DataTable を読み取るか、System.Data.DataTable.AcceptChanges() を呼び出した以降にこのデータセットに対して行われたすべての変更が格納されているこのデータセットのコピーを取得します。
//
// 戻り値:
//     この System.Data.DataTable からの変更のコピー。変更がない場合は null。
public DataTable GetChanges();
//
// 概要:
//     前回 System.Data.DataTable を読み取るか、System.Data.DataTable.AcceptChanges() を呼び出した以降にこのデータセットに対して行われたすべての変更が格納されているこのデータセットのコピーを、System.Data.DataRowState
//     によってフィルター処理した後で取得します。
//
// パラメーター:
//   rowStates:
//     System.Data.DataRowState 値のいずれか。
//
// 戻り値:
//     アクションを実行した後、System.Data.DataSet.Merge(System.Data.DataSet) を使用して元の System.Data.DataTable
//     にマージするために使用できる、System.Data.DataTable のフィルター処理後のコピー。必要な System.Data.DataRowState
//     の行が見つからない場合、このメソッドは null を返します。
public DataTable GetChanges(DataRowState rowStates);

*1:何のこと言ってるのか理解できないのは自分の力不足なんでしょう...orz