DataSet.Merge 方法

定義

將指定的 DataSetDataTableDataRow 物件的陣列合併到目前的 DataSetDataTable 中。

多載

Merge(DataRow[])

DataRow 物件的陣列合併到目前的 DataSet 中。

Merge(DataSet)

將指定的 DataSet 及其結構描述合併到目前的 DataSet 中。

Merge(DataTable)

將指定的 DataTable 及其結構描述合併到目前的 DataSet 中。

Merge(DataSet, Boolean)

將指定的 DataSet 及其結構描述合併到目前的 DataSet 中,根據給定參數保留或忽略這個 DataSet 中的任何變更。

Merge(DataRow[], Boolean, MissingSchemaAction)

DataRow 物件的陣列合併到目前的 DataSet 中,根據給定參數保留或忽略 DataSet 中的變更,並處理不相容的結構描述。

Merge(DataSet, Boolean, MissingSchemaAction)

將指定的 DataSet 及其結構描述與目前的 DataSet 合併,根據給定參數保留或忽略目前 DataSet 中的變更,並處理不相容的結構描述。

Merge(DataTable, Boolean, MissingSchemaAction)

將指定的 DataTable 及其結構描述合併到目前的 DataSet,根據給定引數保留或忽略 DataSet 中的變更,並處理不相容的結構描述。

Merge(DataRow[])

來源:
DataSet.cs
來源:
DataSet.cs
來源:
DataSet.cs

DataRow 物件的陣列合併到目前的 DataSet 中。

public:
 void Merge(cli::array <System::Data::DataRow ^> ^ rows);
public void Merge (System.Data.DataRow[] rows);
member this.Merge : System.Data.DataRow[] -> unit
Public Sub Merge (rows As DataRow())

參數

rows
DataRow[]

DataRow 物件的陣列,將合併至 DataSet

備註

方法 Merge 可用來合併 DataSet 兩個具有大致類似架構的物件。 合併通常用於用戶端應用程式,以將資料來源的最新變更併入現有的 DataSet 。 這可讓用戶端應用程式使用資料來源的最新資料重新 DataSet 整理。

方法 Merge 通常會在一系列程式的結尾呼叫,這些程式牽涉到驗證變更、協調錯誤、使用變更更新資料來源,最後重新整理現有的 DataSet

在用戶端應用程式中,使用者通常會按一下單一按鈕來收集變更的資料,並在將它傳回仲介層元件之前加以驗證。 在此案例中 GetChanges ,會先叫用 方法。 該方法會傳回第二 DataSet 個針對驗證和合併優化的 。 第二 DataSet 個 物件只包含已變更的 DataTableDataRow 物件,導致原始 DataSet 的子集。 此子集通常較小,因此更有效率地傳回仲介層元件。 中介層元件接著會透過預存程式變更來更新原始資料來源。 接著,中介層可以傳回新的 DataSet ,其中包含原始資料和資料來源的最新資料 (,方法是再次執行原始查詢) ,或從資料來源傳回任何已變更的子集。 (例如,如果資料來源自動建立唯一的主鍵值,則可以將這些值傳播回用戶端應用程式。) 在這兩種情況下,傳回 DataSet 的 可以合併回用戶端應用程式的原始 DataSetMerge 方法。

Merge呼叫 方法時,會比較兩 DataSet 個 物件的架構,因為架構可能已經變更。 例如,在企業對企業案例中,自動化程式可能會將新的資料行新增至 XML 架構。 如果來源 DataSet 包含架構元素, (目標中遺漏的物件) 加入 DataColumn ,則可以將 引數設定 missingSchemaActionMissingSchemaAction.Add ,將架構專案新增至目標。 在此情況下,合併 DataSet 的 會包含新增的架構和資料。

合併架構之後,資料會合並。

將新來源 DataSet 合併到目標時,任何值為 DataRowStateUnchangedModifiedDeleted 的來源資料列會與具有相同主鍵值的目標資料列進行比對。 具有 DataRowStateAdded 的來來源資料列會與新主鍵值與新來源資料列相同的新目標資料列進行比對。

在合併期間,會停用條件約束。 如果合併結束時無法啟用任何條件約束,就會產生 , ConstraintException 並在停用條件約束時保留合併的資料。 在此情況下, EnforceConstraints 屬性會設定為 false ,而且所有不正確資料列都會標示為錯誤。 嘗試將 EnforceConstraints 屬性 true 重設為 之前,必須先解決這些錯誤。

另請參閱

適用於

Merge(DataSet)

來源:
DataSet.cs
來源:
DataSet.cs
來源:
DataSet.cs

將指定的 DataSet 及其結構描述合併到目前的 DataSet 中。

public:
 void Merge(System::Data::DataSet ^ dataSet);
public void Merge (System.Data.DataSet dataSet);
member this.Merge : System.Data.DataSet -> unit
Public Sub Merge (dataSet As DataSet)

參數

dataSet
DataSet

DataSet,其資料及結構描述將被合併。

例外狀況

一個或多個條件約束無法啟用。

dataSetnull

範例

下列範例會在 GetChanges 上使用 DataSet 、 Update 和 Merge 方法。

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();
        }
    }
}
 Private Sub DemonstrateMerge()
     ' Create a DataSet with one table, two columns, and three rows.
     Dim dataSet As New DataSet("dataSet")
     Dim table As New DataTable("Items")
     Dim idColumn As New DataColumn("id", Type.GetType("System.Int32"))
     idColumn.AutoIncrement = True
     Dim itemColumn As New DataColumn("Item", Type.GetType("System.Int32"))

     ' DataColumn array to set primary key.
     Dim keyColumn(0) As DataColumn
     Dim row As DataRow

     ' Create variable for temporary DataSet. 
     Dim changeDataSet As DataSet

     ' 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.
     Dim i As Integer
     For i = 0 To 9
         row = table.NewRow()
         row("Item") = i
         table.Rows.Add(row)
     Next i

     ' 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 Or DataRowState.Added) _
        And dataSet.HasErrors Then

         ' Use GetChanges to extract subset.
         changeDataSet = dataSet.GetChanges(DataRowState.Modified _
            Or DataRowState.Added)
         PrintValues(changeDataSet, "Subset values")

         ' Insert code to reconcile errors. In this case, reject changes.
         Dim changeTable As DataTable
         For Each changeTable In  changeDataSet.Tables
             If changeTable.HasErrors Then
                 Dim changeRow As DataRow
                 For Each changeRow In  changeTable.Rows
                     'Console.WriteLine(changeRow["Item"]);
                     If CInt(changeRow("Item", _
                        DataRowVersion.Current)) > 100 Then
                         changeRow.RejectChanges()
                         changeRow.ClearErrors()
                     End If
                 Next changeRow
             End If
         Next changeTable
         PrintValues(changeDataSet, "Reconciled subset values")

         ' Merge changes back to first DataSet.
         dataSet.Merge(changeDataSet)
         PrintValues(dataSet, "Merged Values")
     End If
 End Sub
 
