Dávkové operace s využitím objektů DataAdapter

Platí pro: .NET Framework .NET Standard

Stáhnout ADO.NET

Podpora batch v ADO.NET umožňuje DataAdapter seskupit INSERT, UPDATEa DELETE operace z DataSet nebo DataTable na server namísto odesílání jedné operace najednou. Snížení počtu komunikací se serverem obvykle vede k významnému zvýšení výkonu. Dávková aktualizace je podporovaná pro zprostředkovatele dat Microsoft SqlClient pro SQL Server (Microsoft.Data.SqlClient).

Při aktualizaci databáze se změnami z DataSet v předchozích verzích ADO.NET prováděla metoda Update objektu DataAdapter aktualizace databáze po jednom řádku. Při procházení řádků v zadaném DataTable kontroloval každé DataRow, zda bylo upraveno. Pokud byl řádek změněn, zavolala se příslušná UpdateCommand, InsertCommand nebo DeleteCommand v závislosti na hodnotě vlastnosti RowState pro daný řádek. Každá aktualizace řádku vyžadovala cestu tam a zpět po síti k databázi.

U zprostředkovatele dat Microsoft SqlClient pro SQL Server SqlDataAdapter 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. Nastavení UpdateBatchSize na 0 způsobí, že SqlDataAdapter použije maximální velikost dávky, kterou server dokáže zpracovat. Nastavení hodnoty 1 zakáže dávkové aktualizace, protože řádky se odesílají po jednom.

Poznámka:

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žijte vlastnost UpdateBatchSize

Pokud jsou dávkové aktualizace povoleny, hodnota vlastnosti UpdatedRowSource objektů UpdateCommand, InsertCommand a DeleteCommand adaptéru DataAdapter by měla být nastavena na None nebo OutputParameters. Při provádění dávkové aktualizace je hodnota vlastnosti UpdatedRowSource příkazu 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í pole ProductCategoryID a 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 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);
    }
}

DataAdapter má dvě události související s aktualizací: RowUpdating a RowUpdated. Další informace naleznete v tématu Zpracování událostí dataAdapter.

Změny chování událostí při dávkových aktualizacích

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. Pomocí vlastnosti RowCount vraťte počet řádků zpracovaných před voláním metody CopyToRows.

Zpracování chyb dat

Dávkové provedení má stejný účinek jako provedení 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 v dávkovém režimu zpracovávají stejným způsobem jako při vypnutém dávkovém režimu. Každý řádek se zpracovává samostatně. Aktualizovány budou pouze řádky, které byly v databázi úspěšně zpracovány, a to v odpovídajícím DataRow v rámci DataTable.

Poznámka:

Zprostředkovatel dat Microsoft SqlClient pro SQL Server a back-end databázový server určují, které konstrukce SQL jsou podporovány pro dávkové spouštění. Může dojít k výjimce, pokud je k provedení odeslán nepodporovaný příkaz.