Bagikan melalui


Melakukan Operasi Batch Menggunakan DataAdapters

Dukungan batch di ADO.NET memungkinkan DataAdapter untuk mengelompokkan operasi INSERT, UPDATE, dan DELETE dari DataSet atau DataTable ke server, alih-alih mengirim satu operasi pada satu waktu. Pengurangan jumlah perjalanan pulang pergi ke server biasanya menghasilkan peningkatan performa yang signifikan. Pembaruan batch didukung untuk penyedia data .NET untuk SQL Server (System.Data.SqlClient) dan Oracle (System.Data.OracleClient).

Saat memperbarui database dengan perubahan dari DataSet versi ADO.NET sebelumnya, Update metode pembaruan yang DataAdapter dilakukan ke database satu baris pada satu waktu. Saat diulang melalui baris dalam yang ditentukan, ia memeriksa masing-masing DataTable untuk melihat apakah baris tersebut telah dimodifikasiDataRow. Jika baris telah dimodifikasi, baris tersebut disebut UpdateCommand, InsertCommand, atau DeleteCommand yang sesuai, bergantung pada nilai properti RowState untuk baris tersebut. Setiap pembaruan baris melibatkan komunikasi dua arah jaringan ke database.

Dimulai dengan ADO.NET 2.0, DbDataAdapter mengekspos properti UpdateBatchSize. Mengatur ke UpdateBatchSize nilai bilangan bulat positif menyebabkan pembaruan pada database dikirim sebagai batch dari ukuran yang ditentukan. Misalnya, mengatur UpdateBatchSize ke 10 akan mengelompokkan 10 pernyataan terpisah dan mengirimkannya sebagai kumpulan tunggal. Mengatur UpdateBatchSize ke 0 akan menyebabkan DataAdapter menggunakan ukuran kumpulan terbesar yang dapat ditangani server. Mengaturnya ke 1 menonaktifkan pembaruan batch, karena baris dikirim satu per satu.

Mengeksekusi batch yang sangat besar dapat mengurangi performa. Oleh karena itu, Anda harus menguji pengaturan ukuran batch optimal sebelum menerapkan aplikasi Anda.

Menggunakan Properti UpdateBatchSize

Saat pembaruan batch diaktifkan, nilai properti UpdatedRowSource dari UpdateCommand, InsertCommand, dan DeleteCommand DataAdapter harus disetel ke None atau OutputParameters. Saat melakukan pembaruan batch, nilai properti UpdatedRowSource perintah dari FirstReturnedRecord atau Both tidak valid.

Prosedur berikut menunjukkan penggunaan properti UpdateBatchSize. Prosedur ini mengambil dua argumen, DataSet objek yang memiliki kolom yang mewakili bidang ProductCategoryID dan Name dalam tabel Production.ProductCategory, dan bilangan bulat yang mewakili ukuran batch (jumlah baris dalam batch). Kode membuat objek SqlDataAdapter baru, menyetel properti UpdateCommand, InsertCommand, dan DeleteCommand-nya. Kode mengasumsikan bahwa objek DataSet telah memodifikasi baris. Ini menetapkan properti UpdateBatchSize dan menjalankan pembaruan.

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 memiliki dua peristiwa terkait pembaruan: RowUpdating dan RowUpdated. Dalam versi ADO.NET sebelumnya, ketika pemrosesan batch dinonaktifkan, masing-masing peristiwa ini dihasilkan sekali untuk setiap baris yang diproses. RowUpdating dihasilkan sebelum pembaruan terjadi, dan RowUpdated dihasilkan setelah pembaruan database selesai.

Perubahan Perilaku Peristiwa dengan Pembaruan Batch

Saat pemrosesan batch diaktifkan, beberapa baris diperbarui dalam satu operasi database. Oleh karena itu, hanya satu peristiwa RowUpdated yang terjadi untuk setiap kumpulan, sedangkan peristiwa RowUpdating terjadi untuk setiap baris yang diproses. Saat pemrosesan batch dinonaktifkan, dua peristiwa dipicu dengan interleaving satu-ke-satu, di mana satu peristiwa RowUpdating dan satu peristiwa RowUpdated diaktifkan untuk satu baris, lalu satu peristiwa RowUpdating dan satu RowUpdated diaktifkan untuk baris berikutnya, sampai semua baris diproses.

Mengakses Baris yang Diperbarui

Saat pemrosesan batch dinonaktifkan, baris yang diperbarui dapat diakses menggunakan properti Row dari kelas RowUpdatedEventArgs.

Saat pemrosesan batch diaktifkan, satu peristiwa RowUpdated dibuat untuk beberapa baris. Oleh karena itu, nilai properti Row untuk setiap baris adalah nol. RowUpdating peristiwa masih dibuat untuk setiap baris. Metode CopyToRows dari kelas RowUpdatedEventArgs memungkinkan Anda mengakses baris yang diproses dengan menyalin referensi ke baris ke dalam larik. Jika tidak ada baris yang diproses, CopyToRows melempar ArgumentNullException. Gunakan properti RowCount untuk mengembalikan jumlah baris yang diproses sebelum memanggil metode CopyToRows.

Menangani Kesalahan Data

Eksekusi batch memiliki efek yang sama dengan eksekusi setiap pernyataan individu. Pernyataan dijalankan dalam urutan pernyataan ditambahkan ke batch. Kesalahan ditangani dengan cara yang sama dalam mode batch seperti saat mode batch dinonaktifkan. Setiap baris diproses secara terpisah. Hanya baris yang telah berhasil diproses dalam basis data yang akan diperbarui di DataRow yang sesuai dalam DataTable.

Penyedia data dan server database back-end menentukan konstruksi SQL mana yang didukung untuk eksekusi batch. Pengecualian dapat dilemparkan jika pernyataan yang tidak didukung dikirimkan untuk eksekusi.

Lihat juga