Private Sub PrintValues(dataSet As DataSet, label As String)
     Console.WriteLine(ControlChars.Cr & label)
     Dim table As DataTable
     For Each table In  dataSet.Tables
         Console.WriteLine("TableName: " & table.TableName)
         Dim row As DataRow
         For Each row In  table.Rows
             Dim column As DataColumn
             For Each column In  table.Columns
                 Console.Write(ControlChars.Tab & " " _
                    & row(column).ToString())
             Next column
             Console.WriteLine()
         Next row
     Next table
End Sub

備註

方法 Merge 可用來合併 DataSet 兩個具有大致類似架構的物件。 合併通常用於用戶端應用程式,以將資料來源的最新變更併入現有的 DataSet 。 這可讓用戶端應用程式使用資料來源的最新資料重新 DataSet 整理。

方法 Merge 通常會在一系列程式的結尾呼叫,這些程式牽涉到驗證變更、協調錯誤、使用變更更新資料來源,最後重新整理現有的 DataSet

在用戶端應用程式中,使用者通常會按一下單一按鈕來收集變更的資料,並在將它傳回仲介層元件之前加以驗證。 在此案例中 GetChanges ,會先叫用 方法。 該方法會傳回第二 DataSet 個針對驗證和合併優化的 。 第二 DataSet 個 物件只包含已變更的 DataTableDataRow 物件,導致原始 DataSet 的子集。 此子集通常較小,因此更有效率地傳回仲介層元件。 中介層元件接著會透過預存程式變更來更新原始資料來源。 接著,中介層可以傳回新的 DataSet ,其中包含原始資料和資料來源的最新資料 (,方法是再次執行原始查詢) ,或從資料來源傳回任何已變更的子集。 (例如,如果資料來源自動建立唯一的主鍵值,則可以將這些值傳播回用戶端應用程式。) 在這兩種情況下,傳回 DataSet 的 可以合併回用戶端應用程式的原始 DataSetMerge 方法。

Merge呼叫 方法時,會比較兩 DataSet 個 物件的架構,因為架構可能已經變更。 例如,在企業對企業案例中,自動化程式可能會將新的資料行新增至 XML 架構。 如果來源 DataSet 包含架構元素, (目標中遺漏的物件) 加入 DataColumn ,則可以將 引數設定 missingSchemaActionMissingSchemaAction.Add ,將架構專案新增至目標。 在此情況下,合併 DataSet 的 會包含新增的架構和資料。

合併架構之後,資料會合並。

將新來源 DataSet 合併到目標時,任何值為 DataRowStateUnchangedModifiedDeleted 的來源資料列會與具有相同主鍵值的目標資料列進行比對。 具有 DataRowStateAdded 的來來源資料列會與新主鍵值與新來源資料列相同的新目標資料列進行比對。

在合併期間,會停用條件約束。 如果合併結束時無法啟用任何條件約束,就會產生 , ConstraintException 並在停用條件約束時保留合併的資料。 在此情況下, EnforceConstraints 屬性會設定為 false ,而且所有不正確資料列都會標示為錯誤。 嘗試將 EnforceConstraints 屬性 true 重設為 之前,必須先解決這些錯誤。

另請參閱

適用於

Merge(DataTable)

來源:
DataSet.cs
來源:
DataSet.cs
來源:
DataSet.cs

將指定的 DataTable 及其結構描述合併到目前的 DataSet 中。

public:
 void Merge(System::Data::DataTable ^ table);
public void Merge (System.Data.DataTable table);
member this.Merge : System.Data.DataTable -> unit
Public Sub Merge (table As DataTable)

參數

table
DataTable

DataTable,其資料及結構描述將被合併。

例外狀況

tablenull

範例

下列範例會建立一個包含一個資料表、兩個數據行和十個數據列的簡單 DataSet 。 第二 DataTable 個是建立的,與第一個相同。 兩個數據列會新增至第二個數據表,然後合併至 DataSet

private void DemonstrateMergeTable()
{
    // Create a DataSet with one table, two columns, and ten rows.
    DataSet dataSet = new DataSet("dataSet");
    DataTable table = new DataTable("Items");

    // Add table to the DataSet
    dataSet.Tables.Add(table);

    // Add columns
    DataColumn c1 = new DataColumn("id",
        Type.GetType("System.Int32"),"");
    DataColumn c2 = new DataColumn("Item",
        Type.GetType("System.Int32"),"");
    table.Columns.Add(c1);
    table.Columns.Add(c2);

    // DataColumn array to set primary key.
    DataColumn[] keyCol= new DataColumn[1];

    // Set primary key column.
    keyCol[0]= c1;
    table.PrimaryKey=keyCol;

    // Add a RowChanged event handler for the table.
    table.RowChanged += new
        DataRowChangeEventHandler(Row_Changed);

    // Add ten rows.
    for(int i = 0; i <10;i++)
    {
        DataRow row=table.NewRow();
        row["id"] = i;
        row["Item"]= i;
        table.Rows.Add(row);
    }
    // Accept changes.
    dataSet.AcceptChanges();

    PrintValues(dataSet, "Original values");

    // Create a second DataTable identical to the first.
    DataTable t2 = table.Clone();

    // Add three rows. Note that the id column can'te be the
    // same as existing rows in the DataSet table.
    DataRow newRow;
    newRow = t2.NewRow();
    newRow["id"] = 14;
    newRow["item"] = 774;

    //Note the alternative method for adding rows.
    t2.Rows.Add(new Object[] { 12, 555 });
    t2.Rows.Add(new Object[] { 13, 665 });

    // Merge the table into the DataSet
    Console.WriteLine("Merging");
    dataSet.Merge(t2);
    PrintValues(dataSet, "Merged With table.");
}

