说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何合并两个dataset

编辑:说三道四文库 发布时间:2018-07-19 08:00
HTML文档下载 WORD文档下载 PDF文档下载
用什么方法可以把获取的两个dataset的数据合成一个表?
只是简单的把第二个表的数据加在第一个后面就行了
Dataset.Merge(Dataset1)
用Merge方法就可以了。
将此 DataSet 与指定的 DataSet 合并。

[Visual Basic]
<Serializable>
Overloads Public Sub Merge( _
   ByVal dataSet As DataSet _
)
[C#]
[Serializable]
public void Merge(
   DataSet dataSet
);
[C++]
[Serializable]
public: void Merge(
   DataSet* dataSet
);
[JScript]
public
   Serializable
function Merge(
   dataSet : DataSet
);
参数
dataSet 
其数据和架构将被合并的 DataSet。 
异常
异常类型 条件 
ConstraintException 无法启用一个或多个约束。 
ArgumentNullException dataSet 为空引用(Visual Basic 中为 Nothing)。 

备注
Merge 方法用于合并架构大致相似的两个 DataSet 对象。合并在客户端应用程序上通常用于将数据源中最近的更改合并到现有的 DataSet 中。这使客户端应用程序能够拥有用数据源中的最新数据刷新的 DataSet。

通常在一系列过程的末尾调用 Merge 方法,这些过程涉及验证更改、消除错误、使用更改更新数据源并最后刷新现有的 DataSet。

在客户端应用程序上,通常有这样一个按钮,用户可以单击它来收集已更改的数据并对其进行验证,然后将其发送回中间层组件。在这种情况下,将首先调用 GetChanges 方法。该方法返回另一个为验证和合并而优化的 DataSet。第二个 DataSet 对象只包含已更改的 DataTable 和 DataRow 对象,结果产生初始 DataSet 的子集。该子集通常较小,因此可以更有效率地传递回中间层组件。然后,中间层组件将通过存储过程使用更改更新初始数据源。然后,中间层可以发送回一个新的 DataSet,其中包含数据源中的初始数据和最新数据(通过再次运行初始查询);或者它可以发送回包含从数据源对其进行的所有更改的子集。(例如,如果数据源自动创建唯一主键值,则可以将这些值传播回客户端应用程序。)在哪一种情况下都可以使用 Merge 方法将返回的 DataSet 合并回客户端应用程序的初始 DataSet。

为了便于解释 Merge 方法,我们使用“目标”(target) 表示当前的 DataSet,使用“源”(source) 表示第二个(参数)DataSet。如此命名目标 DataSet 是因为它是操作(合并)针对的对象。第二个 DataSet 被称为“源”是因为它包含的信息不更改,而是被合并到当前的 DataSet 中。

当调用 Merge 方法时,由于架构可能已更改,因此对两个 DataSet 对象的架构进行比较。例如,在企业对企业的情况下,可能已经通过自动过程将新列添加到 XML 架构中。如果源 DataSet 包含目标中缺少的架构元素(已添加的 DataColumn 对象),则可以通过将 missingSchemaAction 参数设置为 MissingSchemaAction.Add 将该架构元素添加到目标中。在这种情况下,合并的 DataSet 将包含已添加的架构和数据。

合并架构之后合并数据。

将新的源 DataSet 合并到目标中时,任何 DataRowState 值为 Unchanged、Modified 或 Deleted 的源行都与具有相同主键值的目标行匹配。DataRowState 值为 New 的源行同包含与新源行相同的主键值的新目标行匹配。

合并过程中将禁用约束。如果在合并结束时无法启用任何约束,则会在禁用约束的同时生成 ConstraintException 并保留合并的数据。这种情况下,EnforceConstraints 属性将设置为 false,并且所有无效行都会标记为出错。在试图将 EnforceConstraints 属性重置为 true 之前,必须消除这些错误。

示例
[C#] 
private void DemonstrateMerge() {
   // Create a DataSet with one table, two columns, and three rows.
   DataSet ds = new DataSet("myDataSet");
   DataTable t = new DataTable("Items");
   DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32"));
   c1.AutoIncrement=true;
   DataColumn c2 = new DataColumn("Item", Type.GetType("System.Int32"));
   // DataColumn array to set primary key.
   DataColumn[] keyCol= new DataColumn[1];
   DataRow r;
   // Create variable for temporary DataSet. 
   DataSet xSet;
   // Add columns to table, and table to DataSet.   
   t.Columns.Add(c1);
   t.Columns.Add(c2);
   ds.Tables.Add(t);
   // Set primary key column.
   keyCol[0]= c1;
   t.PrimaryKey=keyCol;
   // Add ten rows.
   for(int i = 0; i <10;i++){
      r=t.NewRow();
      r["Item"]= i;
      t.Rows.Add(r);
   }
   // Accept changes.
   ds.AcceptChanges();
   PrintValues(ds, "Original values");
   // Change two row values.
   t.Rows[0]["Item"]= 50;
   t.Rows[1]["Item"]= 111;
   // Add one row.
   r=t.NewRow();
   r["Item"]=74;
   t.Rows.Add(r);
   // Insert code for error checking. Here we set one row in error.
   t.Rows[1].RowError= "over 100";
   PrintValues(ds, "Modified and New Values");
   // If the table has changes or errors, create a subset DataSet.
   if(ds.HasChanges(DataRowState.Modified | DataRowState.Added)& ds.HasErrors){
      // Use GetChanges to extract subset.
      xSet = ds.GetChanges(DataRowState.Modified|DataRowState.Added);
      PrintValues(xSet, "Subset values");
      // Insert code to reconcile errors. In this case, we'll reject changes.
      foreach(DataTable xTable in xSet.Tables){
         if (xTable.HasErrors){
            foreach(DataRow xRow in xTable.Rows){
            //Console.WriteLine(xRow["Item"]);
                 if((int)xRow["Item",DataRowVersion.Current ]> 100){
                  xRow.RejectChanges();
                  xRow.ClearErrors();
               }
            }
         }
      }
      PrintValues(xSet, "Reconciled subset values");
      // Merge changes back to first DataSet.
      ds.Merge(xSet);
      PrintValues(ds, "Merged Values");
   }
}

private void PrintValues(DataSet ds, string label){
   Console.WriteLine("\n" + label);
   foreach(DataTable t in ds.Tables){
      Console.WriteLine("TableName: " + t.TableName);
      foreach(DataRow r in t.Rows){
         foreach(DataColumn c in t.Columns){
            Console.Write("\t " + r[c] );
         }
         Console.WriteLine();
      }
   }
}
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