Salin baris dari satu Datatable ke DataTable lain?


165

Bagaimana saya bisa menyalin baris tertentu dari DataTable ke Datable lain di c #? Akan ada lebih dari satu baris.

Jawaban:


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

Contoh di atas mengasumsikan bahwa dataTable1dan dataTable2memiliki jumlah, jenis, dan urutan kolom yang sama.


22
Bukankah ini menghasilkan "Baris ini sudah menjadi milik tabel lain."
McArthey

15
@ McArthey Tidak, itu tidak akan; baris baru sedang dibuat dari nilai-nilai di baris yang ada. Baris itu sendiri tidak ditambahkan ke DataTable lainnya.
Bradley Smith

20
@ DawoodAbbasi Itu hanya akan terjadi jika Anda meninggalkan ItemArraybagian di akhir ungkapan. Pastikan Anda menambahkan nilai baris, bukan baris itu sendiri.
Bradley Smith

4
@DawoodAbbasi Lihat dokumentasi MSDN untuk DataTable.Clonemetode ini: msdn.microsoft.com/en-us/library/…
Bradley Smith

10
Meskipun jawaban Anda secara teknis benar, sampel kode Anda tidak membahas asumsi Anda. Jawaban oleh @RageeshGr menangani semua asumsi dan IMHO ditulis lebih ringkas dan lebih rentan kesalahan.
chris.nesbit1

94

Salin Baris yang Ditentukan dari Tabel ke yang lain

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

Jika saya tidak lagi perlu menggunakan dttableOld setelah impor, apakah saya masih perlu menggunakan Clone ()?
Sam

Hebat dan praktis! Terima kasih!
Mayer Spitzer

1
@ Sam mengenai pertanyaan Anda, Clone akan menyalin struktur tabel, jika tabel Anda sudah tipe data yang sama, maka Anda tidak membutuhkannya.
Mayer Spitzer

19

Coba ini

    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, jadi apa alternatif yang tidak memerlukan biaya kinerja?
Sam

16

Lihat ini, Anda mungkin menyukainya (sebelumnya, silakan clone table1 ke table2):

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

Atau:

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

Ini adalah pendekatan yang jauh lebih baik karena menggunakan kemampuan bawaan untuk rentang-salin atau bahkan memilih baris dari satu DataTable ke yang lain tanpa secara iteriterasi melalui masing-masing, tidak seperti semua perulangan foreach, metode jawaban berdasarkan metode ForEach.
David Burg

15

Didukung di: 4, 3.5 SP1, Anda sekarang dapat memanggil metode pada objek.

DataTable dataTable2 = dataTable1.Copy()

2
Secara teknis ini membuat salinan datatable. Meskipun tidak secara eksplisit dinyatakan dalam pertanyaan, ada kemungkinan bahwa dataTable2 sudah ada dan memiliki baris lain di dalamnya yang kita tidak ingin kehilangan. Selain itu, pertanyaan secara khusus menyatakan "baris spesifik", sedangkan ini hanya menangani semua baris.
Matt

5

Sebagai hasil dari posting lain, ini adalah yang terpendek yang bisa saya dapatkan:

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

Yang pada dasarnya adalah pendahuluan. Juga, Anda tidak memfilter melalui suatu kondisi, seperti yang diminta oleh OP.
Eric Wu

Sekarang jika saya menghapus sourceTableakan destTablejuga jelas?
Si8

Saya ingin dapat memberikan nilai dan menghapus variabel asli tanpa membersihkan tujuan.
Si8

2

contoh di bawah ini akan menjadi cara tercepat untuk menyalin satu baris. setiap sel sedang disalin berdasarkan nama kolom. jika Anda tidak perlu sel tertentu untuk menyalin maka coba tangkapan atau tambahkan jika. jika Anda akan menyalin lebih dari 1 baris maka lilitkan kode di bawah ini.

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

dataset1.Tabel [1]. Baris [ 0 ] [i]; ubah indeks 0 ke indeks baris yang Anda tentukan atau Anda dapat menggunakan variabel jika Anda ingin mengulang atau jika itu akan logis


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

kode Anda berfungsi sempurna bagi saya, adalah kode yang sangat sederhana, terima kasih
Esraa_92

1

Bagi mereka yang ingin query SQL perintah tunggal untuk itu:

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;

Kueri ini akan menyalin data dari TABLE001ke TABLE002dan kami menganggap bahwa kedua kolom memiliki nama kolom yang berbeda.

Nama kolom dipetakan satu-ke-satu seperti:

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

Anda juga dapat menentukan di mana klausa, jika Anda memerlukan beberapa syarat.


0

Untuk menyalin seluruh data hanya lakukan ini:

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

2
pertanyaannya adalah bagaimana cara menyalin baris tertentu dari tabel data, bukan semuanya.
jtate

0

Saya telah membuat cara mudah untuk melakukan masalah ini

 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);   
 } 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.