Cara sederhana untuk mengonversi larik datarow menjadi dataTable

98

Saya ingin mengubah DataRowarray menjadi DataTable... Apa cara termudah untuk melakukan ini?

Pengembang404
sumber

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.

Jay Riggs
sumber
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)

joe
sumber
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);
Mitch Wheat
sumber
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");
ilans
sumber
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());
Zolfaghari
sumber
5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   
pengguna1036202
sumber
4
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();
Miriam
sumber
4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();
Rajenthiran T
sumber
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()
Haseeb Mukhtar
sumber
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);
} 
zaib shah
sumber
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
ahli logik
sumber
1

Anda bisa menggunakan System.Linq seperti ini:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}
Andrés
sumber
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);
}
Awais Shabir
sumber
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);
}
AVINASH DUBEY
sumber