为了在不影响初始数据的情况下使用数据,或者使用 DataSet 中数据的子集,可以创建 DataSet 的副本。当复制 DataSet 时,可以:

若要创建包含架构和数据的 DataSet 原样副本,请使用 DataSetCopy 方法。以下代码示例显示如何创建 DataSet 的原样副本。

Dim copyDS As DataSet = custDS.Copy()

DataSet copyDS = custDS.Copy();

若要创建包含架构并仅包含表示 AddedModifiedDeleted 行的数据的 DataSet 副本,请使用 DataSetGetChanges 方法。当调用 GetChanges 时,也可以通过传递 DataRowState 值来使用 GetChanges 仅返回具有指定行状态的行。以下代码示例显示如何在调用 GetChanges 时传递 DataRowState

' Copy all changes.
Dim changeDS As DataSet = custDS.GetChanges()
' Copy only new rows.
Dim addedDS As DataSet = custDS.GetChanges(DataRowState.Added)

// Copy all changes.
DataSet changeDS = custDS.GetChanges();
// Copy only new rows.
DataSet addedDS = custDS.GetChanges(DataRowState.Added);

若要创建仅包含架构的 DataSet 副本,请使用 DataSetClone 方法。也可以使用 DataTable ImportRow 方法将现有行添加到克隆的 DataSet 中。ImportRow 将数据、行状态和行版本信息添加到指定表中。只有当列名称匹配且数据类型兼容时,才会添加列值。

以下代码示例创建 DataSet 的复本,然后为 Country 列的值为“Germany”的客户将初始 DataSet 中的行添加到 DataSet 复本中的 Customers 表。

Dim custGermanyDS As DataSet = custDS.Clone()

Dim copyRows() As DataRow = custDS.Tables("Customers").Select("Country = 'Germany'")

Dim custTable As DataTable = custGermanyDS.Tables("Customers")
Dim copyRow As DataRow

For Each copyRow In copyRows
  custTable.ImportRow(copyRow)
Next

DataSet custGermanyDS = custDS.Clone();

DataRow[] copyRows = custDS.Tables["Customers"].Select("Country = 'Germany'");

DataTable custTable = custGermanyDS.Tables["Customers"];

foreach (DataRow copyRow in copyRows)
  custTable.ImportRow(copyRow);