Batch-műveletek DataAdapters használatával

A következőre vonatkozik: .NET Framework .NET .NET Standard

ADO.NET letöltése

Az ADO.NET-ben a kötegelt feldolgozás támogatása lehetővé teszi a DataAdapter számára, hogy a INSERT vagy UPDATE felől érkező DELETE, DataSet és DataTable műveleteket a kiszolgálóra csoportosítva küldje el, ahelyett, hogy egyszerre csak egy műveletet küldene. A kiszolgálóra irányuló kerek utak számának csökkentése általában jelentős teljesítménynövekedést eredményez. A Batch-frissítés az SQL Serverhez készült Microsoft SqlClient-adatszolgáltató (Microsoft.Data.SqlClient) esetében támogatott.

Amikor egy adatbázist egy DataSet módosításaival frissít az ADO.NET korábbi verzióiban, egy UpdateDataAdapter metódusa egyszerre egy sort frissített az adatbázisban. Miközben végighaladt a megadott DataTable sorain, minden egyes DataRow elemet megvizsgált annak megállapítására, hogy módosították-e. Ha a sort módosították, az adott sor UpdateCommand tulajdonságának értékétől függően a megfelelő InsertCommand, DeleteCommand vagy RowState elemet hívta meg. Minden egyes sorfrissítés egy hálózati oda-vissza kommunikációt igényelt az adatbázissal.

Az SQL Serverhez készült Microsoft SqlClient-adatszolgáltató elérhetővé tesz egy SqlDataAdapter tulajdonságot a UpdateBatchSize. UpdateBatchSize A pozitív egész szám értékének beállítása miatt az adatbázis frissítései a megadott méretű kötegekként lesznek elküldve. A 10 értékre állítás UpdateBatchSize például 10 különálló utasítást csoportosít, és egyetlen kötegként küldi el őket. A UpdateBatchSize 0 értékre állítással a SqlDataAdapter kiszolgáló által kezelhető legnagyobb kötegméretet használhatja. Ha 1-re állítja, letiltja a kötegfrissítéseket, mivel a sorok egyenként lesznek elküldve.

Megjegyzés:

Egy rendkívül nagy köteg végrehajtása csökkentheti a teljesítményt. Ezért az alkalmazás implementálása előtt tesztelnie kell az optimális kötegméret-beállítást.

Az UpdateBatchSize tulajdonság használata

Ha a kötegfrissítések engedélyezve vannak, a UpdatedRowSource DataAdapter tulajdonságértékének UpdateCommandInsertCommandDeleteCommand a következőre kell lennie: None vagy OutputParameters. Kötegelt frissítés végrehajtásakor a parancs UpdatedRowSource tulajdonságának FirstReturnedRecord vagy Both értéke érvénytelen.

Az alábbi eljárás bemutatja a UpdateBatchSize tulajdonság használatát. Az eljárás két argumentumot vesz fel: egy DataSet objektumot, amelynek oszlopai a Production.ProductCategory tábla ProductCategoryID és Name mezőit jelölik, és egy egész szám, amely a köteg méretét (a köteg sorainak számát) jelöli. A kód létrehoz egy új SqlDataAdapter objektumot, amely beállítja annak UpdateCommand, InsertCommandés DeleteCommand tulajdonságait. A kód feltételezi, hogy az DataSet objektum módosított sorokkal rendelkezik. Beállítja a tulajdonságot UpdateBatchSize , és végrehajtja a frissítést.

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);
    }
}

A DataAdapter két frissítéssel kapcsolatos eseményt tartalmaz: RowUpdating és RowUpdated. További információ: DataAdapter-események kezelése.

Esemény viselkedésének változásai kötegfrissítésekkel

Ha a kötegelt feldolgozás engedélyezve van, több sor frissítése egyetlen adatbázis-művelet során történik. Ezért minden egyes köteghez csak egy RowUpdated esemény fordul elő, míg az RowUpdating esemény minden feldolgozott sorra vonatkozik. Ha a kötegelt feldolgozás le van tiltva, a két eseményt egy-az-egyhez összekapcsolással aktiválja a rendszer, ahol egy RowUpdating esemény és egy RowUpdated esemény aktiválódik egy sorra, majd egy RowUpdating és egy RowUpdated esemény aktiválódik a következő sorra, amíg az összes sor feldolgozásra nem kerül.

Frissített sorok elérése

Ha a kötegelt feldolgozás ki van kapcsolva, a frissített sor a Row osztály RowUpdatedEventArgs tulajdonságán keresztül érhető el.

Ha a kötegelt feldolgozás engedélyezve van, több sor esetén egyetlen RowUpdated esemény jön létre. Ezért az Row egyes sorok tulajdonságának értéke null. RowUpdating az események továbbra is létrejönnek minden sorhoz. Az CopyToRows osztály metódusa RowUpdatedEventArgs lehetővé teszi a feldolgozott sorok elérését a sorokra mutató hivatkozások tömbbe másolásával. Ha egyetlen sor sem kerül feldolgozásra, a(z) CopyToRows egy ArgumentNullException kivételt dob. A(z) RowCount tulajdonságot használja a(z) CopyToRows metódus meghívása előtt feldolgozott sorok számának visszaadásához.

Adathibák kezelése

A kötegelt végrehajtás hatása megegyezik az egyes utasítások külön-külön történő végrehajtásának hatásával. Az utasítások végrehajtása abban a sorrendben történik, amelyben az utasítások hozzá lettek adva a köteghez. A hibák kezelése ugyanúgy történik a kötegelt üzemmódban, mint amikor a kötegelt üzemmód le van tiltva. Minden sor feldolgozása külön történik. Csak az adatbázisban sikeresen feldolgozott sorok frissülnek a megfelelő DataRow helyen.DataTable

Megjegyzés:

Az SQL Serverhez tartozó Microsoft SqlClient adatszolgáltató és a háttéradatbázis-kiszolgáló határozzák meg, hogy mely SQL-szerkezetek támogatottak a kötegelt végrehajtáshoz. Kivétel akkor léphet fel, ha egy nem támogatott utasítást végrehajtásra küldenek.