當需要將兩個 `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();
}
}
| 情境 | 行為 |
|---|---|
| 目標 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.Merge()` 是 ADO.NET 內建的強大合併工具,配合正確的 `PrimaryKey` 設定,能高效完成多 `DataSet`/`DataTable` 的資料整合。範例展示最基礎用法:兩個獨立查詢結果合併後繫結顯示。