DataAdapter.AcceptChangesDuringUpdate Eigenschaft
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
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 AcceptChangesDuringUpdate
-Eigenschaft von SqlDataAdapter auf, um false
den ursprünglichen automatischen Inkrementwert beizubehalten, können die neuen Daten dann mit dem ursprünglichen DataTablezusammengeführt werden, auch wenn der neue Identitätswert nicht mit dem ursprünglichen automatischen Inkrementwert in der DataTable
übereinstimmt.
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 von DataAdapter
kann die Datenbank Daten als Ausgabeparameter oder als ersten zurückgegebenen Datensatz eines Resultsets an Ihre ADO.NET Anwendung zurücksenden. ADO.NET kann diese Werte abrufen und die entsprechenden Spalten in der zu aktualisierenden DataRow aktualisieren. Standardmäßig ruft ADO.NET die AcceptChanges
Methode von DataRow
nach dem Update auf. Wenn Sie jedoch die aktualisierte Zeile wieder in eine andere DataTablezusammenführen möchten, können 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 von der Datenbank zugewiesen werden, die nicht mit den ursprünglichen Werten übereinstimmen, die DataRow
in zugewiesen sind. Standardmäßig AcceptChanges
wird nach einer Aktualisierung implizit 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 im DataRow
beibehalten, indem Sie verhindern ADO.NET
, dass sie aufgerufen wird AcceptChanges
, nachdem sie eine Aktualisierung für eine Zeile durchgeführt hat, indem Sie die AcceptChangesDuringUpdate -Eigenschaft auf false
festlegen, wodurch die ursprünglichen Werte beibehalten werden.
Hinweis
Das Festlegen der AcceptChangesDuringUpdate
Eigenschaft auf false
gilt für alle Datenänderungen, nicht nur für Einfügungen. Wenn Sie Zeilen im selben Update bearbeiten oder löschen möchten, und wenn Sie den Aufruf AcceptChanges
von nur für Einfügevorgänge unterdrücken möchten, verwenden Sie anstelle der Einstellung AcceptChangesDuringUpdate
auf false
einen Ereignishandler für das RowUpdated
-Ereignis von DataAdapter
. Im Ereignishandler können Sie überprüfen, ob es StatementType sich bei der Datenänderung um einen Einfügevorgang handelt, und wenn true
, legen Sie die Status -Eigenschaft auf RowUpdatedEventArgs fest SkipCurrentRow. Weitere Informationen und ein Beispiel finden Sie unter Abrufen von Identity- oder Autonumber-Werten.