あるDatatableから別のDataTableに行をコピーしますか?


165

特定の行をDataTableからc#で別のDatableにコピーするにはどうすればよいですか?複数の行があります。

回答:


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

上記の例では、列の数、タイプ、順序が同じdataTable1dataTable2あり、同じであると想定しています。


22
「この行はすでに別のテーブルに属しています」という結果にならないでしょうか。
McArthey

15
@McArtheyいいえ、そうではありません。既存の行の値から新しい行が作成されています。行自体は他のDataTableに追加されていません。
Bradley Smith

20
@DawoodAbbasiこれはItemArray、式の最後の部分を省略した場合にのみ発生します。行自体ではなく、行の値を追加していることを確認してください。
Bradley Smith

4
MSDNのドキュメントを参照してください@DawoodAbbasi DataTable.Clone方法:msdn.microsoft.com/en-us/library/...
ブラッドリー・スミス

10
あなたの答えは技術的には正しいですが、あなたのコードサンプルはあなたの仮定に対処していません。@RageeshGrによる回答はすべての仮定を処理し、IMHOはより簡潔に記述され、エラーが発生しにくくなります。
chris.nesbit1 2013年

94

指定した行をテーブルから別の行にコピーする

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

インポート後にdttableOldを使用する必要がなくなった場合でも、Clone()を使用する必要がありますか?
サム

素晴らしく実用的です!ありがとう!
Mayer Spitzer

1
@Samあなたの質問に関して、Cloneはテーブル構造をコピーすることです。テーブルがすでに同じデータ型である場合、それは必要ありません。
Mayer Spitzer

19

これを試して

    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、パフォーマンスを犠牲にしない代替案は何ですか?
サム

16

これをチェックして、気に入っていただけます(以前は、table1をtable2に複製してください)。

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

または:

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

すべてのforeachループとは異なり、.ForEachメソッドベースの回答とは異なり、組み込みの機能を使用して、1つのDataTableから別のDataTableに行を明示的に反復することなく行を選択またはコピーするため、これははるかに優れたアプローチです。
デビッドバーグ

15

サポート対象:4、3.5 SP1、オブジェクトのメソッドを呼び出すだけ。

DataTable dataTable2 = dataTable1.Copy()

2
技術的には、これによりデータテーブルのコピーが作成されます。質問では明示的に述べられていませんが、dataTable2がすでに存在し、他の行を失いたくない可能性があります。また、質問は具体的に「特定の行」と述べていますが、これはすべての行のみを処理します。
Matt

5

他の投稿の結果、これは私が得ることができる最短のものです:

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

これは基本的にforeachです。また、OPからの要求に応じて、条件を介してフィルタリングしていません。
Eric Wu

さてクリアするとsourceTable意志destTableもクリアされますか?
Si8、2017

宛先をクリアせずに値を割り当てて元の変数をクリアできるようにしたいのですが。
Si8

2

以下のサンプルは、1つの行をコピーする最も速い方法です。各セルは列名に基づいてコピーされます。特定のセルをコピーする必要がない場合は、試行キャッチまたは追加を行います。複数の行をコピーする場合は、以下のコードをループしてください。

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]; インデックス0を指定した行インデックスに変更します。ループする場合、または論理的になる場合は変数を使用できます。


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

あなたのコードは私にとって完璧に機能し、非常にシンプルなコードです、ありがとう
Esraa_92

1

そのための単一コマンドSQLクエリが必要な場合:

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;

このクエリは、データをからTABLE001にコピーTABLE002し、両方の列の列名が異なると想定しています。

列名は次のように1対1でマッピングされます。

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

条件が必要な場合は、where句を指定することもできます。


0

データテーブル全体をコピーするには、次のようにします。

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

2
問題は、全体ではなく、データテーブルから特定の行をコピーする方法です。
jtate

0

この問題を解決する簡単な方法を作成しました

 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);   
 } 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.