private void Row_Changed(object sender,
    DataRowChangeEventArgs e)
{
    Console.WriteLine("Row Changed " + e.Action.ToString()
        + "\table" + e.Row.ItemArray[0]);
}

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();
        }
    }
}
Private Sub DemonstrateMergeTable()
    ' Create a DataSet with one table, two columns, 
    ' and ten rows.
    Dim dataSet As New DataSet("dataSet")
    Dim table As New DataTable("Items")

    ' Add tables to the DataSet
    dataSet.Tables.Add(table)

    ' Add columns
    Dim c1 As New DataColumn("id", Type.GetType("System.Int32"), "")
    Dim c2 As New DataColumn("Item", Type.GetType("System.Int32"), "")
    table.Columns.Add(c1)
    table.Columns.Add(c2)

    ' DataColumn array to set primary key.
    Dim keyCol(0) As DataColumn

    ' Set primary key column.
    keyCol(0) = c1
    table.PrimaryKey = keyCol

    ' Add RowChanged event handler for the table.
    AddHandler table.RowChanged, AddressOf Row_Changed

    ' Add ten rows.
    Dim i As Integer
    Dim row As DataRow

    For i = 0 To 9
        row = table.NewRow()
        row("id") = i
        row("Item") = i
        table.Rows.Add(row)
    Next i

    ' Accept changes.
    dataSet.AcceptChanges()
    PrintValues(dataSet, "Original values")

    ' Create a second DataTable identical to the first.
    Dim t2 As DataTable
    t2 = table.Clone()

    ' Add three rows. Note that the id column can't be the 
    ' same as existing rows in the DataSet table.
    Dim newRow As DataRow
    newRow = t2.NewRow()
    newRow("id") = 14
    newRow("Item") = 774
    t2.Rows.Add(newRow)

    newRow = t2.NewRow()
    newRow("id") = 12
    newRow("Item") = 555
    t2.Rows.Add(newRow)

    newRow = t2.NewRow()
    newRow("id") = 13
    newRow("Item") = 665
    t2.Rows.Add(newRow)

    ' Merge the table into the DataSet.
    Console.WriteLine("Merging")
    dataSet.Merge(t2)
    PrintValues(dataSet, "Merged With Table")
 End Sub 
     
 Private Sub Row_Changed( _
    sender As Object, e As DataRowChangeEventArgs)
     Console.WriteLine("Row Changed " & e.Action.ToString() _
        & ControlChars.Tab & e.Row.ItemArray(0).ToString())
 End Sub
 
 Private Sub PrintValues(dataSet As DataSet, label As String)
     Console.WriteLine(ControlChars.Cr & label)
     Dim table As DataTable
     Dim row As DataRow
     Dim column As DataColumn
     For Each table In  dataSet.Tables
         Console.WriteLine("TableName: " & table.TableName) 
         For Each row In  table.Rows             
             For Each column In  table.Columns
                 Console.Write(ControlChars.Tab & " " _
                    & row(column).ToString())
             Next column
             Console.WriteLine()
         Next row
     Next table
 End Sub

備註

方法 Merge 可用來合併 DataSet 兩個具有大致類似架構的物件。 合併通常用於用戶端應用程式,以將資料來源的最新變更併入現有的 DataSet 。 這可讓用戶端應用程式使用資料來源的最新資料重新 DataSet 整理。

方法 Merge 通常會在一系列程式的結尾呼叫,這些程式牽涉到驗證變更、協調錯誤、使用變更更新資料來源,最後重新整理現有的 DataSet

在用戶端應用程式中,使用者通常會按一下單一按鈕來收集變更的資料,並在將它傳回仲介層元件之前加以驗證。 在此案例中 GetChanges ,會先叫用 方法。 該方法會傳回第二 DataSet 個針對驗證和合併優化的 。 第二 DataSet 個 物件只包含已變更的 DataTableDataRow 物件,導致原始 DataSet 的子集。 此子集通常較小,因此更有效率地傳回仲介層元件。 中介層元件接著會透過預存程式變更來更新原始資料來源。 接著,中介層可以傳回新的 DataSet ,其中包含原始資料和資料來源的最新資料 (,方法是再次執行原始查詢) ,或從資料來源傳回任何已變更的子集。 (例如,如果資料來源自動建立唯一的主鍵值,則可以將這些值傳播回用戶端應用程式。) 在這兩種情況下,傳回 DataSet 的 可以合併回用戶端應用程式的原始 DataSetMerge 方法。

Merge呼叫 方法時,會比較兩 DataSet 個 物件的架構,因為架構可能已經變更。 例如,在企業對企業案例中,自動化程式可能會將新的資料行新增至 XML 架構。 如果來源 DataSet 包含架構元素, (目標中遺漏的物件) 加入 DataColumn ,則可以將 引數設定 missingSchemaActionMissingSchemaAction.Add ,將架構專案新增至目標。 在此情況下,合併 DataSet 的 會包含新增的架構和資料。

合併架構之後,資料會合並。

將新來源 DataSet 合併到目標時,任何值為 DataRowStateUnchangedModifiedDeleted 的來源資料列會與具有相同主鍵值的目標資料列進行比對。 具有 DataRowStateAdded 的來來源資料列會與新主鍵值與新來源資料列相同的新目標資料列進行比對。

在合併期間,會停用條件約束。 如果合併結束時無法啟用任何條件約束,就會產生 , ConstraintException 並在停用條件約束時保留合併的資料。 在此情況下, EnforceConstraints 屬性會設定為 false ,而且所有不正確資料列都會標示為錯誤。 嘗試將 EnforceConstraints 屬性 true 重設為 之前,必須先解決這些錯誤。

另請參閱

適用於

Merge(DataSet, Boolean)

來源:
DataSet.cs
來源:
DataSet.cs
來源:
DataSet.cs

將指定的 DataSet 及其結構描述合併到目前的 DataSet 中,根據給定參數保留或忽略這個 DataSet 中的任何變更。

