Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: .NET Framework
.NET .NET
Standard
Die Batchunterstützung in ADO.NET ermöglicht es, DataAdapterINSERT, UPDATE und DELETE Operationen aus einem DataSet oder DataTable für den Server zu gruppieren, anstatt die Vorgänge einzeln zu senden. Durch das Reduzieren der Anzahl von Roundtrips zum Server kann im Allgemeinen die Leistung beträchtlich gesteigert werden. Batchupdates werden für den Microsoft SqlClient-Datenanbieter für SQL Server (Microsoft.Data.SqlClient) unterstützt.
Beim Aktualisieren einer Datenbank mit Änderungen aus einem DataSet führte die Update-Methode eines DataAdapter in früheren Versionen von ADO.NET die Aktualisierung der Datenbank jeweils Zeile für Zeile durch. Beim Durchlaufen der Zeilen in der angegebenen DataTable wurde jede DataRow daraufhin untersucht, ob sie geändert worden war. Wenn die Zeile geändert worden war, rief sie abhängig vom Wert der RowState-Eigenschaft dieser Zeile das entsprechende UpdateCommand, InsertCommand oder DeleteCommand auf. Für jede Zeilenaktualisierung war ein Netzwerkroundtrip zur Datenbank erforderlich.
Im Microsoft SqlClient-Datenanbieter für SQL Server verfügt SqlDataAdapter über die Eigenschaft UpdateBatchSize. Wenn die UpdateBatchSize-Eigenschaft auf einen positiven ganzzahligen Wert festgelegt wird, werden Updates der Datenbank als Batches mit der angegebenen Größe gesendet. Wenn z. B. für UpdateBatchSize der Wert 10 festgelegt wird, werden 10 separate Anweisungen gruppiert und als einzelner Batch übermittelt. Wird dagegen für UpdateBatchSize 0 festgelegt, verwendet der SqlDataAdapter die größtmöglichen Batches, die der Server unterstützt. Bei einem Wert von 1 werden Batchupdates deaktiviert, weil die Zeilen einzeln nacheinander gesendet werden.
Hinweis
Die Ausführung eines extrem großen Batches könnte die Leistung verringern. Daher sollten Sie die Einstellung für eine optimale Batchgröße vor der Implementierung Ihrer Anwendung austesten.
Verwenden der UpdateBatchSize-Eigenschaft
Wenn Batchupdates aktiviert sind, sollte der UpdatedRowSource-Eigenschaftswert von UpdateCommand, InsertCommand und DeleteCommand des DataAdapter auf None oder OutputParameters festgelegt werden. Bei einer Stapelaktualisierung ist der Eigenschaftswert UpdatedRowSource des Befehls FirstReturnedRecord oder Both ungültig.
In der folgenden Prozedur wird die Verwendung der UpdateBatchSize-Eigenschaft veranschaulicht. Die Prozedur akzeptiert zwei Argumente: ein DataSet-Objekt mit Spalten für die Felder ProductCategoryID und Name in der Production.ProductCategory-Tabelle und eine ganze Zahl, die die Batchgröße (die Anzahl der Zeilen im Batch) darstellt. Der Code erstellt ein neues SqlDataAdapter-Objekt und legt dessen Eigenschaften UpdateCommand, InsertCommand und DeleteCommand fest. Der Code geht davon aus, dass das DataSet-Objekt geänderte Zeilen aufweist. Er legt einen Wert für die UpdateBatchSize-Eigenschaft fest und führt das Update aus.
public static void BatchUpdate(DataTable dataTable, Int32 batchSize)
{
// Assumes GetConnectionString() returns a valid connection string.
string connectionString = GetConnectionString();
// Connect to the AdventureWorks database.
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create a SqlDataAdapter.
SqlDataAdapter adapter = new SqlDataAdapter();
// Set the UPDATE command and parameters.
adapter.UpdateCommand = new SqlCommand(
"UPDATE Production.ProductCategory SET "
+ "Name=@Name WHERE ProductCategoryID=@ProdCatID;",
connection);
adapter.UpdateCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.UpdateCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the INSERT command and parameter.
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);",
connection);
adapter.InsertCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the DELETE command and parameter.
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Production.ProductCategory "
+ "WHERE ProductCategoryID=@ProdCatID;", connection);
adapter.DeleteCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the batch size.
adapter.UpdateBatchSize = batchSize;
// Execute the update.
adapter.Update(dataTable);
}
}
Umgang mit Ereignissen und Fehlern im Zusammenhang mit Batchupdates
Die DataAdapter-Klasse verfügt über zwei updaterelevante Ereignisse: RowUpdating und RowUpdated. Weitere Informationen finden Sie unter Umgang mit DataAdapter-Ereignissen.
Änderungen am Ereignisverhalten durch Batch-Updates
Bei aktivierter Batchverarbeitung werden mehrere Zeilen in einer einzigen Datenbankoperation aktualisiert. Deshalb findet pro Batch nur ein RowUpdated-Ereignis statt, wohingegen das RowUpdating-Ereignis für jede verarbeitete Zeile auftritt. Wenn die Batchverarbeitung deaktiviert ist, werden die beiden Ereignisse abwechselnd eins zu eins ausgelöst: Für eine Zeile wird jeweils ein RowUpdating-Ereignis und ein RowUpdated-Ereignis ausgelöst, für die nächste Zeile dann jeweils ein RowUpdating-Ereignis und ein RowUpdated-Ereignis, bis alle Zeilen verarbeitet sind.
Zugreifen auf aktualisierte Zeilen
Bei deaktivierter Batchverarbeitung kann auf die zu aktualisierende Zeile mit der Row-Eigenschaft der RowUpdatedEventArgs-Klasse zugegriffen werden.
Bei aktivierter Batchverarbeitung wird für mehrere Zeilen ein einziges RowUpdated-Ereignis generiert. Daher ist der Wert der Row-Eigenschaft in jeder Zeile NULL. Es werden weiterhin RowUpdating-Ereignisse für jede Zeile generiert. Mit der CopyToRows-Methode der RowUpdatedEventArgs-Klasse können Sie auf die verarbeiteten Zeilen zugreifen, indem Sie Verweise auf die Zeilen in ein Array kopieren. Wenn keine Zeilen verarbeitet werden, löst CopyToRows eine ArgumentNullException aus. Verwenden Sie die RowCount-Eigenschaft, um vor dem Aufruf der CopyToRows-Methode die Anzahl der verarbeiteten Zeilen zurückzugeben.
Behandlung von Datenfehlern
Eine Batchausführung hat dieselbe Wirkung wie die Ausführung jeder einzelnen Anweisung. Anweisungen werden in der Reihenfolge ausgeführt, in der sie dem Batch hinzugefügt wurden. Fehler werden im Batchmodus in derselben Weise behandelt wie bei deaktiviertem Batchmodus. Jede Zeile wird einzeln verarbeitet. Nur Zeilen, die erfolgreich in der Datenbank verarbeitet wurden, werden in der entsprechenden DataRow innerhalb der DataTable aktualisiert.
Hinweis
Der Microsoft SqlClient-Datenanbieter für SQL Server und der Back-End-Datenbankserver bestimmen, welche SQL-Konstrukte für die Batchausführung unterstützt werden. Wenn eine nicht unterstützte Anweisung zur Ausführung übergeben wird, wird möglicherweise eine Ausnahme ausgelöst.