2013-06-04 68 views
6

我有幾個DataTable,我需要將它們複製到另一個DataTable中。例如,您可以在附圖中看到,我需要從源表1中獲取所有數據,並將其複製到Dest Table的前2列中,將Source Table 2複製到接下來的2列中,依此類推。這如何輕鬆實現?將數據表複製爲另一個數據表中的列

enter image description here

編輯:我要讀幾個Excel文件(我存儲在數據表中的每個文件),我不知道我究竟源有多少表都會有,所以這是以某種方式動態完成。

+0

爲什麼不循環遍歷源表中的行和每行,將相應的列添加到適當的目標表中?行和列(每行)都可以迭代。從SourceTable/row-> TargetTable/row創建函數映射將是微不足道的。 – user2246674

回答

6

假設源表中有你可以使用Table.Copy()創建您的目標表相同的結構,然後在循環複製數據:

List<DataTable> sourceTables = getYourSourceTablesMethod(); 
if (sourceTables.Length>0) 
{ 
    DataTable destTable = sourceTables[0].Copy(); 

    for (int i = 1; i < sourceTables; i++) 
    { 
     foreach (DataRow drow in sourceTables[i].Rows) 
     destTable.Rows.Add(drow.ItemArray); 
    } 
} 
+1

downvoting的原因是什麼? – Alex

0

您可以火象查詢:

select col1,col2 into sourcetable1 from destTable 
union 
select col3,col4 into sourcetable2 from destTable 
union 
select col5,col6 into sourcetable3 from destTable 
union 
select col7,col8 into sourcetable4 from destTable 

或者,可以在一段here提到的技術。

在數據行的情況下,也可以是:

foreach (DataRow row in DestTable) 
{ 
    SourceTable1.ImportRow(row); 
} 
+0

在SQL中很好用..適用於DataTables? (DataTables不需要*來自SQL。) – user2246674

1

您應該找到關係b在源表中。例如,它們具有相同的ID,你可以複製他們這樣

insert into destTable( 
select s1.col1, s1.col2, s2.col3, s2.col4, s3.col5, s3.col6, s4.col7, s4.col8 
from sourcetable1 s1, sourcetable2 s2, sourcetable3 s3, sourcetable4 s4 
where s1.id = s2.id and s2.id = s3.id and s3.id = s4.id) 
0

您可以先創建目標表,添加它的列(通過總結所有輸入表中的列數),然後添加它的通過連接輸入表中每一行的各個值的數組來獲得行。

當然,生成的DataTable中的行將包含每個輸入表格(在頂部對齊)中從上到下方向顯示的值。這也意味着結果行數是最大輸入表中的行數。

首先,我們將初始化並填充List<DataTable>變量,那麼我們將執行連接,使用這個變量作爲方法參數:

#region table collection initialization 
List<DataTable> dts = new List<DataTable>(); 
var dt = new DataTable(); 
dt.Columns.Add("Test0", typeof(string)); 
dt.Rows.Add(1); 
dt.Rows.Add(2); 
dts.Add(dt); 

dt = new DataTable(); 
dt.Columns.Add("Test1", typeof(int)); 
dt.Rows.Add(2); 
dts.Add(dt); 

dt = new DataTable(); 
dt.Columns.Add("Test3", typeof(int)); 
dt.Columns.Add("Test4"); 
dt.Columns.Add("Test5", typeof(int)); 
dt.Rows.Add(3, "a", 1); 
dt.Rows.Add(4); 
dt.Rows.Add(5, "a"); 
dt.Rows.Add(null, "a"); 
dts.Add(dt); 

dt = new DataTable(); 
dt.Columns.Add("Test6", typeof(DateTime)); 
dt.Columns.Add("Test7", typeof(int)); 
dt.Rows.Add(DateTime.Now); 
dts.Add(dt); 
#endregion 

// sample method usage 
var result = GetJoinedTable(dts); 

,讓我們創建GetJoinedTable方法將返回到result變量所產生的連接表:

private DataTable GetJoinedTable(List<DataTable> dts) 
{ 
    var dest = new DataTable(); 

    //will be used if you have non-unique column names 
    int counter = 0; 

    foreach (var column in dts 
     .SelectMany<DataTable, DataColumn>(t => 
      t.Columns.Cast<DataColumn>())) 
    { 
     dest.Columns.Add(column.ColumnName, column.DataType); 

     // if you have non-unique column names use the following instead 
     //dest.Columns.Add(String.Format("column_{0}", counter++), 
     // column.DataType); 
    } 

    List<object> rowItems; 

    for (int i = 0; i < dts.Max(t => t.Rows.Count); i++) 
    { 
     rowItems = new List<object>(); 
     for (int j = 0; j < dts.Count; j++) 
     { 
      if (dts[j].Rows.Count > i) 
      { 
       var r = dts[j].Rows[i].ItemArray 
        .Select((v, index) => 
         (v == null || v == System.DBNull.Value) 
          ? GetDefault(dts[j].Columns[index].DataType) : v); 
       rowItems.AddRange(r); 
      } 
      else 
      { 
       for (int c = 0; c < dts[j].Columns.Count; c++) 
       { 
        rowItems.Add(GetDefault(dts[j].Columns[c].DataType)); 
       } 
      } 
     } 
     dest.Rows.Add(rowItems.ToArray()); 
    } 

    return dest; 
} 

您還需要添加下面的方法,它返回適當的默認列值,基於列的DataType屬性:

object GetDefault(Type t) 
{ 
    if (t.IsValueType) 
    { 
     return Activator.CreateInstance(t); 
    } 
    else 
    { 
     return null; 
    } 
} 
相關問題