【发布时间】:2011-01-08 12:20:14
【问题描述】:
我想将 DataRow 数组转换为 DataTable ... 最简单的方法是什么?
【问题讨论】:
标签: c# arrays datatable datarow
我想将 DataRow 数组转换为 DataTable ... 最简单的方法是什么?
【问题讨论】:
标签: c# arrays datatable datarow
适用于 .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 Method (IEnumerable)
【讨论】:
copyToDataTable()?我在 .net 2.0 中没有找到它
copyToDataTable() 方法会创建所选行的列的完美副本,而datatable.ImportRow(row) 方法不会
为什么不遍历您的 DataRow 数组并添加(如果需要,使用 DataRow.ImportRow 来获取 DataRow 的副本),例如:
foreach (DataRow row in rowArray) {
dataTable.ImportRow(row);
}
确保您的 dataTable 与 DataRow 数组中的 DataRows 具有相同的架构。
【讨论】:
DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
rowArray.CopyToDataTable();,因为它保留了表模式并且不会用新的表对象替换它!
DataTable dt = new DataTable();
DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");
dt.Rows.Add(dr);
【讨论】:
Input array is longer than the number of columns in this table.”。带有克隆版本错误:“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 是表架构中的第一列。似乎它试图将整个数据行塞入第一列
另一种方法是使用 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");
【讨论】:
简单的方法是:
// 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());
【讨论】:
DataTable Assetdaterow =
(
from s in dtResourceTable.AsEnumerable()
where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
select s
).CopyToDataTable();
【讨论】:
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();
【讨论】:
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{
dt.ImportRow(dr);
}
【讨论】:
.Net 3.5+ 添加DataTableExtensions,使用DataTableExtensions.CopyToDataTable 方法
对于数据行数组,只需使用 .CopyToDataTable() 即可返回数据表。
对于单个数据行使用
new DataRow[] { myDataRow }.CopyToDataTable()
【讨论】:
您可以像这样使用 System.Linq:
if (dataRows != null && dataRows.Length > 0)
{
dataTable = dataRows.AsEnumerable().CopyToDataTable();
}
【讨论】:
这里是解决方案。它应该可以正常工作。
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);
}
【讨论】:
如果有人在 VB.NET 中需要它:
Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
yourNewDataTable.ImportRow(dataRow)
Next
【讨论】:
你需要先克隆数据表的结构,然后使用for循环导入行
DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
dataTable.ImportRow(row);
}
【讨论】:
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);
}
【讨论】: