Copier les lignes d'un Datatable vers un autre DataTable?

165

Comment puis-je copier des lignes spécifiques de DataTable vers une autre Datable en c #? Il y aura plus d'une ligne.

kartal
la source

Réponses:

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

L'exemple ci-dessus suppose que dataTable1et dataTable2avoir le même nombre, le même type et l'ordre des colonnes.

Bradley Smith
la source
22
Cela n'entraînerait-il pas «Cette ligne appartient déjà à une autre table».
McArthey
15
@McArthey Non, ce ne serait pas le cas; une nouvelle ligne est créée à partir des valeurs de la ligne existante. La ligne elle-même n'est pas ajoutée à l'autre DataTable.
Bradley Smith
20
@DawoodAbbasi Cela ne se produirait que si vous omettiez la ItemArraypartie à la fin de l'expression. Assurez-vous d'ajouter les valeurs de la ligne et non la ligne elle-même.
Bradley Smith du
4
@DawoodAbbasi Reportez-vous à la documentation MSDN pour la DataTable.Cloneméthode: msdn.microsoft.com/en-us/library/…
Bradley Smith
10
Bien que votre réponse soit techniquement correcte, votre exemple de code ne répond pas à vos hypothèses. La réponse de @RageeshGr gère toutes les hypothèses et IMHO est écrite de manière plus concise et est moins sujette aux erreurs.
chris.nesbit1
94

Copier les lignes spécifiées d'une table vers une autre

// 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);
   }
}
Rageesh Geetha Raman
la source
Si je n'ai plus besoin d'utiliser dttableOld après l'importation, dois-je toujours utiliser Clone ()?
Sam le
Génial et pratique! Merci!
Mayer Spitzer
1
@Sam concernant votre question, Clone consiste à copier la structure de la table, si votre table est déjà du même type de données, vous n'en avez pas besoin.
Mayer Spitzer le
19

Essaye ça

    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);
    }
Zia
la source
@ManojSavalia, alors quelle est l'alternative qui ne coûte pas la performance?
Sam
16

Vérifiez ceci, vous aimerez peut-être (auparavant, veuillez cloner table1 en table2):

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

Ou:

table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);
Estevez
la source
C'est une bien meilleure approche car elle utilise la capacité intégrée de copier ou même de sélectionner des lignes d'un DataTable à un autre sans itérer explicitement dans chacun, contrairement à toutes les réponses basées sur la méthode .ForEach de la boucle foreach.
David Burg
15

Pris en charge dans: 4, 3.5 SP1, vous pouvez maintenant simplement appeler une méthode sur l'objet.

DataTable dataTable2 = dataTable1.Copy()
Amir
la source
2
Techniquement, cela crée une copie d'un datatable. Bien que cela ne soit pas explicitement indiqué dans la question, il est possible que dataTable2 existe déjà et contienne d'autres lignes que nous ne voulons pas perdre. En outre, la question indique spécifiquement "des lignes spécifiques", alors que cela ne gère que toutes les lignes.
Matt
5

À la suite des autres articles, c'est le plus court que je puisse obtenir:

DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));
Meiel
la source
Ce qui est fondamentalement un foreach. De plus, vous ne filtrez pas à travers une condition, comme demandé par l'OP.
Eric Wu
Maintenant, si je nettoie le sourceTabletestament, le sera destTableaussi clair?
Si8
Je veux pouvoir attribuer une valeur et effacer la variable d'origine sans effacer la destination.
Si8
2

ci-dessous l'échantillon serait le moyen le plus rapide de copier une ligne. chaque cellule est copiée en fonction du nom de la colonne. au cas où vous n'avez pas besoin d'une cellule spécifique à copier, essayez de rattraper ou d'ajouter si. si vous allez copier plus d'une ligne, bouclez le code ci-dessous.

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]; changez l'index 0 en votre index de ligne spécifié ou vous pouvez utiliser une variable si vous allez en boucle ou si cela va être logique

Chad Dumagas
la source
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.
 }
Roopendra
la source
votre code fonctionne parfaitement pour moi, est un code très simple, merci
Esraa_92
1

Pour ceux qui veulent une requête SQL à commande unique pour cela:

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;

Cette requête copiera les données de TABLE001vers TABLE002et nous supposons que les deux colonnes avaient des noms de colonnes différents.

Les noms de colonne sont mappés un à un comme:

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

Vous pouvez également spécifier la clause where, si vous avez besoin d'une condition.

Manisha
la source
0

Pour copier tout le datatable, procédez comme suit:

DataGridView sourceGrid = this.dataGridView1;
DataGridView targetGrid = this.dataGridView2;
targetGrid.DataSource = sourceGrid.DataSource;
inspiron
la source
2
la question est de savoir comment copier des lignes spécifiques à partir d'une table de données, pas le tout.
jtate
0

J'ai créé un moyen simple de résoudre ce problème

 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);   
 } 
Willie Cheng
la source