將指定的 DataSet 及其架構合并到當前 DataSet 中。
命名空間: System.Data
程式集: System.Data (在 System.Data.dll 中)
C#
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 之前,必須消除這些錯誤。 樣本 下面的樣本針對
DataSet 使用
GetChanges 、Update 和
Merge 方法。
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();
}
}
}