如何将一个数据表中的一列复制到一个新的数据表?当我尝试这样做时,出现错误“列 'XXX' 已经属于另一个数据表。”
dataColumn = datatable1.Columns[1];
datatable2 = new DataTable();
datatable2.Columns.Add(dataColumn);
感谢您的提前支持。
如何将一个数据表中的一列复制到一个新的数据表?当我尝试这样做时,出现错误“列 'XXX' 已经属于另一个数据表。”
dataColumn = datatable1.Columns[1];
datatable2 = new DataTable();
datatable2.Columns.Add(dataColumn);
您无法复制DataColumns。您需要在新数据表中创建一个与旧数据表的列具有相同数据类型的新DataColumn,然后需要运行一个FOR循环,将所有数据从旧数据表带入新数据表。
请参阅以下代码。这假设数据表具有完全相同的行数。
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
dt2.Columns.Add("ColumnA", dt1.Columns["ColumnA"].DataType);
for (int i = 0; i < dt1.Rows.Count; i++)
{
dt2.Rows[i]["ColumnA"] = dt1.Rows[i]["ColumnA"];
}
此外,如果要复制的数据是引用类型而不是值类型,则可能需要查看该类型是否有.Clone()方法,或者自己编写一个。只在FOR循环中执行'this = that'将不适用于引用类型。
您不能复制DataColumn。(DataColumn与其表非常紧密地耦合在一起)
相反,您可以添加一个具有相同名称和数据类型的新列。
您可能正在寻找DataTable.Clone()
,它将创建整个表的结构副本。(具有相同的架构,但没有数据)
想法一下,你的DataTable是否都在同一个DataSet中?
如果是这样,你可以在两个表的列之间创建一个命名为DataRelation的关系(类似于外键)。
然后,你可以向表中添加一个计算列,它的Expression属性设置为“Child(RelationName).ColumnName”或“Parent(RelationName).ColumnName”,具体取决于关系的方向。
这将给你与复制列相同的效果,但我认为它只会惰性地评估它。所以也许它会给你你需要的东西。
这里有一个示例说明它的工作原理。该示例使用Sum聚合函数,但你只需要引用列名,它就会在你的DataTable中复制它。
myDataSet.Relations.Add(
"Orders2OrderLines",
myDataSet.Tables["Orders"].Columns["OrderID"],
myDataSet.Tables["OrderLines"].Columns["OrderID"]);
ordersTable.Columns.Add("OrderTotal", typeof(decimal), "Sum(Child(Orders2OrderLines).ExtendedPrice)");
HTH
foreach (DataTable table in DATASET.Tables)
{
DataColumn yourDataCollumn = new DataColumn("Name of DataCollumn", typeof(Your data type));
// your logic here
}
希望它有所帮助...
DataTable tableOne = getTableOne();
DataTable tableTwo = getTableTwo();
var oneColumns = tableOne.Columns.Cast<DataColumn>()
.Select(p => new Column(p.ColumnName, DataType))
.ToArray();
var twoColumns = tableTwo.Columns.Cast<DataColumn>()
.Select(p => new DataColumn(p.ColumnName, p.DataType))
.ToArray();
var matches = (from a in tableOne.AsEnumerable()
join b in tableTwo.AsEnumerable() on a["column_name"] equals b["column_name"]
select a.ItemArray.Concat(b.ItemArray)).ToArray();
DataTable merged = new DataTable();
merged.Columns.AddRange(oneColumns);
merged.Columns.AddRange(twoColumns);
foreach (var m in matches) { merged.Rows.Add(m.ToArray()); }
无需循环,参考此处,希望这能解决你的问题...
DataTable dt = new DataTable();
//fill the dt here
DataTable dt2 = new DataTable();
string[] strCols = {"Column Name to copy"};
dt2 = dt.DefaultView.ToTable("newTableName", false, strCols);