Einfache Möglichkeit, ein Datarow-Array in ein datierbares Array zu konvertieren


Antworten:


91

Warum nicht Ihr DataRow-Array durchlaufen und hinzufügen (ggf. mit DataRow.ImportRow, um eine Kopie der DataRow zu erhalten), etwa:

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

Stellen Sie sicher, dass Ihre dataTable dasselbe Schema wie die DataRows in Ihrem DataRow-Array hat.


1
Diese Technik ist hilfreich, wenn die Fehlermeldung "Für MyControl wird eine ungültige Datenquelle verwendet. Eine gültige Datenquelle muss entweder IListSource oder IEnumerable implementieren" angezeigt wird, wenn Sie versuchen, eine DataRow direkt an die DataSource-Eigenschaft eines Steuerelements zu binden. So geht's:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
Humbads

+1 Ich bevorzuge dies, anstatt rowArray.CopyToDataTable();das Tabellenschema beizubehalten und es nicht durch ein neues Tabellenobjekt zu ersetzen!
Mojtaba Rezaeian

7
Sehr gut ! Aber ich würde vorschlagen, die DataTable vor dem foreach zu klonen. Es kopiert das Format der Datentabelle: newDataTable = oldDataTable.clone ();
Schleudertrauma

2
Hinweis: Auf Ihrer Datentabelle müssen Spalten erstellt sein, sonst wird sie nicht richtig gefüllt.
Logixologe

190

Für .Net Framework 3.5+

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

Wenn das Array jedoch keine Zeilen enthält , kann dies zu Fehlern führen, z. B. Die Quelle enthält keine DataRows . Wenn Sie sich für diese Methode entscheiden CopyToDataTable(), sollten Sie daher das Array überprüfen, um festzustellen , ob es Datenzeilen enthält oder nicht.

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

Referenz verfügbar bei MSDN: DataTableExtensions.CopyToDataTable-Methode (IEnumerable)


1
Woher hast du copyToDataTable()? Ich habe es nicht in .net 2.0 gefunden
SMUsamaShah

11
Dies sollte als richtige Antwort markiert werden, da die copyToDataTable()Methode eine perfekte Kopie der Spalten der ausgewählten Zeilen erstellt, während die datatable.ImportRow(row)Methode dies nicht tut
Dante

5
Diese Methode ist nicht gut, wenn die Tabelle bereits Zeilen enthält, da diese alles ersetzen, was bereits vorhanden ist. Wenn die Tabelle zunächst leer ist, ist das in Ordnung.
Franck

5
Ich bevorzuge diese Methode, solange .NET-Funktionen optimiert sind. Vergessen Sie nicht, den Verweis auf System.Data.DataSetExtensions in Ihr Projekt aufzunehmen, damit Sie sich nicht fragen, warum diese Methode fehlt (wie ich)
Broken_Window

Denken Sie daran, System.Data.DataSetExtensions Assembly in den Referenzen hinzuzufügen
Vagner Gon

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
Ich habe es bereits so versucht. Es tritt ein Fehler auf wie "Eingabearray ist länger als die Anzahl der Spalten in dieser Tabelle."
Developer404

AS Jay wies darauf hin, stellen Sie sicher, dass Ihre dataTable das gleiche Schema wie die DataRows in Ihrem DataRow-Array hat
Mitch Wheat

1
Ja .. ich habe es versucht. Ich habe Datatable1 = datatable2.Clone () verwendet. Jetzt funktioniert es ... Danke :-)
Developer404

Ich habe dies mit einem Zeilenarray versucht und es hat nicht funktioniert. Für jede Zeile im Zeilenarray habe ich eine neue Zeile erstellt, die ItemArray-Eigenschaft aus der ursprünglichen Zeile kopiert und dann das Hinzufügen funktioniert.
Steve

1
Dies scheint in .NET Framework 4.0 weder mit dem veröffentlichten Beispiel noch mit dem Klonen von "dt" aus dstata.tables [0] zu funktionieren. @ joes Antwort hat letztendlich für meine Zwecke funktioniert. No-Clone-Versionsfehler: " Input array is longer than the number of columns in this table.". With-Clone-Versionsfehler: " 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." Hinweis: StoreOrderist die erste Spalte im Tabellenschema. Es scheint, als würde versucht, das gesamte Datenfenster in diese erste Spalte zu stecken
Brian Webster,

11

Eine andere Möglichkeit ist die Verwendung einer 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

Einfacher Weg ist:

// 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+ DataTableExtensions hinzugefügt, verwenden Sie die DataTableExtensions.CopyToDataTable-Methode

Verwenden Sie für ein Datenarray-Array einfach .CopyToDataTable () und es wird datatable zurückgegeben.

Für einzelne Daten verwenden

new DataRow[] { myDataRow }.CopyToDataTable()

2

Hier ist die Lösung. Es sollte gut funktionieren.

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

Falls jemand es in VB.NET braucht:

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

1

Sie könnten System.Linq folgendermaßen verwenden:

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

1

Sie müssen zuerst die Struktur der Datentabelle klonen und dann Zeilen mit der for-Schleife importieren

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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.