1つのDataTableを別のDataTableに追加したいと思います。 DataTableクラスには2つのメソッドがあります。 「Load(IDataReader)」および「Merge(DataTable)」。ドキュメントからは、行が存在する場合、両方とも既存のDataTableで受信データを「マージ」するように見えます。データアクセス層でマージを行います。
IDataReaderを使用して、Loadメソッドを使用してDataTablesをマージできます。または、IDataReaderを使用してDataSetを読み込み、DataSetからDataTableを取得し、Mergeメソッドを使用してDataTablesをマージできます。
使用する適切な方法を誰かが教えてくれるかどうか疑問に思っていましたか?
または、このタスクを実行する方法について別の提案がある場合はお知らせください。
MergeはDataTableを取得し、LoadはIDataReaderを必要とします。したがって、データレイヤーがアクセスできるものに応じて、必要なメソッドを使用します。私の理解では、Loadは内部的にMergeを呼び出しますが、それについて100%確信はありません。
2つのDataTableがある場合、Mergeを使用します。
同じ列名のデータ型は等しくなければなりません。
dataTable1.Merge(dataTable2);
その後の結果は次のとおりです。
dataTable1 = dataTable1 + dataTable2
DataAdapter
に作業を任せることができます。 DataAdapter.Fill(DataTable)
は、DataTable
内の既存の行に新しい行を追加します。
データテーブルを含む2つのデータセットを追加します。必要に応じてマージします
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]);
これで、ds1にはマージされたデータがあります
多くのテーブルを任意に適切に処理するソリューションを検討してください。
//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();
将来の再利用のためにヘルパーにカプセル化:
public static DataTable CombineDataTables(params DataTable[] args)
{
return args.SelectMany(dt => dt.AsEnumerable()).CopyToDataTable();
}
コードで宣言されたテーブルがいくつかありますか?
var combined = CombineDataTables(dt1,dt2,dt3);
新しいテーブルを作成する代わりに、既存のテーブルの1つに結合したいですか?
dt1 = CombineDataTables(dt1,dt2,dt3);
1つずつ宣言するのではなく、すでにテーブルのコレクションがありますか?
//Pretend variable tables already exists
var tables = new[] { dt1, dt2, dt3 };
var combined = CombineDataTables(tables);