Sao chép các hàng từ một Datable sang DataTable khác?


165

Làm cách nào tôi có thể sao chép các hàng cụ thể từ DataTable sang một Dable khác trong c #? Sẽ có nhiều hơn một hàng.

Câu trả lời:


257
foreach (DataRow dr in dataTable1.Rows) {
    if (/* some condition */)
        dataTable2.Rows.Add(dr.ItemArray);
}

Ví dụ trên giả định rằng dataTable1dataTable2có cùng số lượng, loại và thứ tự các cột.


22
Sẽ không có kết quả này trong "Hàng này đã thuộc về một bảng khác."
McArthey

15
@McArthey Không, nó sẽ không; một hàng mới đang được tạo từ các giá trị trong hàng hiện có. Hàng này không được thêm vào DataTable khác.
Bradley Smith

20
@DawoodAbbasi Điều đó sẽ chỉ xảy ra nếu bạn bỏ qua ItemArrayphần cuối của biểu thức. Hãy chắc chắn rằng bạn đang thêm các giá trị của hàng, chứ không phải chính hàng đó.
Bradley Smith

4
@DawoodAbbasi Tham khảo tài liệu MSDN cho DataTable.Clonephương pháp: msdn.microsoft.com/en-us/l
Bradley Smith

10
Mặc dù câu trả lời của bạn về mặt kỹ thuật là chính xác, mẫu mã của bạn không giải quyết được các giả định của bạn. Câu trả lời của @RageeshGr xử lý tất cả các giả định và IMHO được viết chính xác hơn và ít bị lỗi hơn.
chris.nesbit1

94

Sao chép các hàng được chỉ định từ bảng này sang bảng khác

// here dttablenew is a new Table  and dttableOld is table Which having the data 

dttableNew  = dttableOld.Clone();  

foreach (DataRow drtableOld in dttableOld.Rows)
{
   if (/*put some Condition */)
   {
      dtTableNew.ImportRow(drtableOld);
   }
}

Nếu tôi không còn cần sử dụng dttableOld sau khi nhập, tôi vẫn cần sử dụng Clone () chứ?
Sam

Tuyệt vời và thiết thực! Cảm ơn!
Mayer Spitzer

1
@Sam liên quan đến câu hỏi của bạn, Clone là sao chép cấu trúc bảng, nếu bảng của bạn có cùng kiểu dữ liệu, thì bạn không cần nó.
Mayer Spitzer

19

Thử cái này

    String matchString="ID0001"//assuming we have to find rows having key=ID0001
    DataTable dtTarget = new DataTable();
    dtTarget = dtSource.Clone();
    DataRow[] rowsToCopy;
    rowsToCopy = dtSource.Select("key='" + matchString + "'");
    foreach (DataRow temp in rowsToCopy)
    {
        dtTarget.ImportRow(temp);
    }

@ManojSavalia, vậy đâu là giải pháp thay thế không tốn chi phí?
Sam

16

Hãy xem cái này, bạn có thể thích nó (trước đây, làm ơn, sao chép bảng1 vào bảng2):

table1.AsEnumerable().Take(recodCount).CopyToDataTable(table2,LoadOption.OverwriteChanges);

Hoặc là:

table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);

Đây là một cách tiếp cận tốt hơn nhiều vì nó sử dụng khả năng tích hợp để sao chép phạm vi hoặc thậm chí chọn các hàng từ DataTable này sang DataTable khác mà không lặp lại rõ ràng qua từng cái, không giống như tất cả các câu trả lời dựa trên vòng lặp foreach.
David Burg

15

Được hỗ trợ trong: 4, 3.5 SP1, bây giờ bạn có thể chỉ cần gọi một phương thức trên đối tượng.

DataTable dataTable2 = dataTable1.Copy()

