将 DataRow 数组转换为 DataTable 的简单方法

112

我想将一个DataRow数组转换成DataTable...最简单的方法是什么?

15个回答

215

针对 .Net Framework 3.5 及以上版本

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

但是,如果数组中没有行,它可能会导致错误,例如 The source contains no DataRows。因此,如果您决定使用此方法 CopyToDataTable(),您应该检查数组以确定它是否具有数据行。

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

MSDN上提供了相关资料: DataTableExtensions.CopyToDataTable方法(IEnumerable)


1
你从哪里得到了 copyToDataTable()?我在 .net 2.0 中没有找到它。 - SMUsamaShah
11
由于copyToDataTable()方法创建了选定行列的完全副本,而datatable.ImportRow(row)方法则没有,因此应将其标记为正确答案。 - Dante
5
如果表格中已经有行,则此方法不好,因为它会替换掉已经存在的内容。如果一开始表格是空的,则没问题。 - Franck
5
只要.Net函数被优化,我更喜欢这种方法。不要忘记在项目中添加对System.Data.DataSetExtensions的引用,这样你就不会像我一样感到沮丧,纳闷为什么缺少了这种方法。 - Broken_Window
请记得在引用中添加 System.Data.DataSetExtensions 程序集。 - Vagner Gon

98
为什么不遍历DataRow数组并添加(如有必要使用DataRow.ImportRow获取DataRow的副本),类似以下方式:
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

确保您的dataTable与DataRow数组中的DataRows具有相同的架构。


1
如果您尝试将DataRow直接绑定到控件的DataSource属性时,出现“正在使用无效数据源进行MyControl。有效数据源必须实现IListSource或IEnumerable”错误消息,则此技术非常有用。以下是如何执行此操作的示例代码:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable; - humbads
+1 我更喜欢这种方法,而不是 rowArray.CopyToDataTable();,因为它保留了表结构,而不是用新的表对象替换它! - Mojtaba Rezaeian
9
好的!但是我建议在 foreach 之前先克隆 DataTable。这将复制 DataTable 的格式:newDataTable = oldDataTable.clone(); - Whiplash
3
提示:您的数据表必须创建列,否则它将无法正确填充。 - logixologist

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
我已经尝试过这样了.. 出现了一个错误,大致意思是“输入数组的长度超过了该表格的列数。” - Developer404
正如Jay所指出的那样,请确保您的dataTable与DataRow数组中的DataRows具有相同的架构。 - Mitch Wheat
1
是的,我尝试过了。我使用了 Datatable1=datatable2.Clone(); 现在它可以工作了...谢谢 :-) - Developer404
我尝试使用行数组,但它没有起作用。对于行数组中的每一行,我创建了一个新行,复制了原始行的ItemArray属性,然后添加操作成功了。 - Steve
1
这个示例在.NET Framework 4.0中似乎无法正常工作,即使是从dstata.tables[0]克隆的"dt"也不行。@joe的回答最终适用于我的用途。无克隆版本错误:"输入数组的长度超过了此表中的列数。"。有克隆版本错误:"无法将类型为'System.Data.DataRow'的对象转换为类型'System.IConvertible'。无法将<System.Data.DataRow>存储在StoreOrder列中。预期类型是Int64." 注意:StoreOrder是表模式中的第一列。看起来它正在试图将整个数据行压缩到第一列中。 - Brian Webster
它试图使用其输入作为“用于创建新行的值数组”来创建一个数据行。从任何角度来看都不好。 - Eugene Ryabtsev

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");

11

简单的方法是:

// 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());

6
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();

5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   

5
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();

4

.Net 3.5+新增了DataTableExtensions,可以使用DataTableExtensions.CopyToDataTable方法。

对于datarow数组,只需使用.CopyToDataTable()即可返回datatable。

对于单个datarow使用

new DataRow[] { myDataRow }.CopyToDataTable()

3

You could use System.Linq like this:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接