将指定的 DataSet 及其架构合并到当前 DataSet 中。
命名空间: System.Data
程序集: System.Data (在 System.Data.dll 中)
public void Merge(
DataSet dataSet
)
参数
dataSet
- 类型:
System.Data. . :: . DataSet
其数据和架构将被合并的 DataSet 。常
异常 条件 ConstraintException 无法启用一个或多个约束。
ArgumentNullException dataSet 为 null Nothing nullptr null 引用(在 Visual Basic 中为 Nothing ) 。
备注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 之前,必须消除这些错误。示例
C#
private void DemonstrateMerge()
{
// Create a DataSet with one table, two columns, and three rows.
DataSet dataSet = new DataSet("dataSet" );
DataTable table = new DataTable("Items" );
DataColumn idColumn = new DataColumn("id" ,
Type.GetType("System.Int32" ));
idColumn.AutoIncrement=true ;
DataColumn itemColumn = new DataColumn("Item" ,
Type.GetType("System.Int32" ));
// DataColumn array to set primary key.
DataColumn[] keyColumn= new DataColumn[1];
DataRow row;
// Create variable for temporary DataSet.
DataSet changeDataSet;
// Add columns to table, and table to DataSet.
table.Columns.Add(idColumn);
table.Columns.Add(itemColumn);
dataSet.Tables.Add(table);
// Set primary key column.
keyColumn[0]= idColumn;
table.PrimaryKey=keyColumn;
// Add ten rows.
for (int i = 0; i <10;i++)
{
row=table.NewRow();
row["Item" ]= i;
table.Rows.Add(row);
}
// Accept changes.
dataSet.AcceptChanges();
PrintValues(dataSet, "Original values" );
// Change two row values.
table.Rows[0]["Item" ]= 50;
table.Rows[1]["Item" ]= 111;
// Add one row.
row=table.NewRow();
row["Item" ]=74;
table.Rows.Add(row);
// Insert code for error checking. Set one row in error.
table.Rows[1].RowError= "over 100" ;
PrintValues(dataSet, "Modified and New Values" );
// If the table has changes or errors, create a subset DataSet.
if (dataSet.HasChanges(DataRowState.Modified |
DataRowState.Added)& dataSet.HasErrors)
{
// Use GetChanges to extract subset.
changeDataSet = dataSet.GetChanges(
DataRowState.Modified|DataRowState.Added);
PrintValues(changeDataSet, "Subset values" );
// Insert code to reconcile errors. In this case reject changes.
foreach (DataTable changeTable in changeDataSet.Tables)
{
if (changeTable.HasErrors)
{
foreach (DataRow changeRow in changeTable.Rows)
{
//Console.WriteLine(changeRow["Item"]);
if ((int )changeRow["Item" ,
DataRowVersion.Current ]> 100)
{
changeRow.RejectChanges();
changeRow.ClearErrors();
}
}
}
}
PrintValues(changeDataSet, "Reconciled subset values" );
// Merge changes back to first DataSet.
dataSet.Merge(changeDataSet);
PrintValues(dataSet, "Merged Values" );
}
}
private void PrintValues(DataSet dataSet, string label)
{
Console.WriteLine("/n" + label);
foreach (DataTable table in dataSet.Tables)
{
Console.WriteLine("TableName: " + table.TableName);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
{
Console.Write("/table " + row[column] );
}
Console.WriteLine();
}
}
}