DataAdapter.AcceptChangesDuringUpdate Eigenschaft

Definition

Ruft ab oder legt fest, ob AcceptChanges() während eines Update(DataSet) aufgerufen wird.

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

Boolean

true, wenn AcceptChanges() während eines Update(DataSet) aufgerufen wird, andernfalls false. Der Standardwert ist 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. Durch Festlegen der Eigenschaft des SqlDataAdapter Werts zum false Beibehalten des ursprünglichen automatischen Inkrementierungswerts können die neuen Daten dann in das Original DataTablezusammengeführt werden, auch wenn der neue Identitätswert nicht mit dem ursprünglichen automatischen Inkrementierungswert übereinstimmtDataTable.AcceptChangesDuringUpdate

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 Aufrufs der Update Methode einer DataAdapterDatenbank kann die Datenbank Daten als Ausgabeparameter oder als erster zurückgegebener Datensatz eines Resultsets zurück an Ihre ADO.NET Anwendung senden. ADO.NET kann diese Werte abrufen und die entsprechenden Spalten in der zu aktualisierenden DataRow aktualisieren. Standardmäßig ruft ADO.NET die AcceptChanges Methode nach DataRow dem Update auf. Wenn Sie die aktualisierte Zeile jedoch wieder in eine andere DataTablezusammenführen möchten, sollten Sie den ursprünglichen Wert einer Primärschlüsselspalte beibehalten. Beispielsweise kann eine Primärschlüsselspalte, die einer automatisch inkrementierenden Spalte in der Datenbank entspricht, z. B. eine Identitätsspalte, neue Werte enthalten, die der Datenbank zugewiesen werden, die nicht mit den ursprünglichen Werten übereinstimmen, die in der DataRowDatenbank zugewiesen sind. Standardmäßig AcceptChanges wird implizit nach einer Aktualisierung aufgerufen, und die ursprünglichen Werte in der Zeile, die möglicherweise von ADO.NET zugewiesen wurden AutoIncrement , gehen verloren. Sie können die ursprünglichen Werte in der DataRow Datei beibehalten, indem Sie verhindern ADO.NET , dass sie aufgerufen AcceptChanges wird, nachdem sie eine Aktualisierung in einer Zeile ausgeführt hat, indem Sie die AcceptChangesDuringUpdate Eigenschaft auf falsefestlegen, auf die die ursprünglichen Werte beibehalten werden.

Hinweis

Legen Sie die AcceptChangesDuringUpdate Eigenschaft fest, die false für alle Datenänderungen gilt, nicht nur Einfügungen. Wenn Sie Zeilen in derselben Aktualisierung bearbeiten oder löschen möchten, und wenn Sie den Aufruf AcceptChanges nur für Einfügungen unterdrücken möchten, verwenden Sie anstelle der Einstellung false``AcceptChangesDuringUpdate einen Ereignishandler für das RowUpdated Ereignis des DataAdapterEreignisses. Im Ereignishandler können Sie überprüfenStatementType, ob es sich bei der Datenänderung um ein Einfügen handelt, und wenn true, legen Sie die Status Eigenschaft der Datei auf SkipCurrentRow.RowUpdatedEventArgs Weitere Informationen und ein Beispiel finden Sie unter Abrufen von Identitäts- oder Autowertwerten.

Gilt für

Siehe auch