public:
 void Merge(System::Data::DataSet ^ dataSet, bool preserveChanges);
public void Merge (System.Data.DataSet dataSet, bool preserveChanges);
member this.Merge : System.Data.DataSet * bool -> unit
Public Sub Merge (dataSet As DataSet, preserveChanges As Boolean)

參數

dataSet
DataSet

DataSet,其資料及結構描述將被合併。

preserveChanges
Boolean

若要保留目前 DataSet 中的變更,則為 true;否則為 false

範例

下列範例會建立一個包含一個資料表、兩個數據行和十個數據列的簡單 DataSet 。 新增十個數據列之後,會變更兩個值,並新增一個資料列。 已變更資料的子集是使用 GetChanges 方法建立的。 在對帳錯誤之後,子集資料會合並到原始 DataSet

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 changesDataSet;

    // Add RowChanged event handler for the table.
    table.RowChanged+=new DataRowChangeEventHandler(
        Row_Changed);
    dataSet.Tables.Add(table);
    table.Columns.Add(idColumn);
    table.Columns.Add(itemColumn);

    // 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 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.
        changesDataSet = dataSet.GetChanges(
            DataRowState.Modified|DataRowState.Added);
        PrintValues(changesDataSet, "Subset values");

        // Insert code to reconcile errors. In this case, reject changes.
        foreach(DataTable changesTable in changesDataSet.Tables)
        {
            if (changesTable.HasErrors)
            {
                foreach(DataRow changesRow in changesTable.Rows)
                {
                    //Console.WriteLine(changesRow["Item"]);
                    if((int)changesRow["Item",DataRowVersion.Current ]> 100)
                    {
                        changesRow.RejectChanges();
                        changesRow.ClearErrors();
                    }
                }
            }
        }
        // Add a column to the changesDataSet.
        changesDataSet.Tables["Items"].Columns.Add(
            new DataColumn("newColumn"));
        PrintValues(changesDataSet, "Reconciled subset values");
        // Merge changes back to first DataSet.
        dataSet.Merge(changesDataSet, false,
            System.Data.MissingSchemaAction.Add);
    }
    PrintValues(dataSet, "Merged Values");
}

private void Row_Changed(object sender, DataRowChangeEventArgs e)
{
    Console.WriteLine("Row Changed " + e.Action.ToString()
        + "\table" + e.Row.ItemArray[0]);
}

private void PrintValues(DataSet dataSet, string label)
{
    Console.WriteLine(label + "\n");
    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();
        }
    }
}
Private Sub DemonstrateMerge()
    ' Create a DataSet with one table, two columns, 
    ' and three rows.
    Dim dataSet As New DataSet("dataSet")
    Dim table As New DataTable("Items")
    Dim idColumn As New DataColumn("id", _
        Type.GetType("System.Int32"), "")
    idColumn.AutoIncrement = True
    Dim itemColumn As New DataColumn("Item", _
        Type.GetType("System.Int32"), "")

    ' Create DataColumn array to set primary key.
    Dim keyColumn(0) As DataColumn
    Dim row As DataRow

    ' Create variable for temporary DataSet. 
    Dim changesDataSet As DataSet

    ' Add RowChanged event handler for the table.
    AddHandler table.RowChanged, AddressOf Row_Changed
    dataSet.Tables.Add(table)
    table.Columns.Add(idColumn)
    table.Columns.Add(itemColumn)

    ' Set primary key column.
    keyColumn(0) = idColumn
    table.PrimaryKey = keyColumn

    ' Add ten rows.
    Dim i As Integer
    For i = 0 To 9
        row = table.NewRow()
        row("Item") = i
        table.Rows.Add(row)
    Next i

    ' Accept changes.
    dataSet.AcceptChanges()
    PrintValues(dataSet, "Original values")

    ' Change 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 Or DataRowState.Added) _
        And dataSet.HasErrors Then
        ' Use GetChanges to extract subset.
        changesDataSet = dataSet.GetChanges( _
            DataRowState.Modified Or DataRowState.Added)
        PrintValues(changesDataSet, "Subset values")

        ' Insert code to reconcile errors. In this case, reject changes.
        Dim changesTable As DataTable
        For Each changesTable In  changesDataSet.Tables
            If changesTable.HasErrors Then
                Dim changesRow As DataRow
                For Each changesRow In  changesTable.Rows
                    'Console.WriteLine(changesRow["Item"]);
                    If CInt(changesRow("Item", _
                        DataRowVersion.Current)) > 100 Then
                        changesRow.RejectChanges()
                        changesRow.ClearErrors()
                    End If
                Next changesRow
            End If
        Next changesTable

        ' Add a column to the changesDataSet.
        changesDataSet.Tables("Items").Columns.Add( _
            New DataColumn("newColumn"))
        PrintValues(changesDataSet, "Reconciled subset values")

        ' Merge changes back to first DataSet.
        dataSet.Merge(changesDataSet, False, _
            System.Data.MissingSchemaAction.Add)
    End If
    PrintValues(dataSet, "Merged Values")
End Sub
        
 Private Sub Row_Changed(sender As Object, e As DataRowChangeEventArgs)
     Console.WriteLine("Row Changed " + e.Action.ToString() _
        + ControlChars.Tab + e.Row.ItemArray(0).ToString())
 End Sub
    
Private Sub PrintValues(dataSet As DataSet, label As String)
     Console.WriteLine(label + ControlChars.Cr)
     Dim table As DataTable
     For Each table In  dataSet.Tables
         Console.WriteLine("TableName: " + table.TableName)
         Dim row As DataRow
         For Each row In  table.Rows
             Dim column As DataColumn
             For Each column In  table.Columns
                 Console.Write(ControlChars.Tab & " " _
                    & row(column).ToString())
             Next column
             Console.WriteLine()
         Next row
     Next table
End Sub

備註

方法 Merge 可用來合併 DataSet 兩個具有大致類似架構的物件。 合併通常用於用戶端應用程式,以將資料來源的最新變更併入現有的 DataSet 。 這可讓用戶端應用程式使用資料來源的最新資料重新 DataSet 整理。

方法 Merge 通常會在一系列程式的結尾呼叫,這些程式牽涉到驗證變更、協調錯誤、使用變更更新資料來源,最後重新整理現有的 DataSet

