Cara sederhana untuk mengonversi larik datarow menjadi dataTable


Jawaban:


91

Mengapa tidak mengulang melalui array DataRow Anda dan menambahkan (menggunakan DataRow.ImportRow, jika perlu, untuk mendapatkan salinan DataRow), seperti:

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

Pastikan dataTable Anda memiliki skema yang sama dengan DataRows di larik DataRow Anda.


1
Teknik ini berguna jika Anda mendapatkan pesan kesalahan "Sumber data yang tidak valid sedang digunakan untuk MyControl. Sumber data yang valid harus mengimplementasikan IListSource atau IEnumerable" saat mencoba mengikat DataRow langsung ke properti DataSource kontrol. Berikut cara melakukannya:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads

+1 Saya lebih suka ini daripada rowArray.CopyToDataTable();karena ini membuat skema tabel dan tidak menggantinya dengan objek tabel baru!
Mojtaba Rezaeian

7
Baik sekali ! Tapi saya akan Sarankan untuk mengkloning DataTable sebelum foreach. Ini menyalin format DataTable: newDataTable = oldDataTable.clone ();
Whiplash

2
Petunjuk: Dataable Anda harus memiliki kolom yang dibuat atau tidak akan terisi dengan benar.
ahli logikologi

192

Untuk .Net Framework 3.5+

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

Tetapi jika tidak ada baris dalam larik, itu dapat menyebabkan kesalahan seperti Sumber tidak berisi DataRows . Oleh karena itu, jika Anda memutuskan untuk menggunakan metode ini CopyToDataTable(), Anda harus memeriksa array untuk mengetahui bahwa ia memiliki datarows atau tidak.

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

Referensi tersedia di MSDN: Metode DataTableExtensions.CopyToDataTable (IEnumerable)


1
Dari mana Anda mendapatkan copyToDataTable()? Saya tidak menemukannya di .net 2.0
SMUsamaShah

11
Ini harus ditandai sebagai jawaban yang benar karena copyToDataTable()metode membuat salinan sempurna dari kolom dari baris yang dipilih, sedangkan datatable.ImportRow(row)metode tidak
Dante

5
metode ini tidak baik jika tabel sudah memiliki baris di dalamnya karena ini menggantikan apa pun yang sudah ada. Jika tabel kosong untuk memulai tidak masalah.
Franck

5
Saya lebih suka metode ini selama fungsi .Net dioptimalkan. Jangan lupa untuk menambahkan referensi ke System.Data.DataSetExtensions dalam proyek Anda sehingga Anda tidak akan merasa frustrasi bertanya pada diri sendiri mengapa metode ini hilang (seperti saya)
Broken_Window

Ingatlah untuk menambahkan Majelis System.Data.DataSetExtensions di Referensi
Vagner Gon

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
Saya sudah mencoba seperti itu .. Terjadi kesalahan seperti "Input array lebih panjang dari jumlah kolom di tabel ini."
Pengembang404

AS Jay menunjukkan, Pastikan dataTable Anda memiliki skema yang sama dengan DataRows dalam larik DataRow Anda
Mitch Wheat

1
Ya .. sudah saya coba. Saya menggunakan Datatable1 = datatable2.Clone (); Sekarang bekerja ... Terima kasih :-)
Developer404

Saya mencoba ini dengan array baris dan tidak berhasil. Untuk setiap baris dalam array baris, saya membuat baris baru, menyalin properti ItemArray dari baris asli dan kemudian menambahkan berfungsi.
Steve

1
Ini tampaknya tidak bekerja di .NET Framework 4.0 dengan sampel seperti yang diposting, atau dengan "dt" yang dikloning dari dstata.tables [0]. Jawaban @ joe akhirnya berhasil untuk tujuan saya. Kesalahan Versi Tanpa Klon: " Input array is longer than the number of columns in this table.". Dengan-Clone Version Error: " 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." Catatan: StoreOrderadalah kolom pertama dalam skema tabel. Sepertinya itu mencoba menjejalkan seluruh datarow ke dalam kolom pertama itu
Brian Webster

11

Cara lain adalah dengan menggunakan 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

Cara sederhananya adalah:

// 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 dt = myDataRowCollection.CopyToDataTable<DataRow>();

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

3

.Net 3.5+ menambahkan DataTableExtensions, gunakan Metode DataTableExtensions.CopyToDataTable

Untuk array datarow cukup gunakan .CopyToDataTable () dan itu akan mengembalikan data.

Untuk penggunaan datarow tunggal

new DataRow[] { myDataRow }.CopyToDataTable()

2

Inilah solusinya. Ini harus bekerja dengan baik.

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

Jika ada yang membutuhkannya di VB.NET:

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

1

Anda bisa menggunakan System.Linq seperti ini:

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

1

Anda perlu mengkloning struktur tabel Data terlebih dahulu lalu mengimpor baris menggunakan for loop

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);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.