晕阿。五星的速度就是快阿
补充一下
将指定的 DataSet 及其架构合并到当前 DataSet 中,在此过程中,将根据给定的参数保留或放弃在此 DataSet 中进行的任何更改。
[C#]
public void Merge(
   DataSet dataSet,
   bool preserveChanges
);
参数
dataSet 
数据和架构将被合并的 DataSet。 
preserveChanges 
要保留当前 DataSet 中的更改,则为 true;否则为 false。 
备注
Merge 方法用于合并架构大致相似的两个 DataSet 对象。合并在客户端应用程序上通常用于将数据源中最近的更改合并到现有的 DataSet 中。这使客户端应用程序能够拥有用数据源中的最新数据刷新的 DataSet。
通常在一系列过程的末尾调用 Merge 方法,这些过程涉及验证更改、消除错误、使用更改更新数据源并最后刷新现有的 DataSet。
在客户端应用程序中,通常有这样一个按钮,用户可以单击它来收集已更改的数据并对其进行验证,然后将其发送回中间层组件。在这种情况下,将首先调用 GetChanges 方法。该方法返回另一个为验证和合并而优化的 DataSet。第二个 DataSet 对象只包含已更改的 DataTable 和 DataRow 对象,结果产生初始 DataSet 的子集。该子集通常较小,因此可以更有效率地传递回中间层组件。然后,中间层组件将通过存储过程使用更改更新初始数据源。然后,中间层可以发送回一个新的 DataSet,其中包含数据源中的初始数据和最新数据(通过再次运行初始查询);或者它可以发送回包含从数据源对其进行的所有更改的子集。(例如,如果数据源自动创建唯一主键值,则可以将这些值传播回客户端应用程序。)在哪一种情况下都可以使用 Merge 方法将返回的 DataSet 合并回客户端应用程序的初始 DataSet。
当调用 Merge 方法时,由于架构可能已更改,因此对两个 DataSet 对象的架构进行比较。例如,在企业对企业的情况下,可能已经通过自动过程将新列添加到 XML 架构中。如果源 DataSet 包含目标中缺少的架构元素(已添加的 DataColumn 对象),则可以通过将 missingSchemaAction 参数设置为 MissingSchemaAction.Add 将该架构元素添加到目标中。在这种情况下,合并的 DataSet 将包含已添加的架构和数据。
合并架构之后合并数据。
当将新的源 DataSet 合并到目标中时,DataRowState 值为 Unchanged、Modified 或 Deleted 的任何源行都会与具有同一主键值的目标行相匹配。DataRowState 值为 Added 的源行将匹配主键值与新源行相同的新目标行。合并过程中将禁用约束。如果在合并结束时无法启用任何约束,则会在禁用约束的同时生成 ConstraintException 并保留合并的数据。这种情况下,EnforceConstraints 属性将设置为 false,并且所有无效行都会标记为出错。在试图将 EnforceConstraints 属性重置为 true 之前,必须消除这些错误。
示例
[Visual Basic, C#] 以下示例创建一个简单的 DataSet,该数据集包含一个表、两个列和十个行。在添加十个行之后,更改了两个值并添加了一个行。使用 GetChanges 方法创建已更改数据的子集。在调节错误之后,子集中的数据合并到原始的 DataSet 中。
[[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 RowChanged event handler for the table.
   t.RowChanged+=new DataRowChangeEventHandler(Row_Changed);
   ds.Tables.Add(t);
   t.Columns.Add(c1);
   t.Columns.Add(c2);
   // 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 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();
               }
            }
         }
      }
      // Add a column to the xSet.
      xSet.Tables["Items"].Columns.Add(new DataColumn("newColumn"));
      PrintValues(xSet, "Reconciled subset values");
      // Merge changes back to first DataSet.
      ds.Merge(xSet,false,System.Data.MissingSchemaAction.Add);
   }
   PrintValues(ds, "Merged Values");
}private void Row_Changed(object sender, DataRowChangeEventArgs e){
   Console.WriteLine("Row Changed " + e.Action.ToString() + "\t" + e.Row.ItemArray[0]);
}private void PrintValues(DataSet ds, string label){
   Console.WriteLine(label + "\n");
   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();
      }
   }
}