在用戶端應用程式中,使用者通常會按一下單一按鈕來收集變更的資料,並在將它傳回仲介層元件之前加以驗證。 在此案例中 GetChanges ,會先叫用 方法。 該方法會傳回第二 DataSet 個針對驗證和合併優化的 。 第二 DataSet 個 物件只包含已變更的 DataTableDataRow 物件,導致原始 DataSet 的子集。 此子集通常較小,因此更有效率地傳回仲介層元件。 中介層元件接著會透過預存程式變更來更新原始資料來源。 接著,中介層可以傳回新的 DataSet ,其中包含原始資料和資料來源的最新資料 (,方法是再次執行原始查詢) ,或從資料來源傳回任何已變更的子集。 (例如,如果資料來源自動建立唯一的主鍵值,則可以將這些值傳播回用戶端應用程式。) 在這兩種情況下,傳回 DataSet 的 可以合併回用戶端應用程式的原始 DataSetMerge 方法。

Merge呼叫 方法時,會比較兩 DataSet 個 物件的架構,因為架構可能已經變更。 例如,在企業對企業案例中,自動化程式可能會將新的資料行新增至 XML 架構。 如果來源 DataSet 包含架構元素, (目標中遺漏的物件) 加入 DataColumn ,則可以將 引數設定 missingSchemaActionMissingSchemaAction.Add ,將架構專案新增至目標。 在此情況下,合併 DataSet 的 會包含新增的架構和資料。

合併架構之後,資料會合並。

將新來源 DataSet 合併到目標時,任何值為 DataRowStateUnchangedModifiedDeleted 的來源資料列會與具有相同主鍵值的目標資料列進行比對。 具有 DataRowStateAdded 的來來源資料列會與新主鍵值與新來源資料列相同的新目標資料列進行比對。

在合併期間,會停用條件約束。 如果合併結束時無法啟用任何條件約束,就會產生 , ConstraintException 並在停用條件約束時保留合併的資料。 在此情況下, EnforceConstraints 屬性會設定為 false ,而且所有不正確資料列都會標示為錯誤。 嘗試將 EnforceConstraints 屬性 true 重設為 之前,必須先解決這些錯誤。

另請參閱

適用於

Merge(DataRow[], Boolean, MissingSchemaAction)

來源:
DataSet.cs
來源:
DataSet.cs
來源:
DataSet.cs

DataRow 物件的陣列合併到目前的 DataSet 中,根據給定參數保留或忽略 DataSet 中的變更,並處理不相容的結構描述。

public:
 void Merge(cli::array <System::Data::DataRow ^> ^ rows, bool preserveChanges, System::Data::MissingSchemaAction missingSchemaAction);
public void Merge (System.Data.DataRow[] rows, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);
member this.Merge : System.Data.DataRow[] * bool * System.Data.MissingSchemaAction -> unit
Public Sub Merge (rows As DataRow(), preserveChanges As Boolean, missingSchemaAction As MissingSchemaAction)

參數

rows
DataRow[]

DataRow 物件的陣列,將合併至 DataSet

preserveChanges
Boolean

若要保留 DataSet 中的變更,則為 true;否則為 false

missingSchemaAction
MissingSchemaAction

其中一個 MissingSchemaAction 值。

備註

方法 Merge 可用來合併 DataSet 兩個具有大致類似架構的物件。 合併通常用於用戶端應用程式,以將資料來源的最新變更併入現有的 DataSet 。 這可讓用戶端應用程式使用資料來源的最新資料重新 DataSet 整理。

方法 Merge 通常會在一系列程式的結尾呼叫,這些程式牽涉到驗證變更、協調錯誤、使用變更更新資料來源,最後重新整理現有的 DataSet

在用戶端應用程式中,使用者通常會按一下單一按鈕來收集變更的資料,並在將它傳回仲介層元件之前加以驗證。 在此案例中 GetChanges ,會先叫用 方法。 該方法會傳回第二 DataSet 個針對驗證和合併優化的 。 第二 DataSet 個 物件只包含已變更的 DataTableDataRow 物件,導致原始 DataSet 的子集。 此子集通常較小,因此更有效率地傳回仲介層元件。 中介層元件接著會透過預存程式變更來更新原始資料來源。 接著,中介層可以傳回新的 DataSet ,其中包含原始資料和資料來源的最新資料 (,方法是再次執行原始查詢) ,或從資料來源傳回任何已變更的子集。 (例如,如果資料來源自動建立唯一的主鍵值,則可以將這些值傳播回用戶端應用程式。) 在這兩種情況下,傳回 DataSet 的 可以合併回用戶端應用程式的原始 DataSetMerge 方法。

