いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

同じデータテーブル間で行データを移行する方法 (DataTable, DataRow, AcceptChanges, LoadDataRow, ItemArray)

以下のような状況があるとします。

”あるデータテーブルAとデータテーブルBが存在しており、この2つのデータテーブルはどちらも同じ型である。
その際、テーブルAからテーブルBへ特定の条件にマッチした行データ(DataRow)を移行したい。”


つまり、以下のような状態となります。

XXXXDataTable tableA = new XXXXDataTable();
XXXXDataTable tableB = new XXXXDataTable();

tableA.AddXXXRow(xx, xx, xx);
tableA.AddXXXRow(xx, xx, xx);
tableA.AddXXXRow(xx, xx, xx);
tableA.AcceptChanages();

この状態から、tableBへ特定の行データを移行しようとする場合、そのまま書くと、

tableB.Rows.Add(tableA.Rows[0]);

のようにしたくなりますが、これはうまくいきません。
何故なら、行データは自分自身の状態(DataRowState)と自分が所属しているテーブルを認識しているからです。
上の例だと、tableBに追加してもrowAはまだtableAに所属しているためエラーとなります。
(行データは一度に一つのテーブルにしか所属できません。)
なお、一旦作成された行データの所属テーブルを変更することは出来ません。
(DataRow.Tableプロパティはreadonlyとなっています。)


では、どのようにするかというと、以下のようにします。
DataRowクラスはItemArrayというプロパティを持っています。
このメソッドをコールするとその行データに含まれている全列のデータが配列で返却されます。
それを、tableBへロードするという過程になります。
以下のようになります。

tableB.LoadDataRow(tableA.Rows[0].ItemArray, true);

これで、うまく行データが移行できます。
LoadDataRowメソッドの2番目の引数は、ロード対象のデータに対してロード後、変更処理を確定させるかどうかを指定します。
Trueを指定してメソッドを使用すると、ロードされた行データの状態はUnchanged(変更無し)としてマークされます。
逆にFalseを指定してメソッドを使用すると、ロードされた行データの状態は、Added(追加)としてマークされます。