DataAdapter.AcceptChangesDuringUpdate Eigenschaft

Definition

Ruft ab oder legt fest, ob AcceptChanges() während eines Update(DataSet) aufgerufen wird.Gets or sets whether AcceptChanges() is called during a 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

Eigenschaftswert

true, wenn AcceptChanges() während eines Update(DataSet) aufgerufen wird, andernfalls false.true if AcceptChanges() is called during an Update(DataSet); otherwise false. Die Standardeinstellung ist true.The default is true.

Beispiele

Dieses Beispiel zeigt das Extrahieren geänderter Zeilen aus einer DataTable und das Verwenden eines SqlDataAdapter, um die Datenquelle zu aktualisieren und einen neuen Wert aus der Identitätsspalte abzurufen.This example demonstrates extracting changed rows from a DataTable and using a SqlDataAdapter to update the data source and retrieve a new identity column value. Wenn Sie die AcceptChangesDuringUpdate-Eigenschaft des SqlDataAdapter auf false festlegen, um den ursprünglichen automatischen Inkrement-Wert beizubehalten, können die neuen Daten dann in den ursprünglichen DataTablezusammengeführt werden, auch wenn der neue Identitäts Wert nicht mit dem ursprünglichen automatischen Inkrement-Wert im DataTableidentisch ist.By setting the AcceptChangesDuringUpdate property of the SqlDataAdapter to false to preserve the original auto increment value, the new data can then be merged into the original DataTable, even if the new identity value does not match the original auto increment value in the 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

Hinweise

Während eines Aufrufens der Update-Methode einer DataAdapterkann die Datenbank Daten als Ausgabeparameter oder als ersten zurückgegebenen Datensatz eines Resultsets zurück an Ihre ADO.NET-Anwendung senden.During a call to the Update method of a DataAdapter, the database can send data back to your ADO.NET application as output parameters or as the first returned record of a result set. ADO.NET kann diese Werte abrufen und die entsprechenden Spalten in der zu aktualisierenden DataRow aktualisieren.ADO.NET can retrieve these values and update the corresponding columns in the DataRow being updated. Standardmäßig ruft ADO.net die AcceptChanges-Methode der DataRow nach dem Update auf.By default, ADO.NET calls the AcceptChanges method of the DataRow after the update. Wenn Sie die aktualisierte Zeile jedoch wieder in eine andere DataTablezusammenführen möchten, können Sie den ursprünglichen Wert einer Primärschlüssel Spalte als präserver ausführen.However, if you want to merge the updated row back into another DataTable, you may want to preserver the original value of a primary key column. Beispielsweise kann eine Primärschlüssel Spalte, die einer automatisch inkrementierten Spalte in der Datenbank entspricht, z. b. eine Identitäts Spalte, neue Werte enthalten, die von der Datenbank zugewiesen werden, die nicht mit den ursprünglichen Werten übereinstimmen, die in der DataRowzugewiesen sind.For example, a primary key column corresponding to an automatically incrementing column in the database, such as an identity column, can contain new values that are assigned by the database that do not match the original values assigned in the DataRow. Standardmäßig wird AcceptChanges nach einem Update implizit aufgerufen, und die ursprünglichen Werte in der Zeile, die möglicherweise AutoIncrement von ADO.net zugewiesene Werte waren, gehen verloren.By default, AcceptChanges is called implicitly after an update, and the original values in the row, which may have been AutoIncrement values assigned by ADO.NET, are lost. Sie können die ursprünglichen Werte in der DataRow beibehalten, indem Sie verhindern, dass ADO.NET nach dem Ausführen eines Updates für eine Zeile AcceptChanges aufrufen, indem Sie die AcceptChangesDuringUpdate-Eigenschaft auf falsefestlegen, wodurch die ursprünglichen Werte beibehalten werden.You can preserve the original values in the DataRow by preventing ADO.NET from calling AcceptChanges after it performs an update on a row, by setting the AcceptChangesDuringUpdate property to false, which preserves the original values.

Hinweis

Das Festlegen der AcceptChangesDuringUpdate-Eigenschaft auf false gilt für alle Datenänderungen, nicht nur für Einfügungen.Setting the AcceptChangesDuringUpdate property to false applies to all data modifications, not only inserts. Wenn Sie Zeilen im gleichen Update bearbeiten oder löschen möchten, und wenn Sie den AcceptChanges nur für Einfügungen unterdrücken möchten, verwenden Sie anstelle der AcceptChangesDuringUpdate falseeinen Ereignishandler für das RowUpdated-Ereignis des DataAdapter.If you want to edit or delete rows in the same update, and if you want to suppress the call to AcceptChanges only for inserts, then instead of setting AcceptChangesDuringUpdate to false, use an event handler for the RowUpdated event of the DataAdapter. Im-Ereignishandler können Sie den StatementType überprüfen, um zu bestimmen, ob die Datenänderung eine Einfügung ist. wenn true, legen Sie die Eigenschaft Status der RowUpdatedEventArgs auf SkipCurrentRowfest.In the event handler, you can check the StatementType to determine if the data modification is an insert, and if true, set the Status property of the RowUpdatedEventArgs to SkipCurrentRow. Weitere Informationen und ein Beispiel finden Sie unter Abrufen von Identitäts-oderAuto Sequenz Werten.For more information and an example, see Retrieving Identity or Autonumber Values.

Gilt für:

Siehe auch