為了協助說明 Merge 方法,我們使用 「target」 來表示目前的 DataSet 和 「source」 來命名第二個 (參數) DataSet 。 因此會命名目標 DataSet ,因為它是發生合併) (動作的物件。 第二 DataSet 個稱為「來源」,因為它包含的資訊不會變更,而是合併到目前的 DataSet

Merge呼叫 方法時,會比較兩 DataSet 個 物件的架構,因為架構可能已經變更。 例如,在企業對企業案例中,自動化程式可能會將新的資料行新增至 XML 架構。 如果來源 DataSet 包含架構元素, (目標中遺漏的物件) 加入 DataColumn ,則可以將 引數設定 missingSchemaActionMissingSchemaAction.Add ,將架構專案新增至目標。 在此情況下,合併 DataSet 的 會包含新增的架構和資料。

合併架構之後,資料會合並。

將新來源 DataSet 合併到目標時,任何值為 DataRowStateUnchangedModifiedDeleted 的來源資料列會與具有相同主鍵值的目標資料列進行比對。 具有 DataRowStateAdded 的來來源資料列會與新主鍵值與新來源資料列相同的新目標資料列進行比對。

在合併期間,會停用條件約束。 如果合併結束時無法啟用任何條件約束,就會產生 , ConstraintException 並在停用條件約束時保留合併的資料。 在此情況下, EnforceConstraints 屬性會設定為 false ,而且所有不正確資料列都會標示為錯誤。 嘗試將 EnforceConstraints 屬性 true 重設為 之前,必須先解決這些錯誤。

另請參閱

適用於

Merge(DataSet, Boolean, MissingSchemaAction)

來源:
DataSet.cs
來源:
DataSet.cs
來源:
DataSet.cs

將指定的 DataSet 及其結構描述與目前的 DataSet 合併,根據給定參數保留或忽略目前 DataSet 中的變更,並處理不相容的結構描述。

public:
 void Merge(System::Data::DataSet ^ dataSet, bool preserveChanges, System::Data::MissingSchemaAction missingSchemaAction);
public void Merge (System.Data.DataSet dataSet, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);
member this.Merge : System.Data.DataSet * bool * System.Data.MissingSchemaAction -> unit
Public Sub Merge (dataSet As DataSet, preserveChanges As Boolean, missingSchemaAction As MissingSchemaAction)

參數

dataSet
DataSet

DataSet,其資料及結構描述將被合併。

preserveChanges
Boolean

若要保留目前 DataSet 中的變更,則為 true;否則為 false

missingSchemaAction
MissingSchemaAction

其中一個 MissingSchemaAction 值。

例外狀況

dataSetnull

範例

下列範例會建立一個包含一個資料表、兩個數據行和十個數據列的簡單 DataSet 。 變更兩個值,並新增一個資料列。 已變更資料的子集是使用 GetChanges 方法建立的。 重新協調錯誤之後,會將新的資料行新增至子集,並變更架構。 Merge使用 設定為 MissingSchemaAction.Add 呼叫 方法 missingSchemaAction 時,會將新資料行新增至原始 DataSet 物件的架構。

private void DemonstrateMergeMissingSchema()
{
    // 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 RowChanged event handler for the table.
    table.RowChanged+= new DataRowChangeEventHandler(
        Row_Changed);
    dataSet.Tables.Add(table);
    table.Columns.Add(idColumn);
    table.Columns.Add(itemColumn);

    // 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 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. Reject the 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();
                    }
                }
            }
        }
        // Add a column to the changeDataSet to change the schema.
        changeDataSet.Tables["Items"].Columns.Add(
            new DataColumn("newColumn"));
        PrintValues(changeDataSet, "Reconciled subset values");

        // Add values to the rows for each column.
        foreach(DataRow rowItem in changeDataSet.Tables["Items"].Rows)
        {
            rowItem["newColumn"] = "my new schema value";
        }
        // Merge changes back to first DataSet.
        dataSet.Merge(changeDataSet, false,
            System.Data.MissingSchemaAction.Add);
    }
    PrintValues(dataSet, "Merged Values");
}

private void Row_Changed(object sender, DataRowChangeEventArgs e)
{
    Console.WriteLine("Row Changed " + e.Action.ToString()
        + "\table" + e.Row.ItemArray[0]);
}

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();
        }
    }
}
Private Sub DemonstrateMergeMissingSchema()
    ' Create a DataSet with one table, two columns, 
    ' and three rows.
    Dim dataSet As New DataSet("dataSet")
    Dim table As New DataTable("Items")
    Dim idColumn As New DataColumn("id", _
        Type.GetType("System.Int32"))
    idColumn.AutoIncrement = True
    Dim itemColumn As New DataColumn("Item", _
        Type.GetType("System.Int32"))

    ' DataColumn array to set primary key.
    Dim keyColumn(0) As DataColumn
    Dim row As DataRow

    ' Create variable for temporary DataSet. 
    Dim changeDataSet As DataSet

    ' Add RowChanged event handler for the table.
    AddHandler table.RowChanged, AddressOf Row_Changed
    dataSet.Tables.Add(table)
    table.Columns.Add(idColumn)
    table.Columns.Add(itemColumn)

    ' Set primary key column.
    keyColumn(0) = idColumn
    table.PrimaryKey = keyColumn

    ' Add ten rows.
    Dim i As Integer
    For i = 0 To 9
        row = table.NewRow()
        row("Item") = i
        table.Rows.Add(row)
    Next i

    ' Accept changes.
    dataSet.AcceptChanges()
    PrintValues(dataSet, "Original values")

    ' Change 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 Or DataRowState.Added) _
        And dataSet.HasErrors Then
        ' Use GetChanges to extract subset.
        changeDataSet = dataSet.GetChanges(DataRowState.Modified _
            Or DataRowState.Added)
        PrintValues(changeDataSet, "Subset values")
        ' Insert code to reconcile errors. In this case, reject changes.
        Dim changeTable As DataTable
        For Each changeTable In  changeDataSet.Tables
            If changeTable.HasErrors Then
                Dim changeRow As DataRow
                For Each changeRow In  changeTable.Rows
                    If CInt(changeRow("Item", _
                        DataRowVersion.Current)) > 100 Then
                        changeRow.RejectChanges()
                        changeRow.ClearErrors()
                    End If
                Next changeRow
            End If
        Next changeTable

        ' Add a column to the changeDataSet to change the schema.
        changeDataSet.Tables("Items").Columns.Add( _
            New DataColumn("newColumn"))
        PrintValues(changeDataSet, "Reconciled subset values")

        ' Add values to the rows for each column.
        Dim rowItem As DataRow
        For Each rowItem In  changeDataSet.Tables("Items").Rows
            rowItem("newColumn") = "my new schema value"
        Next rowItem

        ' Merge changes back to first DataSet.
        dataSet.Merge(changeDataSet, False, _
            System.Data.MissingSchemaAction.Add)
    End If
    PrintValues(dataSet, "Merged Values")
End Sub
    
Private Sub Row_Changed(sender As Object, _
    e As DataRowChangeEventArgs)
     Console.WriteLine("Row Changed " & e.Action.ToString() _
        & ControlChars.Tab & e.Row.ItemArray(0).ToString())
End Sub
 
Private Sub PrintValues(dataSet As DataSet, label As String)
    Console.WriteLine(ControlChars.Cr & label)
    Dim table As DataTable
    For Each table In  dataSet.Tables
        Console.WriteLine("TableName: " & table.TableName)
        Dim row As DataRow
        For Each row In  table.Rows
            Dim column As DataColumn
            For Each column In  table.Columns
                Console.Write(ControlChars.Tab & " " _
                    & row(column).ToString())
            Next column
            Console.WriteLine()
        Next row
    Next table
