我正在寻找一种简单的方法来克隆DataRow。有点像拍摄该行的快照并保存它。然后原始Row的值可以自由更改,但我们仍然有另一个保存的副本不会更改。这是正确的方法吗?
DataRow Source, Destination;
//Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;
这只是将Snapshot的ItemArray引用设置为指向Source中的那个或者它实际上是否单独创建一个副本?我应该这样做吗?
Destination.ItemArray = Source.ItemArray.Clone();
编辑:我认为第二个代码片段实际上并不编译。
答案 0 :(得分:165)
您可以使用ImportRow
method将Data从DataTable复制到具有相同架构的DataTable:
var row = SourceTable.Rows[RowNum];
DestinationTable.ImportRow(row);
<强>更新强>
使用您的新编辑,我相信:
var desRow = dataTable.NewRow();
var sourceRow = dataTable.Rows[rowNum];
desRow.ItemArray = sourceRow.ItemArray.Clone() as object[];
将起作用
答案 1 :(得分:1)
似乎您不想将整个DataTable保留为副本,因为您只需要一些行,对吗?如果您有一个条件,可以在表上选择一个选项来指定,则可以仅将这些行复制到一个额外的DataRow备份数组中,例如
DataRow[] rows = sourceTable.Select("searchColumn = value");
.Select()函数有几个选项,例如可以读为SQL
SELECT * FROM sourceTable WHERE searchColumn = value;
然后,您可以如上所述导入所需的行。
targetTable.ImportRows(rows[n])
...对于您喜欢的任何有效n,但每个表中的列都必须相同。
您应该了解有关ImportRow的一些信息,即使用主键在运行时会出错!
首先,我想检查是否存在由于缺少主键而导致行失败的行,但是随后检查总是失败。最后,我决定彻底清除现有行,然后再次导入我想要的行。
第二期确实有助于了解发生了什么。我使用导入功能的方式是用一列中的交换条目来复制行。我意识到它总是在变化,仍然是对数组中行的引用。我首先必须导入原始文件,然后更改所需的条目。
该参考资料还解释了我第一次尝试导入行时出现的主键错误,因为它实际上已经加倍了。
答案 2 :(得分:0)
注意:cuongle's helfpul answer具有所有要素,但是可以简化解决方案(不需要.ItemArray
),并且可以重新设计框架以更好地匹配所提出的问题。
要为给定的System.Data.DataRow
实例创建(隔离的)克隆,您可以执行以下操作:
// Assume that variable `table` contains the source data table.
// Create an auxiliary, empty, column-structure-only clone of the source data table.
var tableAux = table.Clone();
// Note: .Copy(), by contrast, would clone the data rows also.
// Select the data row to clone, e.g. the 2nd one:
var row = table.Rows[1];
// Import the data row of interest into the aux. table.
// This creates a *shallow clone* of it.
// Note: If you'll be *reusing* the aux. table for single-row cloning later, call
// tableAux.Clear() first.
tableAux.ImportRow(row);
// Extract the cloned row from the aux. table:
var rowClone = tableAux.Rows[0];
注意: 浅克隆已执行,它与值类型实例的列值一样按原样工作,但会做更多工作还需要创建包含引用类型实例的列值的独立副本(并且不一定总是可以创建这样的独立副本)。
答案 3 :(得分:-3)
但是为了确保在新表中可以访问新行,您需要关闭表:
DataTable destination = new DataTable(source.TableName);
destination = source.Clone();
DataRow sourceRow = source.Rows[0];
destination.ImportRow(sourceRow);