Un modo semplice per convertire l'array datarow in datatable


Risposte:


91

Perché non iterare attraverso l'array DataRow e aggiungere (utilizzando DataRow.ImportRow, se necessario, per ottenere una copia di DataRow), qualcosa come:

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

Assicurati che il tuo dataTable abbia lo stesso schema dei DataRows nell'array DataRow.


1
Questa tecnica è utile se viene visualizzato il messaggio di errore "Viene utilizzata un'origine dati non valida per MyControl. Un'origine dati valida deve implementare IListSource o IEnumerable" quando si tenta di associare un DataRow direttamente alla proprietà DataSource di un controllo. Ecco come farlo:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
— humbads

+1 Preferisco questo piuttosto che rowArray.CopyToDataTable();perché mantiene lo schema della tabella e non lo sostituisce con un nuovo oggetto tabella!
— Mojtaba Rezaeian

7
Molto bene ! Ma suggerirei di clonare DataTable prima del foreach. Copia il formato del DataTable: newDataTable = oldDataTable.clone ();
— Colpo di frusta

2
Suggerimento: il tuo datatable deve avere colonne create o non si riempirà correttamente.
— logixologo

192

Per .Net Framework 3.5+

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

Ma se non ci sono righe nell'array, può causare errori come L'origine non contiene DataRows . Pertanto, se decidi di utilizzare questo metodo CopyToDataTable(), dovresti controllare l'array per sapere che ha i datarows o meno.

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

Riferimento disponibile su MSDN: DataTableExtensions.CopyToDataTable Method (IEnumerable)


1
Da dove l'hai preso copyToDataTable()? Non l'ho trovato in .net 2.0
— SMUsamaShah

11
Questo dovrebbe essere contrassegnato come una risposta corretta poiché il copyToDataTable()metodo crea una copia perfetta delle colonne delle righe selezionate, mentre il datatable.ImportRow(row)metodo no
— Dante

5
questo metodo non è buono se la tabella contiene già righe in quanto sostituisce ciò che è già presente. Se la tabella è vuota per iniziare, va bene.
— Franck

5
Preferisco questo metodo fintanto che le funzioni .Net sono ottimizzate. Non dimenticare di aggiungere il riferimento a System.Data.DataSetExtensions nel tuo progetto in modo da non essere frustrato chiedendoti perché questo metodo manca (come me)
— Broken_Window

Ricordarsi di aggiungere System.Data.DataSetExtensions Assembly nei riferimenti
— Vagner Gon

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
Ho già provato in questo modo .. Si verifica un errore come "L'array di input è più lungo del numero di colonne in questa tabella".
— Developer404

AS Jay ha sottolineato, assicurati che il tuo dataTable abbia lo stesso schema dei DataRows nel tuo array DataRow
— Mitch Wheat

1
Sì .. ho provato. Ho usato Datatable1 = datatable2.Clone (); Ora funziona ... Grazie :-)
— Developer404

L'ho provato con un array di righe e non ha funzionato. Per ogni riga nell'array di righe, ho creato una nuova riga, ho copiato la proprietà ItemArray dalla riga originale e quindi l'aggiunta ha funzionato.
— Steve

1
Questo non sembra funzionare in .NET Framework 4.0 con l'esempio così come pubblicato, né con "dt" clonato da dstata.tables [0]. La risposta di @ joe ha finito per funzionare per i miei scopi. Errore di versione senza clonazione: " Input array is longer than the number of columns in this table.". Errore versione con 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." Nota: StoreOrderè la prima colonna nello schema della tabella. Sembra che stia cercando di inserire l'intero datarow in quella prima colonna
— Brian Webster

11

Un altro modo è usare un 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

Il modo semplice è:

// 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+ ha aggiunto DataTableExtensions, usa il metodo DataTableExtensions.CopyToDataTable

Per l'array datarow basta usare .CopyToDataTable () e restituirà datatable.

Per uso singolo datarow

new DataRow[] { myDataRow }.CopyToDataTable()

2

Ecco la soluzione. Dovrebbe funzionare bene.

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

Nel caso in cui qualcuno ne abbia bisogno in VB.NET:

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

1

Puoi usare System.Linq in questo modo:

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

1

È necessario prima clonare la struttura della tabella dati, quindi importare le righe utilizzando il ciclo 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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.