End Sub

備註

方法 Merge 可用來合併 DataSet 兩個具有大致類似架構的物件。 合併通常用於用戶端應用程式,以將資料來源的最新變更併入現有的 DataSet 。 這可讓用戶端應用程式使用資料來源的最新資料重新 DataSet 整理。

方法 Merge 通常會在一系列程式的結尾呼叫,這些程式牽涉到驗證變更、協調錯誤、使用變更更新資料來源,最後重新整理現有的 DataSet

在用戶端應用程式中,使用者通常會按一下單一按鈕來收集變更的資料,並在將它傳回仲介層元件之前加以驗證。 在此案例中 GetChanges ,會先叫用 方法。 該方法會傳回第二 DataSet 個針對驗證和合併優化的 。 第二 DataSet 個 物件只包含已變更的 DataTableDataRow 物件,導致原始 DataSet 的子集。 此子集通常較小,因此更有效率地傳回仲介層元件。 中介層元件接著會透過預存程式變更來更新原始資料來源。 接著,中介層可以傳回新的 DataSet ,其中包含原始資料和資料來源的最新資料 (,方法是再次執行原始查詢) ,或從資料來源傳回任何已變更的子集。 (例如,如果資料來源自動建立唯一的主鍵值,則可以將這些值傳播回用戶端應用程式。) 在這兩種情況下,傳回 DataSet 的 可以合併回用戶端應用程式的原始 DataSetMerge 方法。

為了協助說明 Merge 方法,我們使用 「target」 來表示目前的 DataSet 和 「source」 來命名第二個 (參數) DataSet 。 因此會命名目標 DataSet ,因為它是發生合併) (動作的物件。 第二 DataSet 個稱為「來源」,因為它包含的資訊不會變更,而是合併到目前的 DataSet

Merge呼叫 方法時,會比較兩 DataSet 個 物件的架構,因為架構可能已經變更。 例如,在企業對企業案例中,自動化程式可能會將新的資料行新增至 XML 架構。 如果來源 DataSet 包含架構元素, (目標中遺漏的物件) 加入 DataColumn ,則可以將 引數設定 missingSchemaActionMissingSchemaAction.Add ,將架構專案新增至目標。 在此情況下,合併 DataSet 的 會包含新增的架構和資料。

合併架構之後,資料會合並。

將新來源 DataSet 合併到目標時,任何值為 DataRowStateUnchangedModifiedDeleted 的來源資料列會與具有相同主鍵值的目標資料列進行比對。 具有 DataRowStateAdded 的來來源資料列會與新主鍵值與新來源資料列相同的新目標資料列進行比對。

在合併期間,會停用條件約束。 如果合併結束時無法啟用任何條件約束,就會產生 , ConstraintException 並在停用條件約束時保留合併的資料。 在此情況下, EnforceConstraints 屬性會設定為 false ,而且所有不正確資料列都會標示為錯誤。 嘗試將 EnforceConstraints 屬性 true 重設為 之前,必須先解決這些錯誤。

另請參閱

適用於

Merge(DataTable, Boolean, MissingSchemaAction)

來源:
DataSet.cs
來源:
DataSet.cs
來源:
DataSet.cs

將指定的 DataTable 及其結構描述合併到目前的 DataSet,根據給定引數保留或忽略 DataSet 中的變更,並處理不相容的結構描述。

public:
 void Merge(System::Data::DataTable ^ table, bool preserveChanges, System::Data::MissingSchemaAction missingSchemaAction);
public void Merge (System.Data.DataTable table, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);
member this.Merge : System.Data.DataTable * bool * System.Data.MissingSchemaAction -> unit
Public Sub Merge (table As DataTable, preserveChanges As Boolean, missingSchemaAction As MissingSchemaAction)

參數

table
DataTable

DataTable,其資料及結構描述將被合併。

preserveChanges
Boolean

其中一個 MissingSchemaAction 值。

missingSchemaAction
MissingSchemaAction

若要保留 DataSet 中的變更,則為 true;否則為 false

例外狀況

dataSetnull

範例

下列範例會建立一個簡單的 DataSet 資料表、兩個數據行和十個數據列。 第二 DataTable 個是建立的 ,與第一個幾乎完全相同,但新的 DataColumn 會新增至資料表。 兩個數據列會新增至第二個數據表,然後將它合併至 DataSetpreserveChanges ,並將 missingSchemaAction 引數設定 falseMissingSchemaAction.Add

private void DemonstrateMergeTableAddSchema()
{
    // Create a DataSet with one table, two columns, and ten rows.
    DataSet dataSet = new DataSet("dataSet");
    DataTable table = new DataTable("Items");

    // Add table to the DataSet
    dataSet.Tables.Add(table);

    // Create and add two columns to the DataTable
    DataColumn idColumn = new DataColumn("id",
        Type.GetType("System.Int32"),"");
    idColumn.AutoIncrement=true;
    DataColumn itemColumn = new DataColumn("Item",
        Type.GetType("System.Int32"),"");
    table.Columns.Add(idColumn);
    table.Columns.Add(itemColumn);

    // Set the primary key to the first column.
    table.PrimaryKey = new DataColumn[1]{ idColumn };

    // Add RowChanged event handler for the table.
    table.RowChanged+= new DataRowChangeEventHandler(Row_Changed);

    // Add ten rows.
    for(int i = 0; i <10;i++)
    {
        DataRow row=table.NewRow();
        row["Item"]= i;
        table.Rows.Add(row);
    }

    // Accept changes.
    dataSet.AcceptChanges();
    PrintValues(dataSet, "Original values");

    // Create a second DataTable identical to the first, with
    // one extra column using the Clone method.
    DataTable cloneTable = table.Clone();
    cloneTable.Columns.Add("extra", typeof(string));

    // Add two rows. Note that the id column can'table be the
    // same as existing rows in the DataSet table.
    DataRow newRow;
    newRow=cloneTable.NewRow();
    newRow["id"]= 12;
    newRow["Item"]=555;
    newRow["extra"]= "extra Column 1";
    cloneTable.Rows.Add(newRow);

    newRow=cloneTable.NewRow();
    newRow["id"]= 13;
    newRow["Item"]=665;
    newRow["extra"]= "extra Column 2";
    cloneTable.Rows.Add(newRow);

    // Merge the table into the DataSet.
    Console.WriteLine("Merging");
    dataSet.Merge(cloneTable,false,MissingSchemaAction.Add);
    PrintValues(dataSet, "Merged With Table, Schema Added");
}

private void Row_Changed(object sender,
    DataRowChangeEventArgs e)
{
    Console.WriteLine("Row Changed " + e.Action.ToString()
        + "\table" + e.Row.ItemArray[0]);
}

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();
        }
    }
}
Private Sub DemonstrateMergeTableAddSchema()
    ' Create a DataSet with one table, two columns, 
    'and ten rows.
    Dim dataSet As New DataSet("dataSet")
    Dim table As New DataTable("Items")

    ' Add tables to the DataSet
    dataSet.Tables.Add(table)

    ' Create and add two columns to the DataTable
    Dim idColumn As New DataColumn("id", _
        Type.GetType("System.Int32"), "")
    idColumn.AutoIncrement = True
    Dim itemColumn As New DataColumn("Item", _
        Type.GetType("System.Int32"), "")
    table.Columns.Add(idColumn)
    table.Columns.Add(itemColumn)

    ' DataColumn array to set primary key.
    Dim keyCol(0) As DataColumn

    ' Set primary key column.
    keyCol(0) = idColumn
    table.PrimaryKey = keyCol

    ' Add RowChanged event handler for the table.
    AddHandler table.RowChanged, AddressOf Row_Changed

    ' Add ten rows.
    Dim i As Integer
    Dim row As DataRow

    For i = 0 To 9
        row = table.NewRow()
        row("Item") = i
        table.Rows.Add(row)
    Next i

    ' Accept changes.
    dataSet.AcceptChanges()
    PrintValues(dataSet, "Original values")

    ' Create a second DataTable identical to the first
    ' with one extra column using the Clone method.
    Dim cloneTable As New DataTable
    cloneTable = table.Clone()

    ' Add column.
    cloneTable.Columns.Add("extra", _
        Type.GetType("System.String"))

    ' Add two rows. Note that the id column can't be the 
    ' same as existing rows in the DataSet table.
    Dim newRow As DataRow
    newRow = cloneTable.NewRow()
    newRow("id") = 12
    newRow("Item") = 555
    newRow("extra") = "extra Column 1"
    cloneTable.Rows.Add(newRow)
        
    newRow = cloneTable.NewRow()
    newRow("id") = 13
    newRow("Item") = 665
    newRow("extra") = "extra Column 2"
    cloneTable.Rows.Add(newRow)

    ' Merge the table into the DataSet.
    Console.WriteLine("Merging")
    dataSet.Merge(cloneTable, False, MissingSchemaAction.Add)
    PrintValues(dataSet, "Merged With Table, Schema Added")
