datarow配列をdatatableに変換する簡単な方法


回答:


91

DataRow配列を反復処理して、(DataRowのコピーを取得するために、必要に応じてDataRow.ImportRowを使用して)次のように追加しないでください。

foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

dataTableのスキーマがDataRow配列のDataRowsと同じであることを確認してください。


1
この手法は、コントロールのDataSourceプロパティに直接DataRowをバインドしようとしたときに、「MyControlに無効なデータソースが使用されています。有効なデータソースはIListSourceまたはIEnumerableを実装する必要があります」というエラーメッセージが表示された場合に役立ちます。ここでそれを行う方法は次のとおりです。DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbadsは

+1 rowArray.CopyToDataTable();これはテーブルスキーマを保持し、新しいテーブルオブジェクトに置き換えないためではなく、こちらを好みます。
Mojtaba Rezaeian 2016年

7
とても良い !しかし、私はforeachの前にDataTableを複製することを提案します。DataTableのフォーマットをコピーします。newDataTable = oldDataTable.clone();
むち打ち症2016年

2
ヒント:データテーブルには列を作成する必要があります。そうしないと、正しく入力されません。
ロジロジスト、2017年

192

.Net Framework 3.5以降の場合

DataTable dt = new DataTable();
DataRow[] dr = dt.Select("Your string");
DataTable dt1 = dr.CopyToDataTable();

ただし、配列に行がない場合、ソースにDataRowsが含まれていないなどのエラーが発生する可能性があります。したがって、この方法を使用するCopyToDataTable()場合は、配列をチェックして、データ行があるかどうかを確認する必要があります。

if (dr.Length > 0)
    DataTable dt1 = dr.CopyToDataTable();

MSDNで利用可能な参照: DataTableExtensions.CopyToDataTableメソッド(IEnumerable)


1
どこから入手しましたcopyToDataTable()か?.net 2.0では見つかりませんでした
SMUsamaShah

11
ので、これは正しい答えとしてマークされなければならないcopyToDataTable()方法は一方で、選択された行の列の完璧なコピーを作成するdatatable.ImportRow(row)方法のdoesnt
ダンテ

5
この方法は、テーブルにすでに行が含まれている場合は、すでに存在するものを置き換えるため、適切ではありません。そもそもテーブルが空の場合は問題ありません。
フランク2014年

5
.Net関数が最適化されている限り、この方法を使用します。プロジェクトにSystem.Data.DataSetExtensionsへの参照を追加することを忘れないでください。そうすれば、このメソッドが欠落している理由(自分のように)がわからなくなるのではないでしょうか
Broken_Window

参照にSystem.Data.DataSetExtensionsアセンブリを追加することを忘れないでください
Vagner Gon

12
DataTable dt = new DataTable(); 

DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");

dt.Rows.Add(dr);

2
私はすでにそのように試しました。「入力配列がこのテーブルの列数よりも長い」のようなエラーが発生します。
Developer404

Jayが指摘したように、dataTableがDataRow配列のDataRowsと同じスキーマを持っていることを確認してください
Mitch Wheat

1
はい..試しました Datatable1 = datatable2.Clone();を使用しました。今それは働いています...ありがとうございました:-)
Developer404

これを行配列で試しましたが、うまくいきませんでした。行配列の各行について、新しい行を作成し、元の行からItemArrayプロパティをコピーして、追加が機能しました。
Steve

1
これは、サンプルが投稿された.NET Framework 4.0では機能せず、dstata.tables [0]から "dt"がクローンされても機能しないようです。@joeの答えは、私の目的のためにうまくいきました。クローンなしバージョンエラー: " Input array is longer than the number of columns in this table."。With-Cloneバージョンエラー: " Unable to cast object of type 'System.Data.DataRow' to type 'System.IConvertible'.Couldn't store <System.Data.DataRow> in StoreOrder Column. Expected type is Int64."注:StoreOrderテーブルスキーマの最初の列です。データ行全体をその最初の列に詰め込もうとしているようです
ブライアンウェブスター

11

別の方法は、DataViewを使用することです

// Create a DataTable
DataTable table = new DataTable()
...

// Filter and Sort expressions
string expression = "[Birth Year] >= 1983"; 
string sortOrder = "[Birth Year] ASC";

// Create a DataView using the table as its source and the filter and sort expressions
DataView dv = new DataView(table, expression, sortOrder, DataViewRowState.CurrentRows);

// Convert the DataView to a DataTable
DataTable new_table = dv.ToTable("NewTableName");

9

簡単な方法は:

// dtData is DataTable that contain data
DataTable dt = dtData.Select("Condition=1").CopyToDataTable();

// or existing typed DataTable dt
dt.Merge(dtData.Select("Condition=1").CopyToDataTable());

5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   


4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();

3

.Net 3.5以降にDataTableExtensionsを追加、DataTableExtensions.CopyToDataTableメソッドを使用

datarow配列の場合は、.CopyToDataTable()を使用するだけで、データテーブルが返されます。

単一のデータ行を使用する場合

new DataRow[] { myDataRow }.CopyToDataTable()

2

これが解決策です。正常に動作するはずです。

DataTable dt = new DataTable();
dt = dsData.Tables[0].Clone();
DataRows[] drResults = dsData.Tables[0].Select("ColName = 'criteria');

foreach(DataRow dr in drResults)
{
    object[] row = dr.ItemArray;
    dt.Rows.Add(row);
} 

1

VB.NETで必要な場合:

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next

1

次のようにSystem.Linqを使用できます。

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}

1

最初にデータテーブルの構造を複製してから、forループを使用して行をインポートする必要があります

DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

0
DataTable dataTable = new DataTable();
dataTable = OldDataTable.Tables[0].Clone();
foreach(DataRow dr in RowData.Tables[0].Rows)
{
 DataRow AddNewRow = dataTable.AddNewRow();
 AddNewRow.ItemArray = dr.ItemArray;
 dataTable.Rows.Add(AddNewRow);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.