Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 pada versi ADO.NET sebelumnya, metode Update dari DataAdapter melakukan pembaruan ke database satu baris pada satu waktu. Saat diulang melalui baris dalam DataTable yang ditentukan, ia memeriksa masing-masing DataRow untuk melihat apakah telah dimodifikasi. 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 perjalanan bolak-balik jaringan ke database.
Dimulai dengan ADO.NET 2.0, DbDataAdapter mengekspos properti UpdateBatchSize. Mengatur UpdateBatchSize ke nilai bilangan bulat positif menyebabkan pembaruan pada database dikirim dalam bentuk batch dengan 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 perintah UpdatedRowSource dari FirstReturnedRecord atau Both tidak valid.
Prosedur berikut menunjukkan penggunaan properti UpdateBatchSize. Prosedur ini mengambil dua argumen, DataSet objek yang memiliki kolom yang mewakili ProductCategoryID bidang 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);
}
}
Menangani Peristiwa dan Kesalahan Terkait Pembaruan Batch
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 Event 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 secara bergantian satu-satu, di mana satu peristiwa RowUpdating dan satu peristiwa RowUpdated dipicu untuk satu baris, lalu satu peristiwa RowUpdating dan satu RowUpdated dipicu 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 event 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 yang sama saat pernyataan tersebut 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.