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

97

Ich möchte ein DataRowArray in DataTable... konvertieren. Was ist der einfachste Weg, dies zu tun?

Entwickler404
quelle

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.

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

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

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

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