Dela via


Batchåtgärder med DataAdapters

Gäller för: .NET Framework .NET .NET Standard

Ladda ned ADO.NET

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. Batchuppdatering stöds för Microsoft SqlClient-dataprovidern för SQL Server (Microsoft.Data.SqlClient).

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 InsertCommand, beroende på värdet för egenskapen för den DeleteCommandRowStateraden. 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. 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 SqlDataAdapter den största batchstorleken 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 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 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. 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 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.

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 utlösas om en instruktion som inte stöds skickas för körning.

Se även