[ASP.NET]合併兩張DataTable資料

[ASP.NET]合併兩張DataTable資料

有時我們會有多個結構一樣但來源不同的資料,需要顯示在一個Grid裡面,這時我們就能用DataTable的Merge() 函數來實現,以我實務遇到的情況,大概就是一個DataTable資料來源為某個XML檔,而另外一個來源為DB(當然如果都是存在於DB,就可以直接用Join的方式來實現),以下就示範這兩種資料來源怎麼合併:

 

XML來源:


/// 模擬XML資料
/// </summary>
/// <returns></returns>
private DataTable GetDataTableXml()
{
    string Xmlstring = @"<Datas>
<Data>
<ID>5</ID>
<來源>XML</來源>
</Data>
<Data>
<ID>6</ID>
<來源>XML</來源>
</Data>
<Data>
<ID>7</ID>
<來源>XML</來源>
</Data>
<Data>
<ID>8</ID>
<來源>XML</來源>
</Data>
</Datas>";
    XmlDocument Xmldoc = new XmlDocument();
    Xmldoc.LoadXml(Xmlstring);
    XmlReader Xmlreader = XmlReader.Create(new System.IO.StringReader(Xmldoc.OuterXml));
    DataSet ds = new DataSet();
    ds.ReadXml(Xmlreader);
    DataTable dt = ds.Tables[0];
    return dt;

}

image

 

SQL來源


/// 模擬SQL來源,建立假資料
/// </summary>
/// <returns></returns>
private DataTable GetDataTable()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ID");
    dt.Columns.Add("來源");

    for (int i = 0; i < 6; i++)
    {
        DataRow dr = dt.NewRow();
        dr["ID"] = i;
        dr["來源"] = "SQL Server";
        dt.Rows.Add(dr);
    }

    return dt;
}

image

 

 

 

 

Merge使用方法


gv_sql.DataSource = dt1;
gv_sql.DataBind();


dt2 = GetDataTableXml();
gv_xml.DataSource = dt2;
gv_xml.DataBind();

//如果不設Key的話,即使ID重複也會顯示兩筆
dt1.PrimaryKey = new DataColumn[] { dt1.Columns["ID"] };
dt2.PrimaryKey = new DataColumn[] { dt2.Columns["ID"] };

//如果有設Key,設true則保留dt1的資料;設false則保留dt2的資料
dt1.Merge(dt2, true);

gv_merge.DataSource = dt1;
gv_merge.DataBind();

Merge有幾個多載,我故意將兩個資料來源都存在ID為 5 的資料,如果不設Key則就會顯示兩筆ID為5的資料,如設定為true則會保留主表的資料(dt1),false則反之。

 

結果:

image

 

--

Reference
http://msdn.microsoft.com/zh-tw/library/system.data.datatable.merge.aspx
http://haoxiaoittoo.blogspot.tw/2011/07/datatable.html