无法将datacolumn从一个数据表复制到另一个
如何将1个数据列从1个数据表复制到新的数据表。当我尝试这样做时,出现错误列'XXX'已经属于另一个DataTable。无法将datacolumn从一个数据表复制到另一个
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。 (DataColumns与它们的表格紧密耦合)
相反,您可以添加具有相同名称和数据类型的新列。
您可能正在寻找DataTable.Clone()
,它将创建整个表的结构副本。 (使用相同的架构,但没有数据)
谢谢..但我需要在新的数据表中也有数据.. – 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
我很确定它不会懒惰地评估。此外,列中的值将永久链接,这可能是也可能不是他想要的。 – SLaks 2010-11-15 14:05:40
@SLaks - 你对链接是正确的 - 根据你的需要,它可以是好的或坏的。我认为这是懒惰的原因是因为链接。我想在内部它只是一个绑定到原始表中的数据的委托 - 所以实际上不会发生拷贝。我很想知道我是否错了,因为我从来没有测试过这个... – sheikhjabootie 2010-11-15 14:11:58
谢谢..但我的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);
创建一个新的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()); }
我不认为他们想要将一个表与另一个表合并在一起,听起来像是他们只想从第一个表中选择一个表。 – Jesse 2013-11-07 21:02:59
如果您发布的是代码或XML,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010)以良好地格式化和语法突出显示它! – 2010-11-15 14:14:29
[我们如何将数据表的datacable的数据复制到另一个数据表?](http://*.com/questions/2583898/how-can-we-copy-the-data-of-the -datacolumn-of-datatable到另一个datatable) – 2011-09-22 11:15:25