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 (System.Data.DataRow[] rows);

參數

rows
DataRow[]

要合併至 DataSetDataRow 物件的陣列。

備註

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

Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataSet

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

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

合併架構之後,數據會合併。

將新的來源 DataSet 合併至目標時,任何具有 DataRowStateUnchangedModifiedDeleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowStateAdded 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。

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

另請參閱

  • 在 ADO.NET 中使用數據集

適用於

.NET 9 及其他版本
產品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Merge(DataSet)

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

將指定的 DataSet 及其架構合併至目前的 DataSet

public void Merge (System.Data.DataSet dataSet);

參數

dataSet
DataSet

要合併其數據和架構的 DataSet

例外狀況

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

dataSet null

範例

下列範例會在 DataSet上使用 GetChanges、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();
        }
    }
}

備註

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

Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataSet

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

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

合併架構之後,數據會合併。

將新的來源 DataSet 合併至目標時,任何具有 DataRowStateUnchangedModifiedDeleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowStateAdded 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。

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

另請參閱

適用於

.NET 9 及其他版本
產品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Merge(DataTable)

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

將指定的 DataTable 及其架構合併至目前的 DataSet

public void Merge (System.Data.DataTable table);

參數

table
DataTable

要合併其數據和架構的 DataTable

例外狀況

table null

範例

下列範例會建立具有一個數據表、兩個數據行和十個數據列的簡單 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();
        }
    }
}

備註

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

Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataSet

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

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

合併架構之後,數據會合併。

將新的來源 DataSet 合併至目標時,任何具有 DataRowStateUnchangedModifiedDeleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowStateAdded 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。

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

另請參閱

  • 在 ADO.NET 中使用數據集

適用於

.NET 9 及其他版本
產品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Merge(DataSet, Boolean)

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

根據指定的自變數,將指定的 DataSet 及其架構合併至目前的 DataSet,保留或捨棄此 DataSet 中的任何變更。

public void Merge (System.Data.DataSet dataSet, bool preserveChanges);

參數

dataSet
DataSet

要合併其數據和架構的 DataSet

preserveChanges
Boolean

true 保留目前 DataSet中的變更;否則,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();
        }
    }
}

備註

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

Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataSet

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

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

合併架構之後,數據會合併。

將新的來源 DataSet 合併至目標時,任何具有 DataRowStateUnchangedModifiedDeleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowStateAdded 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。

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

另請參閱

適用於

.NET 9 及其他版本
產品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Merge(DataRow[], Boolean, MissingSchemaAction)

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

DataRow 對象的數組合並至目前的 DataSet,保留或捨棄 DataSet 中的變更,並根據指定的自變數處理不相容的架構。

public void Merge (System.Data.DataRow[] rows, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);

參數

rows
DataRow[]

要合併至 DataSetDataRow 物件的陣列。

preserveChanges
Boolean

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

missingSchemaAction
MissingSchemaAction

其中一個 MissingSchemaAction 值。

備註

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

Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataSet

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

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

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

合併架構之後,數據會合併。

將新的來源 DataSet 合併至目標時,任何具有 DataRowStateUnchangedModifiedDeleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowStateAdded 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。

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

另請參閱

  • 在 ADO.NET 中使用數據集

適用於

.NET 9 及其他版本
產品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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

參數

dataSet
DataSet

要合併其數據和架構的 DataSet

preserveChanges
Boolean

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

missingSchemaAction
MissingSchemaAction

其中一個 MissingSchemaAction 值。

例外狀況

dataSet null

範例

下列範例會建立具有一個數據表、兩個數據行和十個數據列的簡單 DataSet。 兩個值會變更,並新增一個數據列。 已變更數據的子集是使用 GetChanges 方法來建立。 重新調整錯誤之後,會將新的數據行新增至子集,變更架構。 當呼叫 Merge 方法時,missingSchemaAction 設定為 MissingSchemaAction.Add,新的數據行就會新增至原始 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();
        }
    }
}

備註

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

Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataSet

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

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

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

合併架構之後,數據會合併。

將新的來源 DataSet 合併至目標時,任何具有 DataRowStateUnchangedModifiedDeleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowStateAdded 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。

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

另請參閱

  • 在 ADO.NET 中使用數據集

適用於

.NET 9 及其他版本
產品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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

參數

table
DataTable

要合併其數據和架構的 DataTable

preserveChanges
Boolean

其中一個 MissingSchemaAction 值。

missingSchemaAction
MissingSchemaAction

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

例外狀況

dataSet null

範例

下列範例會建立具有一個數據表、兩個數據行和十個數據列的簡單 DataSet。 系統會建立第二個 DataTable,與第一個幾乎完全相同,但新的 DataColumn 會新增至數據表。 會將兩個數據列新增至第二個數據表,然後合併至 DataSet,並將 preserveChanges 自變數設定為 false,並將 missingSchemaAction 自變數設定為 MissingSchemaAction.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();
        }
    }
}

備註

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

Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataSet

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

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

合併架構之後,數據會合併。

將新的來源 DataSet 合併至目標時,任何具有 DataRowStateUnchangedModifiedDeleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowStateAdded 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。

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

另請參閱

  • 在 ADO.NET 中使用數據集

適用於

.NET 9 及其他版本
產品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1