Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: .NET Framework
.NET
Standard
Met batchondersteuning in ADO.NET kan een DataAdapterINSERT-, UPDATE- en DELETE-bewerkingen van een DataSet of DataTable naar de server groeperen, in plaats van telkens één bewerking te verzenden. De vermindering van het aantal retouren naar de server leidt doorgaans tot aanzienlijke prestatieverbeteringen. Batch-update wordt ondersteund voor de Microsoft SqlClient-gegevensprovider voor SQL Server (Microsoft.Data.SqlClient).
Wanneer u een database bijwerkt met wijzigingen van een DataSet in eerdere versies van ADO.NET, voerde de methode Update van een DataAdapter de updates naar de database telkens één rij tegelijk uit. Toen het de rijen in de opgegeven DataTable doorliep, onderzocht het elke DataRow om te zien of deze was 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-update vergde een netwerk-roundtrip naar de database.
Bij de Microsoft SqlClient-gegevensprovider voor SQL Server wordt de eigenschap SqlDataAdapter weergegeven door UpdateBatchSize. 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 waarde van UpdateBatchSize instelt op 0, zal SqlDataAdapter de grootste batchgrootte gebruiken die de server kan verwerken. Als u dit instelt op 1, worden batchupdates uitgeschakeld, omdat er één voor één rijen worden verzonden.
Opmerking
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 waarde van de eigenschap UpdatedRowSource van de DataAdapter-UpdateCommand, InsertCommand en DeleteCommand worden ingesteld op None of OutputParameters. Bij het uitvoeren van een batch-update is de waarde FirstReturnedRecord of Both voor de eigenschap UpdatedRowSource van de opdracht 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). De code maakt een nieuw SqlDataAdapter-object, waarbij de eigenschappen UpdateCommand, InsertCommand en DeleteCommand worden ingesteld. 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 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 batchupdates verwerken
De DataAdapter heeft twee updategerelateerde gebeurtenissen: RowUpdating en RowUpdated. Zie DataAdapter-gebeurtenissen verwerken voor meer informatie.
Wijzigingen in gebeurtenisgedrag met batchupdates
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, werpt CopyToRows 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. Statements worden uitgevoerd in de volgorde waarin ze aan de batch zijn toegevoegd. 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.
Opmerking
De Microsoft SqlClient-gegevensprovider voor SQL Server en de back-enddatabaseserver bepalen welke SQL-constructies worden ondersteund voor batchuitvoering. Er kan een uitzondering worden gegenereerd als een niet-ondersteunde opdracht ter uitvoering wordt aangeboden.