Copiare le righe da un Datatable a un altro DataTable?


165

Come posso copiare righe specifiche da DataTable a un altro Datable in c #? Ci sarà più di una riga.

Risposte:


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

L'esempio sopra presuppone che dataTable1e dataTable2hanno lo stesso numero, il tipo e l'ordine delle colonne.


22
Questo risultato non sarebbe in "Questa riga appartiene già a un'altra tabella".
McArthey,

15
@McArthey No, non lo farebbe; viene creata una nuova riga dai valori nella riga esistente. La riga stessa non viene aggiunta all'altra DataTable.
Bradley Smith,

20
@DawoodAbbasi Ciò accadrebbe solo se avessi lasciato fuori la ItemArrayparte alla fine dell'espressione. Assicurati di aggiungere i valori della riga, non la riga stessa.
Bradley Smith l'

4
@DawoodAbbasi Consultare la documentazione MSDN per il DataTable.Clonemetodo: msdn.microsoft.com/en-us/library/…
Bradley Smith

10
Sebbene la tua risposta tecnicamente sia corretta, l'esempio di codice non risponde alle tue ipotesi. La risposta di @RageeshGr gestisce tutte le ipotesi e IMHO è scritto in modo più conciso ed è meno soggetto a errori.
chris.nesbit1,

94

Copia le righe specificate dalla tabella a un'altra

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

Se non ho più bisogno di usare dttableOld dopo l'importazione, devo ancora usare Clone ()?
Sam,

Grande e pratico! Grazie!
Mayer Spitzer il

1
@Sam per quanto riguarda la tua domanda, Clone è copiare la struttura della tabella, se la tua tabella è già dello stesso tipo di dati, non ti serve.
Mayer Spitzer il

19

Prova questo

    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, quindi qual è l'alternativa che non costa le prestazioni?
Sam,

16

Dai un'occhiata, potrebbe piacerti (prima, per favore, clona da table1 a table2):

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

O:

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

Questo è un approccio molto migliore perché utilizza la funzionalità integrata per l'intervallo di copia o persino la selezione di righe da una DataTable a un'altra senza iterare esplicitamente attraverso ciascuna, a differenza di tutto il ciclo foreach, risposte basate sul metodo .ForEach.
David Burg,

15

Supportato in: 4, 3.5 SP1, ora puoi semplicemente chiamare un metodo sull'oggetto.

DataTable dataTable2 = dataTable1.Copy()

2
Tecnicamente questo crea una copia di un datatable. Sebbene non sia esplicitamente indicato nella domanda, è possibile che dataTable2 esista già e contenga altre righe che non vogliamo perdere. Inoltre, la domanda specifica nello specifico "righe specifiche", mentre ciò gestisce solo tutte le righe.
Matt

5

Come risultato degli altri post, questo è il più breve che ho potuto ottenere:

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

Che è fondamentalmente una foreach. Inoltre, non stai filtrando una condizione, come richiesto dall'OP.
Eric Wu,

Ora, se ripulisco, sourceTablesarà destTablechiaro anche?
Si8,

Voglio essere in grado di assegnare un valore e cancellare la variabile originale senza cancellare la destinazione.
Si8,

2

sotto esempio sarebbe il modo più veloce per copiare una riga. ogni cella viene copiata in base al nome della colonna. nel caso in cui non sia necessario copiare una cella specifica, provare a catturare o aggiungere if. se hai intenzione di copiare più di 1 riga, esegui il ciclo seguente del codice.

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]; cambia l'indice 0 nell'indice di riga specificato oppure puoi utilizzare una variabile se esegui il ciclo o se sarà logico


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

il tuo codice funziona perfettamente per me, è un codice molto semplice, grazie
Esraa_92,

1

Per chi desidera una query SQL a comando singolo per questo:

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;

Questa query copierà i dati da TABLE001a TABLE002e supponiamo che entrambe le colonne abbiano nomi di colonna diversi.

I nomi delle colonne sono mappati uno a uno come:

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

Puoi anche specificare dove clausola, se hai bisogno di qualche condizione.


0

Per copiare l'intero datatable basta fare questo:

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

2
la domanda è su come copiare righe specifiche da una tabella di dati, non l'intera cosa.
jtate

0

Ho creato un modo semplice per risolvere questo problema

 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);   
 } 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.