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

问题描述:

如何将1个数据列从1个数据表复制到新的数据表。当我尝试这样做时,出现错误列'XXX'已经属于另一个DataTable。无法将datacolumn从一个数据表复制到另一个

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

由于提前

+1

如果您发布的是代码或XML,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010)以良好地格式化和语法突出显示它! – 2010-11-15 14:14:29

+0

[我们如何将数据表的datacable的数据复制到另一个数据表?](http://*.com/questions/2583898/how-can-we-copy-the-data-of-the -datacolumn-of-datatable到另一个datatable) – 2011-09-22 11:15:25

您无法复制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'就不会在引用类型上工作。

+0

@Lane谢谢..但我认为这种方法将是非常昂贵的我可能不得不复制多于一列,并且行可能超过1百万。 – Ananth 2010-11-15 13:33:10

+1

您可以在同一个循环中以多列复制数据。这是做到这一点的唯一方法。 – SLaks 2010-11-15 13:34:54

+0

同意。如果要将一列从一个数据表复制到另一个数据表,这是实现此目的的唯一方法。它可能不像你想象的那么昂贵。试试看看。 – Lane 2010-11-15 13:45:46

您不能复制的DataColumn。 (DataColumns与它们的表格紧密耦合)

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

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

+0

谢谢..但我需要在新的数据表中也有数据.. – Ananth 2010-11-15 13:31:27

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

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

然后,您可以根据关系的方向将Calculated DataColumn添加到您的表中,该表的Expression属性设置为“Child(RelationName).ColumnName”或“Parent(RelationName).ColumnName”。

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

有一个例子here这是如何工作的。该示例使用总和聚合函数,但是你只需要引用的列名,它会复制它在你的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

+0

我很确定它不会懒惰地评估。此外,列中的值将永久链接,这可能是也可能不是他想要的。 – SLaks 2010-11-15 14:05:40

+0

@SLaks - 你对链接是正确的 - 根据你的需要,它可以是好的或坏的。我认为这是懒惰的原因是因为链接。我想在内部它只是一个绑定到原始表中的数据的委托 - 所以实际上不会发生拷贝。我很想知道我是否错了,因为我从来没有测试过这个... – sheikhjabootie 2010-11-15 14:11:58

+0

谢谢..但我的DataTables都在同一个DataSet中。 – Ananth 2010-11-17 05:20:21

无需循环,请参考这一点,希望这应解决你的问题...

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

创建一个新的DataTable不是在这个问题中被问到的。 (另外,第二个构造函数调用是多余的。) – 2011-09-22 11:14:10

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

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

希望它的帮助...

我用下面的代码来合并两个主要使用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()); } 
+0

我不认为他们想要将一个表与另一个表合并在一起,听起来像是他们只想从第一个表中选择一个表。 – Jesse 2013-11-07 21:02:59