Простой способ преобразовать массив datarow в datatable

99

Я хочу преобразовать DataRowмассив в DataTable... Как это проще всего сделать?

Разработчик404
источник

Ответы:

92

Почему бы не перебрать ваш массив DataRow и не добавить (используя DataRow.ImportRow, если необходимо, чтобы получить копию DataRow), что-то вроде:

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

Убедитесь, что ваш dataTable имеет ту же схему, что и DataRows в вашем массиве DataRow.

Джей Риггз
источник
1
Этот метод полезен, если вы получаете сообщение об ошибке «Недопустимый источник данных используется для MyControl. Допустимый источник данных должен реализовывать либо IListSource, либо IEnumerable» при попытке привязать DataRow непосредственно к свойству DataSource элемента управления. Вот как это сделать:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads
+1 Я предпочитаю это, а не rowArray.CopyToDataTable();потому, что это сохраняет схему таблицы и не заменяет ее новым объектом таблицы!
Mojtaba Rezaeian
7
Очень хорошо ! Но я бы предложил клонировать DataTable до foreach. Он копирует формат DataTable: newDataTable = oldDataTable.clone ();
Whiplash
2
Подсказка: в вашей таблице данных должны быть созданы столбцы, иначе она не будет правильно заполнена.
логиксолог 03
193

Для .Net Framework 3.5+

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

Но если в массиве нет строк, это может вызвать такие ошибки, как «Источник не содержит строк данных» . Поэтому, если вы решите использовать этот метод CopyToDataTable(), вам следует проверить массив, чтобы узнать, есть ли в нем строки данных или нет.

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

Ссылка доступна в MSDN: DataTableExtensions.CopyToDataTable Method (IEnumerable)

Джо
источник
1
Откуда вы взяли copyToDataTable()? Я не нашел его в .net 2.0
SMUsamaShah
11
Это следует отметить как правильный ответ, поскольку copyToDataTable()метод создает точную копию столбцов выбранных строк, а datatable.ImportRow(row)метод не делает
Данте
5
этот метод не подходит, если в таблице уже есть строки, так как он заменяет все, что уже есть. Если таблица для начала пуста, все в порядке.
Franck
5
Я предпочитаю этот метод, если функции .Net оптимизированы. Не забудьте добавить ссылку на System.Data.DataSetExtensions в свой проект, чтобы вы не расстраивались, спрашивая себя, почему этот метод отсутствует (как я)
Broken_Window 08
Не забудьте добавить сборку System.Data.DataSetExtensions в ссылки
Вагнер Гон
12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);
Митч Уит
источник
2
Я уже пробовал вот так .. Возникает ошибка типа «Входной массив длиннее, чем количество столбцов в этой таблице».
Developer404
Как указал Джей: «Убедитесь, что ваш dataTable имеет ту же схему, что и DataRows в вашем массиве DataRow»
Митч Уит,
1
Да .. Я пробовал. Я использовал Datatable1 = datatable2.Clone (); Теперь он работает ... Спасибо :-)
Developer404
Я пробовал это с массивом строк, и это не сработало. Для каждой строки в массиве строк я создал новую строку, скопировал свойство ItemArray из исходной строки, а затем сработало добавление.
Стив
1
Похоже, что это не работает ни в .NET Framework 4.0, ни с опубликованным образцом, ни с клонированием «dt» из dstata.tables [0]. Ответ @joe в конечном итоге сработал для моих целей. Ошибка версии без клонирования: " Input array is longer than the number of columns in this table.". Ошибка версии With-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." Примечание: StoreOrderэто первый столбец в схеме таблицы. Похоже, он пытается втиснуть всю строку данных в первую колонку
Брайан Вебстер
11

Другой способ - использовать 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");
Иланс
источник
10

Простой способ:

// 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 = myDataRowCollection.CopyToDataTable<DataRow>();
Мириам
источник
5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   
user1036202
источник
5
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();
Раджентиран Т
источник
3

.Net 3.5+ добавил DataTableExtensions, используйте метод DataTableExtensions.CopyToDataTable

Для массива datarow просто используйте .CopyToDataTable (), и он вернет данные.

Для одиночного использования datarow

new DataRow[] { myDataRow }.CopyToDataTable()
Хасиб Мухтар
источник
2

Вот решение. Должно работать нормально.

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

Если кому-то это нужно в VB.NET:

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next
логиксолог
источник
1

Вы можете использовать System.Linq так:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}
Андрес
источник
1

Вам нужно сначала клонировать структуру таблицы данных, а затем импортировать строки с помощью цикла 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);
}
АВИНАШ ДУБЕЙ
источник