[轉貼] 合併兩張DataTable資料

2018070810:36
出處:http://www.dotblogs.com.tw/kyleshen/archive/2013/10/22/125028.aspx

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

XML來源:

01 /// <summary>
02 /// 模擬XML資料
03 /// </summary>
04 /// <returns></returns>
05 private DataTable GetDataTableXml()
06 {
07     string Xmlstring = @"<Datas>
08 <Data>
09 <ID>5</ID>
10 <來源>XML</來源>
11 </Data>
12 <Data>
13 <ID>6</ID>
14 <來源>XML</來源>
15 </Data>
16 <Data>
17 <ID>7</ID>
18 <來源>XML</來源>
19 </Data>
20 <Data>
21 <ID>8</ID>
22 <來源>XML</來源>
23 </Data>
24 </Datas>";
25     XmlDocument Xmldoc = new XmlDocument();
26     Xmldoc.LoadXml(Xmlstring);
27     XmlReader Xmlreader = XmlReader.Create(new System.IO.StringReader(Xmldoc.OuterXml));
28     DataSet ds = new DataSet();
29     ds.ReadXml(Xmlreader);
30     DataTable dt = ds.Tables[0];
31     return dt;
32  
33 }

image

SQL來源

01 /// <summary>
02 /// 模擬SQL來源,建立假資料
03 /// </summary>
04 /// <returns></returns>
05 private DataTable GetDataTable()
06 {
07     DataTable dt = new DataTable();
08     dt.Columns.Add("ID");
09     dt.Columns.Add("來源");
10  
11     for (int i = 0; i < 6; i++)
12     {
13         DataRow dr = dt.NewRow();
14         dr["ID"] = i;
15         dr["來源"] = "SQL Server";
16         dt.Rows.Add(dr);
17     }
18  
19     return dt;
20 }

image

 

 

Merge使用方法

01 dt1 = GetDataTable();
02 gv_sql.DataSource = dt1;
03 gv_sql.DataBind();
04  
05  
06 dt2 = GetDataTableXml();
07 gv_xml.DataSource = dt2;
08 gv_xml.DataBind();
09  
10 //如果不設Key的話,即使ID重複也會顯示兩筆
11 dt1.PrimaryKey = new DataColumn[] { dt1.Columns["ID"] };
12 dt2.PrimaryKey = new DataColumn[] { dt2.Columns["ID"] };
13  
14 //如果有設Key,設true則保留dt1的資料;設false則保留dt2的資料
15 dt1.Merge(dt2, true);
16  
17 gv_merge.DataSource = dt1;
18 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