无法将数据列从一个数据表复制到另一个数据表

时间:2010-11-15 13:14:57

标签: c# .net datatable

如何将1个数据列中的1个数据列复制到新的数据表中。当我尝试这样做时,我得到错误列'XXX'已经属于另一个DataTable。?

dataColumn = datatable1.Columns[1];
datatable2 = new DataTable();
datatable2.Columns.Add(dataColumn);

先谢谢

6 个答案:

答案 0 :(得分:9)

您无法复制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'对引用类型不起作用。

答案 1 :(得分:4)

您无法复制DataColumn。 (DataColumns与其表格紧密耦合)

相反,您可以添加具有相同名称和数据类型的新列。

您可能正在寻找DataTable.Clone(),它将创建整个表的结构副本。 (使用相同的架构,但没有数据)

答案 2 :(得分:1)

只是想一想,你的DataTables是否在同一个DataSet中?

如果是这样,您可以在两个表的列之间创建一个名为DataRelation(想想外键)。

然后,您可以将计算的DataColumn添加到您的表中,其Expression属性设置为“Child(RelationName).ColumnName”或“Parent(RelationName).ColumnName”,具体取决于关系的方向。 / p>

这将给你与复制列相同的效果,但我相信它只是懒惰地评估它。所以它可能会给你你需要的东西。

有一个例子here,它是如何工作的。该示例使用 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

答案 3 :(得分:0)

问题是由c#无法重用创建的对象实例并在多个DataTables上使用它引起的。为此,必须为每个循环迭代创建一个新对象DataCollumn。

foreach (DataTable table in DATASET.Tables)
{
    DataColumn yourDataCollumn = new DataColumn("Name of DataCollumn", typeof(Your data type));
    // your logic here
}

希望有帮助...

答案 4 :(得分:0)

我使用下面的方法合并两个表,主要使用LINQ,并且只循环遍及末尾的行。我不会称之为漂亮,但确实有效。使用联接来阻止上面列出的一些假设。

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

答案 5 :(得分:-2)

不需要循环,请参阅此,希望这可以解决您的问题...

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