Zeilen von einer Datentabelle in eine andere Datentabelle kopieren?


168

Wie kann ich bestimmte Zeilen von DataTable in eine andere Datentabelle in c # kopieren? Es wird mehr als eine Reihe geben.

Antworten:


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

Das obige Beispiel nimmt an, dass dataTable1und dataTable2die gleiche Anzahl, Art und Reihenfolge der Spalten.


23
Würde dies nicht zu "Diese Zeile gehört bereits zu einer anderen Tabelle" führen.
McArthey

15
@ McArthey Nein, würde es nicht; Aus den Werten in der vorhandenen Zeile wird eine neue Zeile erstellt. Die Zeile selbst wird nicht zur anderen Datentabelle hinzugefügt.
Bradley Smith

20
@DawoodAbbasi Das würde nur passieren, wenn Sie den ItemArrayTeil am Ende des Ausdrucks weglassen würden . Stellen Sie sicher, dass Sie die Werte der Zeile hinzufügen, nicht die Zeile selbst.
Bradley Smith

4
@DawoodAbbasi Informationen zur DataTable.CloneMethode finden Sie in der MSDN-Dokumentation : msdn.microsoft.com/en-us/library/…
Bradley Smith

10
Obwohl Ihre Antwort technisch korrekt ist, werden in Ihrem Codebeispiel Ihre Annahmen nicht berücksichtigt. Die Antwort von @RageeshGr behandelt alle Annahmen und IMHO ist präziser geschrieben und weniger fehleranfällig.
chris.nesbit1

97

Kopieren Sie die angegebenen Zeilen aus der Tabelle in eine andere

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

Wenn ich nach dem Import dttableOld nicht mehr verwenden muss, muss ich trotzdem Clone () verwenden?
Sam

Großartig und praktisch! Vielen Dank!
Mayer Spitzer

1
@ Sam bezüglich Ihrer Frage soll Clone die Tabellenstruktur kopieren. Wenn Ihre Tabelle bereits denselben Datentyp hat, brauchen Sie sie nicht.
Mayer Spitzer

19

Versuche dies

    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, was ist also die Alternative, die keine Leistung kostet?
Sam

16

Probieren Sie es aus, es könnte Ihnen gefallen (vorher klonen Sie bitte Tabelle1 auf Tabelle2):

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

Oder:

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

Dies ist ein viel besserer Ansatz, da die integrierte Funktion zum Kopieren oder sogar Auswählen von Zeilen von einer Datentabelle in eine andere verwendet wird, ohne dass im Gegensatz zu allen foreach-Schleifen, die auf der foreach-Schleife basieren, explizit die einzelnen Antworten durchlaufen werden.
David Burg

15

Unterstützt in: 4, 3.5 SP1, können Sie jetzt einfach eine Methode für das Objekt aufrufen.

DataTable dataTable2 = dataTable1.Copy()

2
Technisch wird dadurch eine Kopie einer Datentabelle erstellt. Obwohl dies in der Frage nicht explizit angegeben ist, ist es möglich, dass dataTable2 bereits vorhanden ist und andere Zeilen enthält, die wir nicht verlieren möchten. Außerdem wird in der Frage speziell "bestimmte Zeilen" angegeben, während dies nur alle Zeilen behandelt.
Matt

5

Aufgrund der anderen Beiträge ist dies der kürzeste, den ich bekommen konnte:

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

Welches ist im Grunde ein foreach. Außerdem filtern Sie nicht durch eine Bedingung, wie vom OP angefordert.
Eric Wu

Wenn ich nun den sourceTableWillen räume, klärt sich das destTableauch?
Si8

Ich möchte in der Lage sein, einen Wert zuzuweisen und die ursprüngliche Variable zu löschen, ohne das Ziel zu löschen.
Si8

2

Das folgende Beispiel ist der schnellste Weg, um eine Zeile zu kopieren. Jede Zelle wird basierend auf dem Spaltennamen kopiert. Wenn Sie zum Kopieren keine bestimmte Zelle benötigen, versuchen Sie es mit catch oder fügen Sie if hinzu. Wenn Sie mehr als eine Zeile kopieren möchten, wiederholen Sie den folgenden Code.

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.Tables [1] .Rows [ 0 ] [i]; Ändern Sie den Index 0 in den angegebenen Zeilenindex, oder Sie können eine Variable verwenden, wenn Sie eine Schleife ausführen oder wenn diese logisch ist


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

Ihr Code funktioniert perfekt für mich, ist ein sehr einfacher Code, danke
Esraa_92

1

Für diejenigen, die eine SQL-Abfrage mit einem Befehl wünschen:

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;

Diese Abfrage kopiert Daten von TABLE001nach TABLE002und wir gehen davon aus, dass beide Spalten unterschiedliche Spaltennamen hatten.

Spaltennamen werden eins zu eins wie folgt zugeordnet:

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

Sie können auch die where-Klausel angeben, wenn Sie eine Bedingung benötigen.


1

Ich habe einen einfachen Weg gefunden, um dieses Problem zu lösen

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

0

Um die gesamte Datentabelle zu kopieren, gehen Sie wie folgt vor:

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

2
Die Frage ist, wie bestimmte Zeilen aus einer Datentabelle kopiert werden können, nicht das Ganze.
jtate
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.