web-dev-qa-db-fra.com

Comment ajouter un DataTable à un autre DataTable

Je voudrais ajouter un DataTable à un autre DataTable. Je vois que la classe DataTable a deux méthodes; "Charger (IDataReader)" et "Fusionner (DataTable)". Dans la documentation, les deux semblent "fusionner" les données entrantes avec le DataTable existant si des lignes existent. Je vais faire la fusion dans une couche d'accès aux données.

Je pourrais utiliser un IDataReader et utiliser la méthode Load pour fusionner les DataTables. Ou je pourrais charger un DataSet en utilisant IDataReader, obtenir le DataTable à partir du DataSet, puis utiliser la méthode Merge pour fusionner les DataTables.

Je me demandais si quelqu'un pourrait me dire quelle est la méthode appropriée à utiliser?

Sinon, faites-moi savoir si vous avez une suggestion différente sur la façon d'accomplir cette tâche.

38
Jason Kanaris

La fusion prend un DataTable, le chargement nécessite un IDataReader - utilisez donc la méthode requise en fonction de la couche de données qui vous donne accès D'après ce que j'ai compris, Load appellera Merge en interne, mais pas à 100%.

Si vous avez deux DataTables, utilisez Merge.

46
Thies

Le type de données dans le même nom de colonne doit être égal à.

dataTable1.Merge(dataTable2);

Après cela, le résultat est:

dataTable1 = dataTable1 + dataTable2

48
Xtian11

Vous pouvez laisser votre DataAdapter faire le travail. DataAdapter.Fill(DataTable) ajoutera vos nouvelles lignes à toutes les lignes existantes dans DataTable.

17
Sam Axe

Ajoutez deux jeux de données contenant des tables de données, il sera maintenant fusionné comme requis

DataSet ds1 = new DataSet();
DataSet ds2 = new DataSet();

DataTable dt1 = new DataTable();
dt1.Columns.Add(new DataColumn("Column1", typeof(System.String)));

DataRow newSelRow1 = dt1.NewRow();
newSelRow1["Column1"] = "Select";
dt1.Rows.Add(newSelRow1);

DataTable dt2 = new DataTable();
dt2.Columns.Add(new DataColumn("Column1", typeof(System.String)));

DataRow newSelRow2 = dt1.NewRow();
newSelRow2["Column1"] = "DataRow1Data";  // Data
dt2.Rows.Add(newSelRow2);

ds1.Tables.Add(dt1);
ds2.Tables.Add(dt2);

ds1.Tables[0].Merge(ds2.Tables[0]);

Maintenant, ds1 aura les données fusionnées

5
Ramesh Venkataswamy

Envisagez une solution permettant de gérer de manière arbitraire de nombreuses tables.

//ASSUMPTION: All tables must have the same columns
var tables = new List<DataTable>();
tables.Add(oneTableToRuleThemAll);
tables.Add(oneTableToFindThem);
tables.Add(oneTableToBringThemAll);
tables.Add(andInTheDarknessBindThem);
//Or in the real world, you might be getting a collection of tables from some abstracted data source.

//behold, a table too great and terrible to imagine
var theOneTable = tables.SelectMany(dt => dt.AsEnumerable()).CopyToDataTable();

Encapsulé dans un assistant pour une réutilisation future:

public static DataTable CombineDataTables(params DataTable[] args)
{
    return args.SelectMany(dt => dt.AsEnumerable()).CopyToDataTable();
}

Juste quelques tables déclarées dans le code?

var combined = CombineDataTables(dt1,dt2,dt3);

Vous souhaitez combiner l'une des tables existantes au lieu d'en créer une nouvelle?

dt1 = CombineDataTables(dt1,dt2,dt3);

Vous avez déjà une collection de tables au lieu d'être déclarées une par une?

//Pretend variable tables already exists
var tables = new[] { dt1, dt2, dt3 };
var combined = CombineDataTables(tables);
0
Derpy