将datarow数组转换为datatable的简单方法


Answers:


91

为什么不遍历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 2012年

我更喜欢+1,而不是rowArray.CopyToDataTable();因为它保留了表模式,并且没有用新的表对象替换它!
Mojtaba Rezaeian

7
很好 !但是我建议在foreach之前克隆DataTable。它复制DataTable的格式:newDataTable = oldDataTable.clone();
Whiplash

2
提示:您的数据表必须具有创建的列,否则将无法正确填充。
logixologist

192

对于.Net Framework 3.5+

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

但是,如果数组中没有行,则可能会导致以下错误,例如源不包含DataRows。因此,如果决定使用此方法CopyToDataTable(),则应检查数组以了解其是否具有数据行。

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

MSDN上提供了参考: DataTableExtensions.CopyToDataTable方法(IEnumerable)


1
你从哪儿来的copyToDataTable()?我在.net 2.0中找不到它
SMUsamaShah 2011年

11
这应该被标记为正确答案,因为copyToDataTable()方法创建了所选行的列的完美副本,而datatable.ImportRow(row)方法却没有
Dante

5
如果表中已经有行,则此方法不好,因为这将替换现有的行。如果表为空开始就可以了。
弗朗克(Franck)2014年

5
只要优化.Net功能,我就更喜欢这种方法。不要忘记在项目中添加对System.Data.DataSetExtensions的引用,这样您就不会感到沮丧,问自己为什么缺少此方法(像我一样)
Broken_Window 2014年

记得在参考中添加System.Data.DataSetExtensions组件
Vagner Gon

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
我已经尝试过这种方法。发生类似“输入数组长于此表中的列数”之类的错误。
Developer404 2010年

正如Jay指出的那样,请确保您的dataTable具有与DataRow数组中的DataRows相同的架构
Mitch Wheat

1
是的。我尝试过。我使用了Datatable1 = datatable2.Clone(); 现在它正在工作...谢谢:-)
Developer404 2010年

我用行数组尝试了一下,但是没有用。对于行数组中的每一行,我创建了一个新行,从原始行复制了ItemArray属性,然后进行了添加。
史蒂夫

1
在发布示例的.NET Framework 4.0中,或者从dstata.tables [0]复制“ dt”时,这似乎都无法在.NET Framework 4.0中使用。@joe的答案确实可以满足我的需求。克隆版本错误:“ Input array is longer than the number of columns in this table.”。With-Clone Version Error:“ 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是表架构中的第一列。似乎正在尝试将整个数据行塞入第一列
Brian Webster

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

9

简单的方法是:

// 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 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(),它将返回datatable。

供单个数据行使用

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


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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.