Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Podpora služby Batch v ADO.NET umožňuje DataAdapter seskupit operace INSERT, UPDATE a DELETE z DataSet nebo DataTable na server místo odesílání jedné operace najednou. Snížení počtu požadavků na server obvykle vede k významným zlepšením výkonu. Dávkové aktualizace jsou podporovány pro poskytovatele dat .NET pro SQL Server (System.Data.SqlClient) a Oracle (System.Data.OracleClient).
Při aktualizaci databáze se změnami z DataSet v předchozích verzích ADO.NET metoda Update objektu DataAdapter aktualizovala databázi po jednom řádku. Při průchodu řádky v zadaném DataTable se každý DataRow prozkoumal, aby se zjistilo, jestli byl změněn. Pokud byl řádek změněn, volal odpovídající UpdateCommand, InsertCommand, nebo DeleteCommand, v závislosti na hodnotě RowState vlastnosti toho řádku. Každá aktualizace řádku zahrnovala síťový přenos do databáze.
Počínaje ADO.NET 2.0 DbDataAdapter zveřejňuje UpdateBatchSize vlastnost.
UpdateBatchSize Nastavení na kladnou celočíselnou hodnotu způsobí, že se aktualizace databáze odešlou jako dávky zadané velikosti. Například nastavení UpdateBatchSize na 10 seskupí 10 samostatných příkazů a odešle je jako jednu dávku.
UpdateBatchSize Nastavení na 0 způsobí, že DataAdapter použije největší dávku, kterou server může zpracovat. Nastavením na 1 zakážete dávkové aktualizace, protože řádky se posílají po jednom.
Provedení extrémně velké dávky může snížit výkon. Proto byste měli před implementací aplikace otestovat optimální nastavení velikosti dávky.
Použití vlastnosti UpdateBatchSize
Pokud jsou povoleny dávkové aktualizace, UpdatedRowSource hodnota vlastnosti UpdateCommand DataAdapter InsertCommand a DeleteCommand by měla být nastavena na None nebo OutputParameters. Při provádění dávkové aktualizace je hodnota vlastnosti příkazu UpdatedRowSource s hodnotou FirstReturnedRecord nebo Both neplatná.
Následující postup ukazuje použití UpdateBatchSize vlastnosti. Procedura DataSet má dva argumenty, objekt, který obsahuje sloupce představující ProductCategoryID pole Name v tabulce Production.ProductCategory , a celé číslo představující velikost dávky (počet řádků v dávce). Kód vytvoří nový SqlDataAdapter objekt, nastaví jeho UpdateCommand, InsertCommanda DeleteCommand vlastnosti. Kód předpokládá, že DataSet objekt změnil řádky.
UpdateBatchSize Nastaví vlastnost a spustí aktualizaci.
Public Sub BatchUpdate( _
ByVal dataTable As DataTable, ByVal batchSize As Int32)
' Assumes GetConnectionString() returns a valid connection string.
Dim connectionString As String = GetConnectionString()
' Connect to the AdventureWorks database.
Using connection As New SqlConnection(connectionString)
' Create a SqlDataAdapter.
Dim adapter As 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)
End Using
End Sub
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);
}
}
Zpracování událostí a chyb souvisejících s dávkovou aktualizací
Obsahuje DataAdapter dvě události související s aktualizací: RowUpdating a RowUpdated. V předchozích verzích ADO.NET, když je dávkové zpracování zakázáno, se každá z těchto událostí vygeneruje jednou pro každý zpracovaný řádek.
RowUpdating se vygeneruje před aktualizací a RowUpdated vygeneruje se po dokončení aktualizace databáze.
Změny chování událostí pomocí dávkových aktualizací
Pokud je povolené dávkové zpracování, v jedné databázové operaci se aktualizuje více řádků. Proto pro každou dávku dojde pouze k jedné RowUpdated události, zatímco RowUpdating událost nastane pro každý řádek zpracovaný. Pokud je dávkové zpracování zakázané, aktivují se dvě události s prokládáním 1:1, kdy se jedna RowUpdating událost a jedna RowUpdated událost aktivuje pro řádek a pak jedna RowUpdating a jedna RowUpdated událost aktivuje pro další řádek, dokud se nezpracují všechny řádky.
Přístup k aktualizovaným řádkům
Pokud je dávkové zpracování zakázané, lze k aktualizovanému řádku přistupovat pomocí Row vlastnosti RowUpdatedEventArgs třídy.
Pokud je povolené dávkové zpracování, vygeneruje se jedna RowUpdated událost pro více řádků. Proto hodnota Row vlastnosti pro každý řádek má hodnotu null.
RowUpdating události se stále generují pro každý řádek.
CopyToRows Metoda RowUpdatedEventArgs třídy umožňuje přístup ke zpracovaným řádkům zkopírováním odkazů na řádky do pole. Pokud nejsou zpracovávány žádné řádky, CopyToRows vyvolá výjimku ArgumentNullException. Použijte vlastnost RowCount pro vrácení počtu zpracovaných řádků před voláním metody CopyToRows.
Zpracování chyb dat
Dávkové spuštění má stejný účinek jako spuštění každého jednotlivého příkazu. Příkazy se provádějí v pořadí, v jakém byly příkazy přidány do dávky. Chyby se zpracovávají stejným způsobem v dávkovém režimu i v případě, že je dávkový režim zakázán. Každý řádek se zpracovává samostatně. V odpovídajícím DataRow v rámci DataTable budou aktualizovány pouze řádky, které byly úspěšně zpracovány v databázi.
Zprostředkovatel dat a back-endový databázový server určují, které konstrukce SQL jsou podporovány pro dávkové spouštění. Může být vyvolána výjimka, pokud je odeslán k provedení nepodporovaný příkaz.