Udostępnij za pośrednictwem


Wykonywanie operacji wsadowych przy użyciu elementów DataAdapters

Obsługa usługi Batch w ADO.NET umożliwia DataAdapter grupowanie operacji INSERT, UPDATE i DELETE z serwera DataSet lub DataTable , zamiast wysyłać jedną operację naraz. Zmniejszenie liczby rund na serwerze zwykle powoduje znaczne wzrosty wydajności. Aktualizacje usługi Batch są obsługiwane dla dostawców danych platformy .NET dla programów SQL Server (System.Data.SqlClient) i Oracle (System.Data.OracleClient).

Podczas aktualizowania bazy danych ze zmianami z DataSet poprzednich wersji ADO.NET Update metoda wykonanych DataAdapter aktualizacji bazy danych po jednym wierszu naraz. W miarę iterowania wierszy w określonym DataTableobiekcie zbadał każdy DataRow z nich, aby sprawdzić, czy został zmodyfikowany. Jeśli wiersz został zmodyfikowany, nazwał odpowiedni UpdateCommandInsertCommand, lub DeleteCommand, w zależności od wartości RowState właściwości dla tego wiersza. Każda aktualizacja wiersza obejmowała połączenie sieciowe z bazą danych.

Począwszy od ADO.NET 2.0, DbDataAdapter właściwość uwidacznia UpdateBatchSize . UpdateBatchSize Ustawienie wartości dodatniej liczby całkowitej powoduje wysłanie aktualizacji bazy danych jako partii o określonym rozmiarze. Na przykład ustawienie wartości UpdateBatchSize na 10 spowoduje zgrupowanie 10 oddzielnych instrukcji i przesłanie ich jako pojedynczą partię. UpdateBatchSize Ustawienie wartości 0 spowoduje DataAdapter użycie największego rozmiaru partii, który może obsłużyć serwer. Ustawienie wartości 1 powoduje wyłączenie aktualizacji wsadowych, ponieważ wiersze są wysyłane pojedynczo.

Wykonanie bardzo dużej partii może zmniejszyć wydajność. W związku z tym należy przetestować optymalne ustawienie rozmiaru partii przed wdrożeniem aplikacji.

Używanie właściwości UpdateBatchSize

Po włączeniu UpdatedRowSource aktualizacji wsadowych wartość właściwości elementu DataAdapter UpdateCommandInsertCommand, i DeleteCommand powinna być ustawiona na None lub OutputParameters. Podczas przeprowadzania aktualizacji wsadowej wartość FirstReturnedRecord właściwości polecenia UpdatedRowSource lub Both jest nieprawidłowa.

Poniższa procedura przedstawia użycie UpdateBatchSize właściwości . Procedura przyjmuje dwa argumenty, DataSet obiekt, który zawiera kolumny reprezentujące pola ProductCategoryID i Name w tabeli Production.ProductCategory oraz liczbę całkowitą reprezentującą rozmiar partii (liczbę wierszy w partii). Kod tworzy nowy SqlDataAdapter obiekt, ustawiając jego UpdateCommandwłaściwości , InsertCommandi DeleteCommand . W kodzie przyjęto założenie, że DataSet obiekt zmodyfikował wiersze. Ustawia UpdateBatchSize właściwość i wykonuje aktualizację.

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);
    }
}

Element DataAdapter ma dwa zdarzenia związane z aktualizacją: RowUpdating i RowUpdated. W poprzednich wersjach ADO.NET, gdy przetwarzanie wsadowe jest wyłączone, każde z tych zdarzeń jest generowane raz dla każdego przetworzonego wiersza. Funkcja RowUpdating jest generowana przed rozpoczęciem aktualizacji, a element RowUpdated jest generowany po zakończeniu aktualizacji bazy danych.

Zmiany zachowania zdarzeń za pomocą aktualizacji usługi Batch

Po włączeniu przetwarzania wsadowego wiele wierszy jest aktualizowanych w ramach jednej operacji bazy danych. W związku z tym tylko jedno RowUpdated zdarzenie występuje dla każdej partii, podczas gdy RowUpdating zdarzenie występuje dla każdego przetworzonego wiersza. Gdy przetwarzanie wsadowe jest wyłączone, dwa zdarzenia są wyzwalane za pomocą przeplatania jeden do jednego, gdzie jedno RowUpdating zdarzenie i jedno RowUpdated zdarzenie jest uruchamiane dla wiersza, a następnie jedno RowUpdated RowUpdating zdarzenie jest uruchamiane dla następnego wiersza, aż wszystkie wiersze zostaną przetworzone.

Uzyskiwanie dostępu do zaktualizowanych wierszy

Po wyłączeniu przetwarzania wsadowego można uzyskać dostęp do aktualizowanego RowUpdatedEventArgs wiersza przy użyciu Row właściwości klasy .

Po włączeniu przetwarzania wsadowego pojedyncze RowUpdated zdarzenie jest generowane dla wielu wierszy. W związku z tym wartość Row właściwości dla każdego wiersza ma wartość null. RowUpdating zdarzenia są nadal generowane dla każdego wiersza. CopyToRows Metoda RowUpdatedEventArgs klasy umożliwia dostęp do przetworzonych wierszy przez skopiowanie odwołań do wierszy do tablicy. Jeśli nie są przetwarzane żadne wiersze, CopyToRows zgłasza błąd ArgumentNullException. Użyj właściwości , RowCount aby zwrócić liczbę przetworzonych wierszy przed wywołaniem CopyToRows metody .

Obsługa błędów danych

Wykonywanie wsadowe ma taki sam efekt jak wykonanie każdej instrukcji. Instrukcje są wykonywane w kolejności dodawania instrukcji do partii. Błędy są obsługiwane w taki sam sposób w trybie wsadowym, jak w przypadku wyłączenia trybu wsadowego. Każdy wiersz jest przetwarzany oddzielnie. Tylko wiersze, które zostały pomyślnie przetworzone w bazie danych, zostaną zaktualizowane w odpowiednich DataRow elementach w obiekcie DataTable.

Dostawca danych i serwer bazy danych zaplecza określają, które konstrukcje SQL są obsługiwane na potrzeby wykonywania wsadowego. Wyjątek może zostać zgłoszony, jeśli do wykonania zostanie przesłana instrukcja nieobsługiwana.

Zobacz też