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
, InsertCommand
of 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 UpdateCommand
worden InsertCommand
DeleteCommand
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);
}
}
Gebeurtenissen en fouten met betrekking tot Batch-updates verwerken
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.