首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

C# DataSet.Merge 合併兩個 DataSet 資料內容

     編輯:ASP.NET 基礎

當需要將兩個 `DataSet` 的資料表合併為一個時,可使用 `DataSet.Merge()` 方法。本文示範從資料庫查詢兩張表(`DictionaryType`、`DictionaryItem`),分別填入不同 `DataSet`,再合併並繫結至 `GridView` 的完整流程。

前端頁面


<asp:GridView ID="GridView1" runat="server" 
    CellPadding="4" ForeColor="#333333" GridLines="None">
    <RowStyle BackColor="#EFF3FB" />
    <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
    <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
    <EditRowStyle BackColor="#2461BF" />
    <AlternatingRowStyle BackColor="White" />
</asp:GridView>

後端程式碼


using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataSet dsSource = new DataSet(); // 來源 DataSet
        DataSet dsTarget = new DataSet(); // 目標 DataSet

        string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;

        using (SqlConnection con = new SqlConnection(conStr))
        {
            // 1. 查詢字典類型 -> 填入 dsSource
            SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM DictionaryType", con);
            sda.Fill(dsSource, "DictionaryType");

            // 2. 查詢字典項目 -> 填入 dsTarget
            sda = new SqlDataAdapter("SELECT * FROM DictionaryItem", con);
            sda.Fill(dsTarget, "DictionaryItem");
        }

        // 3. 合併:將 dsSource 的表複製/合併到 dsTarget
        // 若 dsTarget 已有同名表,依 PrimaryKey 比對合併資料列;否則直接加入新表
        dsTarget.Merge(dsSource);

        // 4. 繫結合併後的 DictionaryType 表
        GridView1.DataSource = dsTarget.Tables["DictionaryType"];
        GridView1.DataBind();
    }
}

Merge 關鍵行為說明

情境行為
目標 DataSet **無**同名表直接將來源表加入目標 DataSet(含結構描述、資料列、條件約束)
目標 DataSet **有**同名表且**有 PrimaryKey**依 PrimaryKey 比對:
• 來源有、目標無 → 新增
• 兩邊都有 → 更新目標資料列(保留目標 RowState)
• 目標有、來源無 → 保留目標
目標 DataSet 有同名表但**無 PrimaryKey****直接追加**來源資料列(不比對),可能產生重複列
Schema 不同(欄位數/型別差異)預設拋出例外。可用 `Merge(dsSource, false, MissingSchemaAction.AddWithKey)` 容忍差異並加入缺失欄位

常見參數多載


// 基本
dsTarget.Merge(dsSource);

// 保留目標 DataSet 現有 RowState(預設 true),false 會重設為 Unchanged
dsTarget.Merge(dsSource, preserveChanges: true);

// 處理缺失 Schema:AddWithKey = 加入缺失欄位並嘗試設 PrimaryKey
dsTarget.Merge(dsSource, true, MissingSchemaAction.AddWithKey);

適用場景

  • 多來源資料整合(如多資料庫、快取+即時查詢)
  • 離線編輯後同步回主 DataSet
  • 主從表關聯查詢分別執行,最後合併呈現

注意事項

  1. **PrimaryKey 至關重要**:合併前確保 `DataTable.PrimaryKey` 已正確設定(`Fill` 不會自動設定,需手動指定或從資料庫 Schema 取得)。
  2. **大小寫敏感**:`DataSet.CaseSensitive` 預設 false,表名、欄位名比對不區分大小寫。
  3. **效能**:大量資料合併較慢,考慮直接在 SQL 端 `JOIN` 或 `UNION ALL` 完成。
  4. **條件約束**:合併會複製 `UniqueConstraint`、`ForeignKeyConstraint`,可能導致後續操作受限。

總結

`DataSet.Merge()` 是 ADO.NET 內建的強大合併工具,配合正確的 `PrimaryKey` 設定,能高效完成多 `DataSet`/`DataTable` 的資料整合。範例展示最基礎用法:兩個獨立查詢結果合併後繫結顯示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved