Utföra batchåtgärder med hjälp av DataAdapters
Batch-stöd i ADO.NET tillåter att åtgärderna DataAdapter INSERT, UPDATE och DELETE grupperas 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. Batchuppdateringar stöds för .NET-dataprovidrar för SQL Server (System.Data.SqlClient) och Oracle (System.Data.OracleClient).
När du uppdaterar en databas med ändringar från en DataSet i tidigare versioner av ADO.NET uppdateras Update
metoden för en DataAdapter
utförd uppdatering 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 kallas den lämplig UpdateCommand
, , eller DeleteCommand
, beroende på värdet för egenskapen för den RowState InsertCommand
raden. Varje raduppdatering innebar en tur-och-retur-nätverksresa till databasen.
Från och med ADO.NET 2.0 DbDataAdapter exponeras en UpdateBatchSize egenskap. UpdateBatchSize
Om du anger ett positivt heltalsvärde skickas uppdateringar till databasen som batchar med den angivna storleken. Om du till exempel anger UpdateBatchSize
till 10 grupperas 10 separata instruktioner och skicka dem som en enda batch. UpdateBatchSize
Om du anger till 0 används DataAdapter den största batchstorleken som servern kan hantera. Om du ställer in den på 1 inaktiveras batchuppdateringar, eftersom rader skickas en i taget.
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 UpdateCommand
InsertCommand
för DataAdapter , och DeleteCommand
anges till None eller OutputParameters. När du utför en batchuppdatering är kommandots egenskapsvärde UpdatedRowSource FirstReturnedRecord för eller Both 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 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);
}
}
Hantera Batch Update-relaterade händelser och fel
DataAdapter har två uppdateringsrelaterade händelser: RowUpdating och RowUpdated. När batchbearbetning har inaktiverats i tidigare versioner av ADO.NET genereras var och en av dessa händelser en gång för varje bearbetad rad. RowUpdating genereras innan uppdateringen sker och RowUpdated genereras efter att databasuppdateringen har slutförts.
Händelsebeteende ändras med Batch-uppdateringar
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.
Åtkomst till uppdaterade rader
När batchbearbetning har inaktiverats kan den rad som uppdateras nås med hjälp Row av egenskapen för RowUpdatedEventArgs klassen.
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. Instruktioner körs i den ordning som -uttrycken har lagts 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 i databasen uppdateras i motsvarande DataRow i DataTable.
Dataprovidern och serverdelsdatabasservern avgör vilka SQL-konstruktioner som stöds för batchkörning. Ett undantag kan utlösas om en instruktion som inte stöds skickas för körning.