Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för: .NET Framework
.NET .NET
Standard
Batch-stöd i ADO.NET tillåter en DataAdapter att gruppera INSERT, UPDATEoch DELETE åtgärder från en DataSet eller DataTable till servern, i stället för att skicka en åtgärd i taget. Minskningen av antalet tur- och returresor till servern resulterar vanligtvis i betydande prestandavinster. Batchuppdatering stöds för Microsoft SqlClient-dataprovidern för SQL Server (Microsoft.Data.SqlClient).
Vid uppdatering av en databas med ändringar från en DataSet i tidigare versioner av ADO.NET utförde metoden Update i en DataAdapter uppdateringar av databasen en rad i taget. När den itererade genom raderna i den angivna DataTableundersökte den var och en DataRow för att se om den hade ändrats. Om raden hade ändrats anropade den lämplig UpdateCommand, InsertCommand eller DeleteCommand, beroende på värdet på egenskapen RowState för den raden. Varje raduppdatering innebar en tur-och-retur-nätverksresa till databasen.
Inom Microsoft SqlClient Data Provider för SQL Server exponeras egenskapen SqlDataAdapter av UpdateBatchSize.
UpdateBatchSize Om du anger ett positivt heltalsvärde skickas uppdateringar till databasen som batchar med den angivna storleken. Till exempel grupperas 10 separata satser och skickas som en enda batch om du ställer in UpdateBatchSize på 10. Om du ställer in UpdateBatchSize till 0 kommer SqlDataAdapter att använda den största batchstorlek som servern kan hantera. Om du ställer in den på 1 inaktiveras batchuppdateringar, eftersom rader skickas en i taget.
Anmärkning
Att köra en extremt stor batch kan minska prestandan. Därför bör du testa för den optimala batchstorleksinställningen innan du implementerar ditt program.
Använda egenskapen UpdateBatchSize
När batchuppdateringar är aktiverade UpdatedRowSource ska egenskapsvärdet UpdateCommandInsertCommandför DataAdapter , och DeleteCommand anges till None eller OutputParameters. När du utför en batchuppdatering är värdet FirstReturnedRecord eller Both för kommandots egenskap UpdatedRowSource ogiltigt.
Följande procedur visar hur egenskapen används UpdateBatchSize . Proceduren tar två argument, ett DataSet objekt som har kolumner som representerar fälten ProductCategoryID och Name i tabellen Production.ProductCategory och ett heltal som representerar batchstorleken (antalet rader i batchen). Koden skapar ett nytt SqlDataAdapter objekt och anger dess UpdateCommandegenskaper , InsertCommandoch DeleteCommand . Koden förutsätter att objektet DataSet har ändrat rader. Den anger UpdateBatchSize egenskapen och kör uppdateringen.
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);
}
}
Hantera batchuppdateringsrelaterade händelser och fel
DataAdapter har två uppdateringsrelaterade händelser: RowUpdating och RowUpdated. Mer information finns i Hantera DataAdapter-händelser.
Händelsebeteende ändras med batchuppdateringar
När batchbearbetning är aktiverat uppdateras flera rader i en enda databasåtgärd. Därför inträffar endast en RowUpdated händelse för varje batch, medan händelsen RowUpdating inträffar för varje bearbetad rad. När batchbearbetningen är inaktiverad utlöses de två händelserna med en-till-en-interfoliering, där en RowUpdating händelse och en RowUpdated händelse utlöses för en rad, och sedan utlöses en RowUpdating och en RowUpdated händelse för nästa rad tills alla rader bearbetas.
Få åtkomst till uppdaterade rader
När batchbearbetning har inaktiverats kan raden som uppdateras nås via egenskapen Row i klassen RowUpdatedEventArgs.
När batchbearbetning är aktiverat genereras en enskild RowUpdated händelse för flera rader. Därför är värdet för Row egenskapen för varje rad null.
RowUpdating händelser genereras fortfarande för varje rad. Med CopyToRows metoden för RowUpdatedEventArgs klassen kan du komma åt de bearbetade raderna genom att kopiera referenser till raderna till en matris. Om inga rader bearbetas CopyToRows genererar en ArgumentNullException. Använd egenskapen RowCount för att returnera antalet rader som bearbetas innan metoden anropas CopyToRows .
Hantera datafel
Batchkörning har samma effekt som körningen av varje enskild instruktion. Satser körs i den ordning som satserna lades till i batchen. Fel hanteras på samma sätt i batchläge som när batchläget inaktiveras. Varje rad bearbetas separat. Endast rader som har bearbetats korrekt i databasen kommer att uppdateras i den motsvarande DataRow inom DataTable.
Anmärkning
Microsoft SqlClient-dataprovidern för SQL Server och serverdelsdatabasservern avgör vilka SQL-konstruktioner som stöds för batchkörning. Ett undantag kan genereras om en sats som inte stöds skickas för exekvering.