いろいろ備忘録日記

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

ADO.NET入門記-019 (MergeとImportRowの場合のRowStateの違い)(DataTable, Merge, ImportRow, RowState)


以下、メモ書き。

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となりますので注意してください。