Sdílet prostřednictvím


Provádění dávkových operací pomocí objektů DataAdapter

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 odezvy na server obvykle vede k významným nárůstů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 předchozích verzí ADO.NET metoda Update provedených DataAdapter aktualizací databáze po jednom řádku. Při iterated přes řádky v zadaném parametru DataTablese jednotlivé DataRow řádky prozkoumaly a zjistily, jestli byly změněny. Pokud byl řádek změněn, volal odpovídající UpdateCommandInsertCommand, nebo DeleteCommand, v závislosti na hodnotě RowState vlastnosti pro tento řádek. Každá aktualizace řádku zahrnovala síťovou odezvu 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í hodnoty 0 způsobí DataAdapter použití největší velikosti dávky, kterou může server 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 DataAdapter InsertCommandUpdateCommand, a DeleteCommand měla by být nastavena na None nebo OutputParameters. Při provádění dávkové aktualizace je hodnota FirstReturnedRecord vlastnosti příkazu UpdatedRowSource nebo Both je 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 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);
    }
}

DataAdapter má dvě události související s aktualizací: RowUpdating a RowUpdated. V předchozích verzích ADO.NET se při dávkovém zpracování vygenerují všechny tyto události jednou pro každý zpracovaný řádek. Funkce RowUpdating se vygeneruje před aktualizací a po dokončení aktualizace databáze se vygeneruje RowUpdated .

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

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 jako v dávkovém režimu, jako když je režim dávky zakázaný. Každý řádek se zpracovává samostatně. V odpovídající DataRow databázi budou aktualizovány pouze řádky, které byly úspěšně zpracovány v DataTabledatabázi .

Zprostředkovatel dat a back-endový databázový server určují, které konstrukce SQL jsou podporovány pro dávkové spouštění. Výjimku může vyvolat, pokud se k provedení odešle nepodporovaný příkaz.

Viz také