星期三, 9月 03, 2025

[ADO.NET] Merge

發現 Code 有使用上 DataTable.Merge,來了解如何使用它,該筆記只記錄 Merge(DataTable) 用法

該範例重點為 DataTable 是否有設定 Primary Key,完整 Code 如下
namespace MergePractice
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DataTable originPK = GetDataTable(true);
            DataTable modifiedPK = GetDataTable(true);

            modifiedPK.Rows[0]["item"] = "更新資料";

            DataRow row = modifiedPK.NewRow();
            row["id"] = 14;
            row["item"] = "新增欄位";
            modifiedPK.Rows.Add(row);

            originPK.Merge(modifiedPK);

            PrintValues(originPK, "有 PK 狀態");

            DataTable origin = GetDataTable(false);
            DataTable modified = GetDataTable(false);
            origin.Merge(modified);

            PrintValues(origin, "無 PK 狀態");
        }

        private static DataTable GetDataTable(bool includePrimaryKey)
        {
            DataTable dt = new DataTable("Items");

            DataColumn idColumn = new DataColumn("id", typeof(int));
            DataColumn itemColumn = new DataColumn("item", typeof(string));
            dt.Columns.Add(idColumn);
            dt.Columns.Add(itemColumn);

            if (includePrimaryKey)
                dt.PrimaryKey = new DataColumn[] { idColumn };

            DataRow row;
            for (int i = 0; i <= 5; i++)
            {
                row = dt.NewRow();
                row["id"] = i;
                row["item"] = i.ToString();
                dt.Rows.Add(row);
            }

            dt.AcceptChanges();
            return dt;
        }

        private static void PrintValues(DataTable table, string label)
        {
            Console.WriteLine(label);

            foreach (DataRow row in table.Rows)
            {
                string rowMessage = row.RowState.ToString().PadLeft(10, ' ');

                foreach (DataColumn col in table.Columns)
                {
                    rowMessage += "\t " + row[col].ToString();
                }

                Console.WriteLine(rowMessage);
            }
        }
    }
}

有 PK 狀態下,相同 ID 資料可以進行更新和新增
沒有 PK 狀態就兩個 DataTable 合併在一起

沒有留言:

張貼留言