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

问题描述 投票:111回答:4

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

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

c# datatable datarow
4个回答
178
投票

您可以使用ImportRow method将行从数据表复制到具有相同架构的数据表:

ImportRow

更新:

相信您使用新的Edit,

var row = SourceTable.Rows[RowNum];
DestinationTable.ImportRow(row);

将工作


1
投票

注意:var desRow = dataTable.NewRow(); var sourceRow = dataTable.Rows[rowNum]; desRow.ItemArray = sourceRow.ItemArray.Clone() as object[]; 具有所有要素,但可以简化解决方案(不需要cuongle's helfpul answer),并且可以重新设计框架以更好地匹配所询问的问题。

要创建给定.ItemArray实例的(隔离的)克隆,请执行以下操作:

System.Data.DataRow

注意:Shallow

已执行克隆] >>,它与value type实例的列值保持原样工作,但是还需要做更多的工作来创建包含以下内容的列值的独立副本引用类型实例(并非总是可以创建这样的独立副本)。

似乎您不想将整个DataTable保留为副本,因为您只需要一些行,对吗?如果您有一个条件,可以在表上进行选择,则可以将这些行仅复制到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];

。Select()函数有几个选项,例如可以读取为SQL

DataRow[] rows = sourceTable.Select("searchColumn = value");

然后,您可以如上所述导入所需的行。

SELECT * FROM sourceTable WHERE searchColumn = value;

...对于您喜欢的任何有效n,但每个表中的列都必须相同。

关于ImportRow,您应该了解的一些事情是,使用主键时在运行期间会出现错误!

首先,我想检查是否存在由于缺少主键而导致行失败的行,但随后检查总是失败。最后,我决定完全清除现有行,然后再次导入我想要的行。

第二个问题确实有助于了解发生了什么。我使用导入功能的方式是用一列中的交换条目来复制行。我意识到它总是在变化,仍然是对数组中行的引用。我首先必须导入原始文件,然后更改所需的条目。

该参考资料还解释了我第一次尝试导入行时出现的主键错误,因为它实际上已经加倍了。

但是要确保新表中的新行可访问,您需要关闭表:

targetTable.ImportRows(rows[n])

0
投票

似乎您不想将整个DataTable保留为副本,因为您只需要一些行,对吗?如果您有一个条件,可以在表上进行选择,则可以将这些行仅复制到DataRow的额外备份阵列中,例如


-4
投票

但是要确保新表中的新行可访问,您需要关闭表:

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.