Dela via


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 RowStateInsertCommandraden. 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 UpdateCommandInsertCommandför DataAdapter , och DeleteCommand anges till None eller OutputParameters. När du utför en batchuppdatering är kommandots egenskapsvärde UpdatedRowSourceFirstReturnedRecord 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);  
    }  
}  

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.

Se även