C#复制或克隆DataRow的简单方法?

时间:2012-08-19 07:39:29

标签: c# datatable datarow

我正在寻找一种简单的方法来克隆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();

编辑:我认为第二个代码片段实际上并不编译。

4 个答案:

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