Megosztás a következőn keresztül:


Batch-műveletek végrehajtása DataAdapters használatával

A Batch támogatása ADO.NET lehetővé teszi DataAdapter az IN Standard kiadás RT, UPDATE és DELETE műveletek csoportosítását egy DataSet vagy DataTable több kiszolgálóról ahelyett, hogy egyszerre 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ések az SQL Server () és az Oracle (System.Data.SqlClientSystem.Data.OracleClient) .NET-adatszolgáltatói számára támogatottak.

Ha az adatbázist az ADO.NET korábbi DataSet verzióinak módosításaival frissíti, az Update adatbázison végrehajtott frissítések módszere DataAdapter egyszerre egy sorban. Ahogy a megadott DataTablesorokon haladt végig, mindegyiknél DataRow megvizsgálta, hogy módosították-e. Ha a sort módosították, az adott sor tulajdonságának értékétől függően a megfelelőnek vagy DeleteCommanda RowState megfelelőnek UpdateCommandInsertCommandnevezte. Minden sorfrissítéshez az adatbázis teljes hálózata kapcsolódott.

A ADO.NET 2.0-tól kezdve a DbDataAdapter rendszer egy tulajdonságot UpdateBatchSize tesz elérhetővé. 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 DataAdapter 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.

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ötegfrissítés végrehajtásakor a parancs UpdatedRowSource tulajdonságértéke FirstReturnedRecord érvénytelen vagy Both érvénytelen.

Az alábbi eljárás a tulajdonság használatát UpdateBatchSize mutatja be. 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 sorokat. Beállítja a tulajdonságot UpdateBatchSize , és végrehajtja a frissítést.

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

A DataAdapter két frissítéssel kapcsolatos eseményt tartalmaz: RowUpdating és RowUpdated. A ADO.NET korábbi verzióiban, amikor a kötegelt feldolgozás le van tiltva, a rendszer minden egyes feldolgozott sorhoz egyszer létrehozza ezeket az eseményeket. A rowUpdating a frissítés előtt jön létre, a RowUpdated pedig az adatbázis frissítésének befejezése után jön létre.

Esemény viselkedésének változásai a Batch Frissítések

Ha a kötegelt feldolgozás engedélyezve van, több sor is frissül egyetlen adatbázisműveletben. 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 le van tiltva, a frissítendő sor az osztály tulajdonságával RowUpdatedEventArgs érhető elRow.

Ha a kötegelt feldolgozás engedélyezve van, a rendszer egyetlen RowUpdated eseményt hoz létre több sorhoz. Ezért az Row egyes sorok tulajdonságának értéke null. RowUpdating az események továbbra is létre lesznek hozva az egyes sorokhoz. 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 nem dolgoznak fel sorokat, CopyToRows a rendszer egy ArgumentNullException. RowCount A tulajdonság használatával adja vissza a metódus meghívása CopyToRows előtt feldolgozott sorok számát.

Adathibák kezelése

A kötegelt végrehajtásnak ugyanaz a hatása, mint az egyes utasítások végrehajtásának. 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 kötegelt módban, mint amikor a köteg mó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

Az adatszolgáltató és a háttéradatbázis-kiszolgáló határozza 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 nyújtanak be végrehajtásra.

Lásd még