Satırları bir Datatable'dan başka bir DataTable'a kopyalansın mı?


165

DataTable'dan belirli satırları c # içindeki başka bir Datable'a nasıl kopyalayabilirim? Birden fazla satır olacak.

Yanıtlar:


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

Yukarıdaki örnekte, varsayar dataTable1ve dataTable2sütunlar aynı sayıda türü ve usulleri vardır.


22
Bu, "Bu satır zaten başka bir tabloya ait" ile sonuçlanmaz.
McArthey

15
@McArthey Hayır, olmaz; mevcut satırdaki değerlerden yeni bir satır oluşturuluyor. Satırın kendisi diğer DataTable'a eklenmiyor.
Bradley Smith

20
@DawoodAbbasi Bu, yalnızca ItemArrayifadenin sonundaki parçayı dışarıda bırakırsanız olur . Satırın kendisini değil, satırın değerlerini eklediğinizden emin olun.
Bradley Smith

4
@DawoodAbbasi Yöntem için MSDN belgelerine bakınDataTable.Clone : msdn.microsoft.com/en-us/library/…
Bradley Smith

10
Yanıtınız teknik olarak doğru olsa da, kod örneğiniz varsayımlarınızı ele almaz. @RageeshGr tarafından verilen cevap tüm varsayımları ele alır ve IMHO daha kısaca yazılır ve daha az hataya eğilimlidir.
chris.nesbit1

94

Belirtilen Satırları Tablodan diğerine kopyala

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

İçe aktarımdan sonra artık dttableOld kullanmam gerekmiyorsa, yine de Clone () kullanmam gerekir mi?
Sam

Harika ve pratik! Teşekkürler!
Mayer Spitzer

1
@Sorunuzla ilgili olarak, Klon, tablonuz zaten aynı veri türündeyse, tablo yapısını kopyalamaktır, o zaman buna ihtiyacınız yoktur.
Mayer Spitzer

19

Bunu dene

    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, performansa mal olmayan alternatif nedir?
Sam

16

Bunu kontrol et, hoşuna gidebilir (daha önce, lütfen table1 ila table2'yi klonlayın):

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

Veya:

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

Bu, çok daha iyi bir yaklaşımdır, çünkü foreach döngüsünün tümünün aksine .ForEach yöntemine dayalı cevapların aksine, bir DataTable'dan diğerine satırları açıkça yinelemeden aralığı kopyalamak veya hatta seçmek için yerleşik yeteneği kullanır.
David Burg

15

Desteklenen sürümler: 4, 3.5 SP1, şimdi sadece nesne üzerinde bir yöntem çağırabilirsiniz.

DataTable dataTable2 = dataTable1.Copy()

2
Teknik olarak bu, veri tablosunun bir kopyasını oluşturur. Soruda açıkça belirtilmese de, dataTable2'nin zaten var olması ve içinde kaybetmek istemediğimiz başka satırların olması mümkündür. Ayrıca, soru özellikle "spesifik satırları" belirtirken, bu yalnızca tüm satırları ele alır.
Matt

5

Diğer gönderilerin bir sonucu olarak, bu en kısa ben alabilirim:

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

Bu temelde bir öngörüdür. Ayrıca, OP tarafından istendiği gibi bir koşulu filtrelemezsiniz.
Eric Wu

Şimdi temizlerse sourceTableirade destTablede net olacak mı?
Si8

Hedefi temizlemeden bir değer atayabilir ve orijinal değişkeni temizleyebilirim.
Si8

2

Aşağıdaki örnek bir satırı kopyalamanın en hızlı yolu olacaktır. her hücre sütun adına göre kopyalanır. kopyalamak için belirli bir hücreye ihtiyacınız yoksa, o zaman deneyin veya ekleyin ekleyin. 1'den fazla satır kopyalayacaksanız aşağıdaki kodu tekrarlayın.

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.Tablo [1]. satırlar [ 0 ] [i]; 0 dizinini belirtilen satır dizinine değiştirin veya döngü yapacaksanız veya mantıksal olacaksa bir değişken kullanabilirsiniz


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

kodun benim için mükemmel çalışıyor, çok basit bir kod, teşekkürler
Esraa_92 28:17

1

Bunun için tek komut SQL sorgusu isteyenler için:

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;

Bu sorgu verileri kopyalar TABLE001için TABLE002ve biz de sütunlar farklı sütun adlarının yazılı olduğu varsayılmaktadır.

Sütun adları bire bir eşleştirilir:

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

Ayrıca, bir koşula ihtiyacınız varsa, nerede cümlecik belirtebilirsiniz.


0

Tüm datatable'ı kopyalamak için şunu yapın:

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

2
soru, her şeyin değil, bir veri tablosundan belirli satırların nasıl kopyalanacağıyla ilgilidir.
19'da

0

Bu sorunu yapmanın kolay bir yolunu oluşturdum

 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);   
 } 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.