2013-06-04 42 views
6

Tôi có một vài DataTable và tôi cần sao chép chúng vào một DataTable khác. Ví dụ, như bạn có thể thấy trong ảnh đính kèm, tôi cần lấy tất cả dữ liệu từ Bảng nguồn 1 và sao chép nó trong 2 cột đầu tiên của Bảng đích, sao chép Bảng nguồn 2 trong 2 cột tiếp theo, v.v. . Làm thế nào điều này có thể dễ dàng đạt được?Sao chép dữ liệu dưới dạng cột trong một dữ liệu khác

enter image description here

Edit: tôi phải đọc nhiều file excel (Tôi đang lưu trữ mỗi tập tin trong một DataTable) và tôi sẽ không biết chính xác có bao nhiêu bảng nguồn tôi sẽ có, vì vậy đây có phải là thực hiện động bằng cách nào đó.

+0

Tại sao không chỉ lặp qua các hàng trong bảng nguồn và cho mỗi hàng, hãy thêm các cột thích hợp vào bảng mục tiêu thích hợp? Các hàng và các cột (trong mỗi hàng) có thể được lặp lại. Nó sẽ là tầm thường để tạo ra một Map of Functions từ SourceTable/row-> TargetTable/row. – user2246674

Trả lời

6

Giả sử rằng bảng nguồn của bạn có cấu trúc tương tự như bạn có thể sử dụng Table.Copy() để tạo ra bảng đích của bạn và sau đó sao chép dữ liệu trong vòng lặp:

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

Lý do xuống hạng? – Alex

0

Bạn có thể bắn các truy vấn như:

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 

Hoặc, có thể làm theo kỹ thuật nêu trên here.

Trong trường hợp hàng dữ liệu, nó có thể là:

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

Hoạt động tuyệt vời .. trong SQL. Hoạt động trong DataTables? (DataTables không * cần * để đến từ SQL.) – user2246674

1

Bạn có thể sử dụng phương pháp Hợp nhất được cung cấp theo khung, để biết cách sử dụng và thông tin bổ sung, xem Microsoft Datatable Merge

1

Bạn nên tìm mối quan hệ b giữa bảng nguồn đó. Ví dụ, họ có id giống nhau, bạn có thể sao chép chúng như thế này

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

Trước tiên, bạn có thể tạo các bảng điểm đến, thêm đó là cột (bằng cách tổng hợp số lượng cột trong tất cả các bảng đầu vào) và sau đó thêm nó các hàng bằng cách ghép các mảng riêng lẻ của các giá trị cho mỗi hàng trong các bảng đầu vào.

Tất nhiên, các hàng trong kết quả DataTable sẽ chứa các giá trị khi chúng xuất hiện theo hướng từ trên xuống cho mỗi bảng đầu vào (căn chỉnh trên đầu). Nó cũng có nghĩa là số hàng kết quả là số hàng trong bảng đầu vào lớn nhất.

Đầu tiên chúng tôi sẽ khởi tạo và cư một biến List<DataTable>, sau đó chúng tôi sẽ thực hiện việc tham gia, sử dụng biến này như một tham số phương pháp:

#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); 

Hãy tạo GetJoinedTable phương pháp đó sẽ trở lại vào biến result bảng kết quả được kết hợp:

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; 
} 

Bạn cũng sẽ cần thêm phương thức sau, trả về giá trị cột mặc định thích hợp, dựa trên thuộc tính DataType của cột:

object GetDefault(Type t) 
{ 
    if (t.IsValueType) 
    { 
     return Activator.CreateInstance(t); 
    } 
    else 
    { 
     return null; 
    } 
} 
Các vấn đề liên quan