This documentation is archived and is not being maintained.

DataSet.GetChanges Method ()

Gets a copy of the DataSet that contains all changes made to it since it was loaded or since AcceptChanges was last called.

Namespace: System.Data
Assembly: System.Data (in

public DataSet GetChanges ()
public DataSet GetChanges ()
public function GetChanges () : DataSet
Not applicable.

Return Value

A copy of the changes from this DataSet that can have actions performed on it and later be merged back in using Merge If no changed rows are found, the method returns a null reference (Nothing in Visual Basic).

Creates a new DataSet containing a copy of all rows in the original DataSet that have pending changes. Relationship constraints can cause additional unchanged rows to be added to the new DataSet if the unchanged rows contain primary keys corresponding to foreign keys in the changed rows. The method returns a null reference (Nothing in Visual Basic) if there are no rows in the original DataSet with pending changes.

The following example creates a simple DataSet with one table, two columns, and ten rows. Two values are changed, and one row is added. A subset of the changed data is created using the GetChanges method. After reconciling errors, a new column is added to the subset, changing the schema. When the Merge method is called with the missingSchemaAction set to MissingSchemaAction.Add, the new column is added to the original DataSet object's schema.

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", 
    DataColumn itemColumn = new DataColumn("Item", 

    // 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(

    // Set primary key column.
    keyColumn[0]= idColumn;
    // Add ten rows.
    for(int i = 0; i <10;i++)
        row["Item"]= i;
    // Accept changes.
    PrintValues(dataSet, "Original values");

    // Change row values.
    table.Rows[0]["Item"]= 50;
    table.Rows[1]["Item"]= 111;

    // Add one 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(
        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)
                    if((int)changesRow["Item",DataRowVersion.Current ]> 100)
        // Add a column to the changesDataSet.
            new DataColumn("newColumn"));
        PrintValues(changesDataSet, "Reconciled subset values");
        // Merge changes back to first DataSet.
        dataSet.Merge(changesDataSet, false, 
    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] );

Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.

.NET Framework

Supported in: 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 2.0

XNA Framework

Supported in: 1.0