Delen via


Batchbewerkingen uitvoeren met Behulp van DataAdapters

Batch-ondersteuning in ADO.NET maakt het mogelijk DataAdapter om INSERT-, UPDATE- en DELETE-bewerkingen van een DataSet of DataTable naar de server te groeperen in plaats van één bewerking tegelijk te verzenden. De vermindering van het aantal retouren naar de server leidt doorgaans tot aanzienlijke prestatieverbeteringen. Batch-updates worden ondersteund voor de .NET-gegevensproviders voor SQL Server (System.Data.SqlClient) en Oracle (System.Data.OracleClient).

Wanneer u een database bijwerkt met wijzigingen van een DataSet in eerdere versies van ADO.NET, wordt de Update methode van een DataAdapter uitgevoerde update voor de database één rij tegelijk uitgevoerd. Zoals het door de rijen in de opgegeven DataTable, heeft het elk DataRow bekeken om te zien of deze is gewijzigd. Als de rij is gewijzigd, wordt deze de juiste UpdateCommand, InsertCommandof DeleteCommand, genoemd, afhankelijk van de waarde van de RowState eigenschap voor die rij. Elke rij wordt bijgewerkt met een retour van het netwerk naar de database.

Vanaf ADO.NET 2.0 wordt een DbDataAdapter UpdateBatchSize eigenschap weergegeven. Als u de waarde UpdateBatchSize instelt op een positief geheel getal, worden updates naar de database verzonden als batches van de opgegeven grootte. Als u bijvoorbeeld de UpdateBatchSize waarde op 10 instelt, worden 10 afzonderlijke instructies gegroepeerd en als één batch verzonden. Als u de UpdateBatchSize waarde instelt op 0, wordt de DataAdapter grootste batchgrootte gebruikt die door de server kan worden verwerkt. Als u dit instelt op 1, worden batchupdates uitgeschakeld, omdat er één voor één rijen worden verzonden.

Het uitvoeren van een extreem grote batch kan de prestaties verminderen. Daarom moet u testen op de optimale instelling voor batchgrootte voordat u uw toepassing implementeert.

De eigenschap UpdateBatchSize gebruiken

Wanneer batchupdates zijn ingeschakeld, moet de UpdatedRowSource eigenschapswaarde van de DataAdapter UpdateCommandworden InsertCommandDeleteCommand ingesteld None op ofOutputParameters. Bij het uitvoeren van een batch-update is de eigenschapswaarde van de opdracht UpdatedRowSource ongeldig FirstReturnedRecord of Both ongeldig.

In de volgende procedure ziet u het gebruik van de UpdateBatchSize eigenschap. De procedure heeft twee argumenten: een DataSet object met kolommen die de velden ProductCategoryID en Naam in de tabel Production.ProductCategory vertegenwoordigen en een geheel getal dat de batchgrootte aangeeft (het aantal rijen in de batch). Met de code maakt u een nieuw SqlDataAdapter object, stelt u het UpdateCommandobject in InsertCommanden de DeleteCommand eigenschappen. In de code wordt ervan uitgegaan dat het DataSet object rijen heeft gewijzigd. Hiermee wordt de UpdateBatchSize eigenschap ingesteld en wordt de update uitgevoerd.

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

De DataAdapter heeft twee updategerelateerde gebeurtenissen: RowUpdating en RowUpdated. In eerdere versies van ADO.NET, wanneer batchverwerking is uitgeschakeld, wordt elk van deze gebeurtenissen eenmaal gegenereerd voor elke verwerkte rij. RowUpdating wordt gegenereerd voordat de update plaatsvindt en RowUpdated wordt gegenereerd nadat de database-update is voltooid.

Wijzigingen in gebeurtenisgedrag met Batch-updates

Wanneer batchverwerking is ingeschakeld, worden meerdere rijen bijgewerkt in één databasebewerking. Daarom vindt slechts één RowUpdated gebeurtenis plaats voor elke batch, terwijl de RowUpdating gebeurtenis plaatsvindt voor elke verwerkte rij. Wanneer batchverwerking is uitgeschakeld, worden de twee gebeurtenissen geactiveerd met een-op-een-interleaving, waarbij één RowUpdating gebeurtenis en één RowUpdated gebeurtenis voor een rij worden geactiveerd en vervolgens één RowUpdating en één RowUpdated gebeurtenis voor de volgende rij worden geactiveerd, totdat alle rijen worden verwerkt.

Bijgewerkte rijen openen

Wanneer batchverwerking is uitgeschakeld, kan de rij die wordt bijgewerkt, worden geopend met behulp van de Row eigenschap van de RowUpdatedEventArgs klasse.

Wanneer batchverwerking is ingeschakeld, wordt één RowUpdated gebeurtenis gegenereerd voor meerdere rijen. Daarom is de waarde van de Row eigenschap voor elke rij null. RowUpdating gebeurtenissen worden nog steeds gegenereerd voor elke rij. Met CopyToRows de methode van de RowUpdatedEventArgs klasse kunt u toegang krijgen tot de verwerkte rijen door verwijzingen naar de rijen naar een matrix te kopiëren. Als er geen rijen worden verwerkt, CopyToRows genereert u een ArgumentNullException. Gebruik de RowCount eigenschap om het aantal rijen te retourneren dat is verwerkt voordat u de CopyToRows methode aanroept.

Gegevensfouten verwerken

Batchuitvoering heeft hetzelfde effect als de uitvoering van elke afzonderlijke instructie. Instructies worden uitgevoerd in de volgorde waarin de instructies zijn toegevoegd aan de batch. Fouten worden op dezelfde manier verwerkt in de batchmodus als wanneer de batchmodus is uitgeschakeld. Elke rij wordt afzonderlijk verwerkt. Alleen rijen die met succes in de database zijn verwerkt, worden bijgewerkt in de corresponderende DataRow binnen de DataTabledatabase.

De gegevensprovider en de back-enddatabaseserver bepalen welke SQL-constructies worden ondersteund voor batchuitvoering. Er kan een uitzondering optreden als er een niet-ondersteunde instructie wordt ingediend voor uitvoering.

Zie ook