Prosty sposób na konwersję tablicy datarow na datatable

98

Chcę przekonwertować DataRowtablicę na DataTable... Jaki jest najprostszy sposób, aby to zrobić?

Deweloper404
źródło

Odpowiedzi:

91

Dlaczego nie powtórzyć swojej tablicy DataRow i dodać (używając DataRow.ImportRow, jeśli to konieczne, aby uzyskać kopię DataRow), coś takiego:

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

Upewnij się, że dataTable ma ten sam schemat co DataRows w tablicy DataRow.

Jay Riggs
źródło
1
Ta technika jest przydatna, jeśli zostanie wyświetlony komunikat o błędzie „Nieprawidłowe źródło danych jest używane dla MyControl. Prawidłowe źródło danych musi implementować IListSource lub IEnumerable” podczas próby powiązania elementu DataRow bezpośrednio z właściwością DataSource kontrolki. Oto jak to zrobić:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads
+1 Wolę to, a nie rowArray.CopyToDataTable();dlatego, że zachowuje schemat tabeli i nie zastępuje go nowym obiektem tabeli!
Mojtaba Rezaeian
7
Bardzo dobrze ! Ale sugerowałbym sklonowanie DataTable przed foreach. Kopiuje format DataTable: newDataTable = oldDataTable.clone ();
Whiplash
2
Wskazówka: Twój datatable musi mieć utworzone kolumny, w przeciwnym razie nie będzie on poprawnie wypełniony.
logiksolog,
192

Dla .Net Framework 3.5+

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

Ale jeśli w tablicy nie ma żadnych wierszy, może to spowodować błędy, takie jak źródło nie zawiera DataRows . Dlatego, jeśli zdecydujesz się użyć tej metody CopyToDataTable(), powinieneś sprawdzić tablicę, aby wiedzieć, że zawiera datarows, czy nie.

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

Odniesienie dostępne w MSDN: DataTableExtensions.CopyToDataTable Method (IEnumerable)

joe
źródło
1
Skąd się wziąłeś copyToDataTable()? Nie znalazłem tego w .net 2.0
SMUsamaShah,
11
To powinno być zaznaczone jako prawidłowa odpowiedź, ponieważ copyToDataTable()metoda tworzy idealną kopię kolumn wybranych wierszy, podczas gdy datatable.ImportRow(row)metoda nie
Dante
5
ta metoda nie jest dobra, jeśli tabela zawiera już wiersze, ponieważ zastępuje to, co już tam jest. Jeśli tabela jest pusta na początku, jest w porządku.
Franck,
5
Wolę tę metodę, o ile funkcje .Net są zoptymalizowane. Nie zapomnij dodać odwołania do System.Data.DataSetExtensions w swoim projekcie, aby nie denerwować się zadawaniem sobie pytania, dlaczego brakuje tej metody (tak jak ja)
Broken_Window
Pamiętaj, aby dodać zestaw System.Data.DataSetExtensions w referencjach
Vagner Gon
12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);
Mitch Wheat
źródło
2
Próbowałem już w ten sposób .. Występuje błąd coś w rodzaju „Tablica wejściowa jest dłuższa niż liczba kolumn w tej tabeli”.
Deweloper404
Jak zauważył Jay, upewnij się, że twoja tabela danych ma ten sam schemat co DataRows w twojej tablicy DataRow
Mitch Wheat
1
Tak ... próbowałem. Użyłem Datatable1 = datatable2.Clone (); Teraz to działa ... Dziękuję :-)
Developer404
Próbowałem tego z tablicą wierszy i nie zadziałało. Dla każdego wiersza w tablicy wierszy utworzyłem nowy wiersz, skopiowałem właściwość ItemArray z oryginalnego wiersza, a następnie funkcja dodawania działała.
Steve
1
Wydaje się, że nie działa to w .NET Framework 4.0 z wysłanym przykładem ani z klonowaniem pliku „dt” z dstata.tables [0]. Odpowiedź @ joe działała dla moich celów. Błąd wersji bez klonowania: „ Input array is longer than the number of columns in this table.”. Błąd wersji z klonem: „ 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.” Uwaga: StoreOrderjest to pierwsza kolumna w schemacie tabeli. Wygląda na to, że próbuje wcisnąć cały datarow do tej pierwszej kolumny
Brian Webster,
11

Innym sposobem jest użycie 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
źródło
9

Prosty sposób to:

// 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
źródło
5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   
user1036202
źródło
4
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();
Miriam
źródło
4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();
Rajenthiran T
źródło
3

.Net 3.5+ dodał DataTableExtensions, użyj metody DataTableExtensions.CopyToDataTable

Dla tablicy datarow po prostu użyj .CopyToDataTable (), a zwróci ona datatable.

Do użytku pojedynczego

new DataRow[] { myDataRow }.CopyToDataTable()
Haseeb Mukhtar
źródło
2

Oto rozwiązanie. Powinno działać dobrze.

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
źródło
1

Jeśli ktoś tego potrzebuje w VB.NET:

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next
logiksolog
źródło
1

Możesz użyć System.Linq w ten sposób:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}
Andrés
źródło
1

Najpierw musisz sklonować strukturę tabeli danych, a następnie zaimportować wiersze za pomocą pętli for

DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}
Awais Shabir
źródło
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
źródło