DataSet.GetChanges 方法

定義

取得 DataSet (包含從前一次載入它或呼叫 AcceptChanges() 以來所做的所有變更) 的複本。

多載

GetChanges()

取得 DataSet (包含從載入它或前一次呼叫 AcceptChanges() 以來所做的所有變更) 的複本。

GetChanges(DataRowState)

取得 DataSet (包含從前一次載入它或呼叫 AcceptChanges() 以來所做的所有變更) 的複本 (由 DataRowState 篩選)。

GetChanges()

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

取得 DataSet (包含從載入它或前一次呼叫 AcceptChanges() 以來所做的所有變更) 的複本。

public System.Data.DataSet? GetChanges ();
public System.Data.DataSet GetChanges ();

傳回

這個 DataSet 所產生變更的複本,可在其上執行動作,並且稍後使用 Merge(DataSet) 合併回來。 如果找不到已變更的資料列,則方法會傳回 null

範例

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

備註

建立新的 DataSet ,其中包含原始 DataSet 中具有暫止變更之所有數據列的複本。 如果未變更的資料列包含對應至已變更資料列中外鍵的主鍵,關聯性條件約束可能會導致其他未變更的資料列加入新的 DataSet 。 如果原始DataSet中沒有具有擱置變更的資料列,則方法會null傳回 。

另請參閱

適用於

GetChanges(DataRowState)

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

取得 DataSet (包含從前一次載入它或呼叫 AcceptChanges() 以來所做的所有變更) 的複本 (由 DataRowState 篩選)。

public System.Data.DataSet? GetChanges (System.Data.DataRowState rowStates);
public System.Data.DataSet GetChanges (System.Data.DataRowState rowStates);

參數

rowStates
DataRowState

其中一個 DataRowState 值。

傳回

篩選過的 DataSet 複本,可以在其上執行動作,然後在使用 Merge(DataSet) 時合併回來。 如果找不到所需的 DataRowState 的資料列,則方法會傳回 null

範例

下列範例會 GetChanges 使用 方法來建立第二 DataSet 個 對象,然後用來更新數據源。

private void UpdateDataSet(DataSet dataSet)
{
    // Check for changes with the HasChanges method first.
    if(!dataSet.HasChanges(DataRowState.Modified)) return;

    // Create temporary DataSet variable and
    // GetChanges for modified rows only.
    DataSet tempDataSet =
        dataSet.GetChanges(DataRowState.Modified);

    // Check the DataSet for errors.
    if(tempDataSet.HasErrors)
    {
        // Insert code to resolve errors.
    }
    // After fixing errors, update the data source with
    // the DataAdapter used to create the DataSet.
    adapter.Update(tempDataSet);
}

備註

方法 GetChanges 可用來產生第二 DataSet 個物件,該物件只包含導入原始的變更。 rowStates使用 自變數來指定新物件應該包含的變更類型。

這個傳回的複本是設計成合併回這個原始 DataSet的 。 關聯性條件約束可能會導致標示 Unchanged 為包含的父數據列。 如果找不到所需的 DataRowState 資料列,方法會 GetChangesnull回 。

另請參閱

適用於