End Sub
  
Private Sub Row_Changed(sender As Object, _
    e As DataRowChangeEventArgs)
    Console.WriteLine("Row Changed " & e.Action.ToString() _
        & ControlChars.Tab & e.Row.ItemArray(0).ToString())
End Sub
    
Private Sub PrintValues(dataSet As DataSet, label As String)
    Console.WriteLine(ControlChars.Cr & label)
    Dim table As DataTable
    Dim row As DataRow
    Dim column As DataColumn
    For Each table In  dataSet.Tables
        Console.WriteLine("TableName: " & table.TableName)
        For Each row In  table.Rows             
            For Each column In  table.Columns
                Console.Write(ControlChars.Tab & " " _
                    & row(column).ToString())
            Next column
            Console.WriteLine()
        Next row
    Next table
 End Sub

備註

方法 Merge 可用來合併兩 DataSet 個具有大致類似架構的物件。 合併通常用於用戶端應用程式,將資料來源的最新變更併入現有的 DataSet 。 這可讓用戶端應用程式使用資料來源的最新資料進行重新 DataSet 整理。

方法 Merge 通常會在一系列程式結束時呼叫,這些程式牽涉到驗證變更、協調錯誤、使用變更更新資料來源,最後重新整理現有的 DataSet

iOn a client application, is common have a single button that the user can click that gathers the changed data and validates it before sending it back to a middle-tier component. 在此案例中,會 GetChanges 先叫用 方法。 該方法會傳回第二 DataSet 個優化來驗證和合併。 第二 DataSet 個物件只包含已變更的 DataTableDataRow 物件,導致原始 DataSet 的子集。 此子集通常較小,因此更有效率地傳回仲介層元件。 仲介層元件接著會透過預存程式變更來更新原始資料來源。 中介層接著可以再次執行原始查詢 () 執行原始查詢,以傳回 DataSet 包含原始資料和資料來源的最新資料,也可以透過從資料來源對它所做的任何變更來傳回子集。 (例如,如果資料來源自動建立唯一的主鍵值,這些值可以傳播回用戶端應用程式。) 在任一情況下,傳回 DataSet 的 可以合併回用戶端應用程式的原始 DataSet 值與 Merge 方法。

Merge呼叫 方法時,會比較兩 DataSet 個物件的架構,因為架構可能已經變更。 例如,在企業對企業案例中,新的資料行可能已由自動化程式新增至 XML 架構。 如果來源 DataSet 包含架構專案 (新增 DataColumn 物件) 目標中遺漏的物件,則可以將 引數設定為 MissingSchemaAction.Add ,將 引數新增 missingSchemaAction 至目標。 在此情況下,合併 DataSet 的 包含新增的架構和資料。

合併架構之後,資料會合並。

將新來源合併至目標時,任何值為 、 或 的來源 DataSet 資料列 DataRowState ,都 Deleted 與具有相同主鍵值的目標資料列 Modified 相符。 Unchanged 具有 DataRowStateAdded 的來來源資料列會比對與新來源資料列相同的主鍵值的新目標資料列。

在合併期間,會停用條件約束。 如果無法在合併結束時啟用任何條件約束,就會產生 , ConstraintException 並在停用條件約束時保留合併的資料。 在此情況下, EnforceConstraints 屬性會設定為 false ,而且所有不正確資料列都會標示為錯誤。 必須先解決錯誤,再嘗試將 屬性 true 重設為 EnforceConstraints

另請參閱

適用於