复制数据集内容

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

  • 创建 DataSet 的原样副本,其中包含架构、数据、行状态信息和行版本。

  • 创建包含现有 DataSet 的架构但仅包含已修改行的 DataSet。 可以返回已修改的所有行或者指定特定的 DataRowState。 有关行版本的详细信息,请参阅行状态和行版本

  • 仅复制 DataSet 的架构(即关系结构),而不复制任何行。 可以使用 DataTable 将行导入现有 ImportRow

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

Dim copyDataSet As DataSet = customerDataSet.Copy()  
DataSet copyDataSet = customerDataSet.Copy();  

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

' Copy all changes.  
Dim changeDataSet As DataSet = customerDataSet.GetChanges()  
' Copy only new rows.  
Dim addedDataSetAs DataSet = _  
    customerDataSet.GetChanges(DataRowState.Added)  
// Copy all changes.  
DataSet changeDataSet = customerDataSet.GetChanges();  
// Copy only new rows.  
DataSet addedDataSet= customerDataSet.GetChanges(DataRowState.Added);  

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

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

Dim customerDataSet As New DataSet  
        customerDataSet.Tables.Add(New DataTable("Customers"))  
        customerDataSet.Tables("Customers").Columns.Add("Name", GetType(String))  
        customerDataSet.Tables("Customers").Columns.Add("CountryRegion", GetType(String))  
        customerDataSet.Tables("Customers").Rows.Add("Juan", "Spain")  
        customerDataSet.Tables("Customers").Rows.Add("Johann", "Germany")  
        customerDataSet.Tables("Customers").Rows.Add("John", "UK")  
  
Dim germanyCustomers As DataSet = customerDataSet.Clone()  
  
Dim copyRows() As DataRow = _  
  customerDataSet.Tables("Customers").Select("CountryRegion = 'Germany'")  
  
Dim customerTable As DataTable = germanyCustomers.Tables("Customers")  
Dim copyRow As DataRow  
  
For Each copyRow In copyRows  
  customerTable.ImportRow(copyRow)  
Next  
DataSet customerDataSet = new DataSet();  
customerDataSet.Tables.Add(new DataTable("Customers"));  
customerDataSet.Tables["Customers"].Columns.Add("Name", typeof(string));  
customerDataSet.Tables["Customers"].Columns.Add("CountryRegion", typeof(string));  
customerDataSet.Tables["Customers"].Rows.Add("Juan", "Spain");  
customerDataSet.Tables["Customers"].Rows.Add("Johann", "Germany");  
customerDataSet.Tables["Customers"].Rows.Add("John", "UK");  
  
DataSet germanyCustomers = customerDataSet.Clone();  
  
DataRow[] copyRows =
  customerDataSet.Tables["Customers"].Select("CountryRegion = 'Germany'");  
  
DataTable customerTable = germanyCustomers.Tables["Customers"];  
  
foreach (DataRow copyRow in copyRows)  
  customerTable.ImportRow(copyRow);  

请参阅