[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;
}
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;
}
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則反之。
結果:
--
Reference
http://msdn.microsoft.com/zh-tw/library/system.data.datatable.merge.aspx
http://haoxiaoittoo.blogspot.tw/2011/07/datatable.html