以下、メモ書き。
DataTable, DataSetには、別のDataTable, DataSetのデータを取り込めるMergeメソッドがあります。
その際、元のテーブルにあった行のRowStateはどうなるかというと、そのまま引き継がれます。
つまり、元がAddedの場合はAddedで、Deletedの場合はDeletedでマージされます。
以下、サンプルです。
using System; using System.Data; using System.Data.Common; namespace Gsf.Demo{ public class DTSample{ public void Execute(){ DataTable t1 = new DataTable("T1"); DataTable t2 = new DataTable("T2"); t1.Columns.Add("ID"); t2.Columns.Add("ID"); DataRow r1 = t1.NewRow(); r1[0] = "100"; t1.Rows.Add(r1); t1.AcceptChanges(); Console.WriteLine("0_1:t1:{0}, t2:{1}", t1.Rows.Count, t2.Rows.Count); Console.WriteLine("0_2:r1:{0}", r1.RowState); // // T2にT1をマージ. // t2.Merge(t1); // // マージ後に、T1の行に削除マークを付ける。 // r1.Delete(); // // 結果確認. // Console.WriteLine("0_3:t1:{0}, t2:{1}", t1.Rows.Count, t2.Rows.Count); Console.WriteLine("0_4:r1:{0}, t2_r1:{1}", r1.RowState, t2.Rows[0].RowState); t1.Clear(); t2.Clear(); r1 = t1.NewRow(); r1[0] = "101"; t1.Rows.Add(r1); t1.AcceptChanges(); // // 先に削除マークを付ける. // r1.Delete(); // // その後、マージ. // t2.Merge(t1); // // 結果確認. // Console.WriteLine("0_3:t1:{0}, t2:{1}", t1.Rows.Count, t2.Rows.Count); Console.WriteLine("0_4:r1:{0}, t2_r1:{1}", r1.RowState, t2.Rows[0].RowState); t1.AcceptChanges(); t2.AcceptChanges(); Console.WriteLine("0_1:t1:{0}, t2:{1}", t1.Rows.Count, t2.Rows.Count); } static void Main(){ new DTSample().Execute(); } } }
実行すると、以下のようになります。先に削除した後で、マージすると
マージ先のテーブルにもDeletedで行が取り込まれています。
0_1:t1:1, t2:0 0_2:r1:Unchanged 0_3:t1:1, t2:1 0_4:r1:Deleted, t2_r1:Unchanged 0_3:t1:1, t2:1 0_4:r1:Deleted, t2_r1:Deleted 0_1:t1:0, t2:0
ちなみに、ImportRowメソッドを利用した場合、Mergeメソッドとは違い
行がインポートされた後、その行の状態はAddedとなりますので注意してください。