2
Về mặt kỹ thuật, điều này tạo ra một bản sao của một dữ liệu. Mặc dù không được nêu rõ ràng trong câu hỏi, có thể dataTable2 đã tồn tại và có các hàng khác trong đó mà chúng tôi không muốn mất. Ngoài ra, câu hỏi nêu cụ thể "các hàng cụ thể", trong khi câu hỏi này chỉ xử lý tất cả các hàng.
Matt

5

Kết quả của các bài đăng khác, đây là bài viết ngắn nhất tôi có thể nhận được:

DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));

Mà về cơ bản là một foreach. Ngoài ra, bạn không lọc qua một điều kiện, theo yêu cầu của OP.
Eric Wu

Bây giờ nếu tôi xóa hết thì sourceTablecũng sẽ destTablerõ?
Si8

Tôi muốn có thể gán giá trị và xóa biến ban đầu mà không xóa đích.
Si8

2

mẫu dưới đây sẽ là cách nhanh nhất để sao chép một hàng. mỗi ô đang được sao chép dựa trên tên cột. trong trường hợp bạn không cần một ô cụ thể để sao chép thì hãy thử hoặc thêm nếu. nếu bạn định sao chép nhiều hơn 1 hàng thì lặp mã bên dưới.

DataRow dr = dataset1.Tables[0].NewRow();
for (int i = 0; i < dataset1.Tables[1].Columns.Count; i++)
{
    dr[dataset1.Tables[1].Columns[i].ColumnName] = dataset1.Tables[1].Rows[0][i];
}

datasetReport.Tables[0].Rows.Add(dr);

tập dữ liệu1.Tables [1] .Rows [ 0 ] [i]; thay đổi chỉ số 0 thành chỉ mục hàng được chỉ định của bạn hoặc bạn có thể sử dụng một biến nếu vòng lặp của bạn hoặc nếu nó sẽ hợp lý


1
 private void CopyDataTable(DataTable table){
     // Create an object variable for the copy.
     DataTable copyDataTable;
     copyDataTable = table.Copy();
     // Insert code to work with the copy.
 }

mã của bạn hoạt động hoàn hảo với tôi, là một mã rất đơn giản, cảm ơn
Esraa_92

1

Đối với những người muốn truy vấn SQL lệnh đơn cho điều đó:

INSERT INTO TABLE002 
(COL001_MEM_ID, COL002_MEM_NAME, COL002_MEM_ADD, COL002_CREATE_USER_C, COL002_CREATE_S)
SELECT COL001_MEM_ID, COL001_MEM_NAME, COL001_MEM_ADD, COL001_CREATE_USER_C, COL001_CREATE_S
FROM TABLE001;

Truy vấn này sẽ sao chép dữ liệu từ TABLE001đến TABLE002và chúng tôi giả sử rằng cả hai cột có tên cột khác nhau.

Tên cột được ánh xạ một-một như:

COL001_MEM_ID -> COL001_MEM_ID

COL001_MEM_NAME -> COL002_MEM_NAME

COL001_MEM_ADD -> COL002_MEM_ADD

COL001_CREATE_USER_C -> COL002_CREATE_USER_C

COL002_CREATE_S -> COL002_CREATE_S

Bạn cũng có thể chỉ định mệnh đề where, nếu bạn cần một số điều kiện.


0

Để sao chép toàn bộ dữ liệu chỉ cần làm điều này:

DataGridView sourceGrid = this.dataGridView1;
DataGridView targetGrid = this.dataGridView2;
targetGrid.DataSource = sourceGrid.DataSource;

2
câu hỏi là làm thế nào để sao chép các hàng cụ thể từ một bảng dữ liệu, chứ không phải toàn bộ.
jtate

0

Tôi đã tạo ra một cách dễ dàng để làm vấn đề này

 DataTable newTable = oldtable.Clone();    
 for (int i = 0; i < oldtable.Rows.Count; i++)
 {
   DataRow drNew = newTable.NewRow();    
   drNew.ItemArray = oldtable.Rows[i].ItemArray;    
   newTable.Rows.Add(drNew);   
 } 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.