Compartir a través de


DataAdapter.AcceptChangesDuringUpdate Propiedad

Definición

Obtiene o establece si se llama a AcceptChanges() durante una operación Update(DataSet).

public:
 property bool AcceptChangesDuringUpdate { bool get(); void set(bool value); };
public bool AcceptChangesDuringUpdate { get; set; }
member this.AcceptChangesDuringUpdate : bool with get, set
Public Property AcceptChangesDuringUpdate As Boolean

Valor de propiedad

true si se llama a AcceptChanges() durante una operación Update(DataSet); de lo contrario, false. De manera predeterminada, es true.

Ejemplos

Este ejemplo muestra la extracción de filas modificadas desde DataTable y el uso de SqlDataAdapter para actualizar el origen de datos y recuperar un nuevo valor de columna de identidad. Al establecer la AcceptChangesDuringUpdate propiedad de SqlDataAdapter en false para conservar el valor de incremento automático original, los nuevos datos se pueden combinar en el original DataTable, incluso si el nuevo valor de identidad no coincide con el valor de incremento automático original en DataTable.

private static void MergeIdentityColumns(string connectionString)
{
    using (SqlConnection connection =
               new SqlConnection(connectionString))
    {
        // Create the DataAdapter
        SqlDataAdapter adapter =
            new SqlDataAdapter(
            "SELECT ShipperID, CompanyName FROM dbo.Shippers",
            connection);

        //Add the InsertCommand to retrieve new identity value.
        adapter.InsertCommand = new SqlCommand(
            "INSERT INTO dbo.Shippers (CompanyName) " +
            "VALUES (@CompanyName); " +
            "SELECT ShipperID, CompanyName FROM dbo.Shippers " +
            "WHERE ShipperID = SCOPE_IDENTITY();", connection);

        // Set AcceptChangesDuringUpdate to false
        adapter.AcceptChangesDuringUpdate = false;

        // Add the parameter for the inserted value.
        adapter.InsertCommand.Parameters.Add(
           new SqlParameter("@CompanyName", SqlDbType.NVarChar, 40,
           "CompanyName"));
        adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;

        // MissingSchemaAction adds any missing schema to
        // the DataTable, including auto increment columns
        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

        // Fill a DataTable.
        DataTable shipper = new DataTable();
        adapter.Fill(shipper);

        // Add a new shipper row.
        DataRow newRow = shipper.NewRow();
        newRow["CompanyName"] = "New Shipper";
        shipper.Rows.Add(newRow);

        // Add changed rows to a new DataTable. This
        // DataTable will be used to update the data source.
        DataTable dataChanges = shipper.GetChanges();

        adapter.Update(dataChanges);
        connection.Close();

        Console.WriteLine("Rows after merge.");
        foreach (DataRow rowBefore in shipper.Rows)
        {
            {
                Console.WriteLine("{0}: {1}", rowBefore[0], rowBefore[1]);
            }
        }

        // Merge the two DataTables to get new values.
        shipper.Merge(dataChanges);

        // Commit the changes.
        shipper.AcceptChanges();

        Console.WriteLine("Rows after merge.");
        foreach (DataRow rowAfter in shipper.Rows)
        {
            {
                Console.WriteLine("{0}: {1}", rowAfter[0], rowAfter[1]);
            }
        }
    }
}
Private Sub MergeIdentityColumns(ByVal connectionString As String)

    Using connection As SqlConnection = New SqlConnection( _
       connectionString)

        ' Create the DataAdapter
        Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
          "SELECT ShipperID, CompanyName FROM dbo.Shippers", connection)

        ' Add the InsertCommand to retrieve new identity value.
        adapter.InsertCommand = New SqlCommand( _
            "INSERT INTO dbo.Shippers (CompanyName) " & _
            "VALUES (@CompanyName); " & _
            "SELECT ShipperID, CompanyName FROM dbo.Shippers " & _
            "WHERE ShipperID = SCOPE_IDENTITY();", _
            connection)

        ' Set AcceptChangesDuringUpdate to false.
        adapter.AcceptChangesDuringUpdate = False

        ' Add the parameter for the inserted value.
        adapter.InsertCommand.Parameters.Add( _
           New SqlParameter("@CompanyName", SqlDbType.NVarChar, 40, _
           "CompanyName"))
        adapter.InsertCommand.UpdatedRowSource = _
           UpdateRowSource.FirstReturnedRecord

        ' MissingSchemaAction adds any missing schema to 
        ' the DataTable, including auto increment columns
        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey

        ' Fill a DataTable.
        Dim shipper As New DataTable
        adapter.Fill(shipper)

        ' Add a new shipper row. 
        Dim newRow As DataRow = shipper.NewRow()
        newRow("CompanyName") = "New Shipper"
        shipper.Rows.Add(newRow)

        ' Add changed rows to a new DataTable. This
        ' DataTable will be used to update the data source.
        Dim dataChanges As DataTable = shipper.GetChanges()

        ' Update the data source with the modified records.
        adapter.Update(dataChanges)

        Console.WriteLine("Rows before merge.")
        Dim rowBefore As DataRow
        For Each rowBefore In shipper.Rows
            Console.WriteLine("{0}: {1}", rowBefore(0), rowBefore(1))
        Next

        ' Merge the two DataTables to get new values.
        shipper.Merge(dataChanges)

        ' Commit the changes.
        shipper.AcceptChanges()

        Console.WriteLine("Rows after merge.")
        Dim rowAfter As DataRow
        For Each rowAfter In shipper.Rows
            Console.WriteLine("{0}: {1}", rowAfter(0), rowAfter(1))
        Next
    End Using
End Sub

Comentarios

Durante una llamada al Update método de , DataAdapterla base de datos puede devolver datos a la aplicación ADO.NET como parámetros de salida o como el primer registro devuelto de un conjunto de resultados. ADO.NET puede recuperar estos valores y actualizar las columnas correspondientes en el DataRow que se está actualizando. De forma predeterminada, ADO.NET llama al AcceptChanges método de después de DataRow la actualización. Sin embargo, si desea volver a combinar la fila actualizada en otra DataTable, es posible que desee conservar el valor original de una columna de clave principal. Por ejemplo, una columna de clave principal correspondiente a una columna de incremento automático en la base de datos, como una columna de identidad, puede contener nuevos valores asignados por la base de datos que no coincidan con los valores originales asignados en .DataRow De forma predeterminada, AcceptChanges se llama implícitamente después de una actualización y se pierden los valores originales de la fila, que pueden haber sido AutoIncrement valores asignados por ADO.NET. Puede conservar los valores originales en DataRow evitando ADO.NET llamar a AcceptChanges después de realizar una actualización en una fila estableciendo la AcceptChangesDuringUpdate propiedad falseen , que conserva los valores originales.

Nota

Establecer la AcceptChangesDuringUpdate propiedad en false se aplica a todas las modificaciones de datos, no solo las inserciones. Si desea editar o eliminar filas en la misma actualización y si desea suprimir la llamada a AcceptChanges solo para inserciones, en lugar de establecer AcceptChangesDuringUpdatefalseen , use un controlador de eventos para el RowUpdated evento de DataAdapter. En el controlador de eventos, puede comprobar para StatementType determinar si la modificación de datos es una inserción y si true, establezca la Status propiedad de en RowUpdatedEventArgsSkipCurrentRow. Para más información y un ejemplo, vea Recuperar valores de identidad o autonumeración.

Se aplica a

Consulte también