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.