Operasi batch menggunakan DataAdapters
Berlaku untuk: .NET Framework .NET .NET Standard
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 Microsoft SqlClient untuk SQL Server (Microsoft.Data.SqlClient).
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.
Di Penyedia Data Microsoft SqlClient untuk SQL Server, SqlDataAdapter mengekspos UpdateBatchSize properti. 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 SqlDataAdapter menggunakan ukuran kumpulan terbesar yang dapat ditangani server. Mengaturnya ke 1 menonaktifkan pembaruan batch, karena baris dikirim satu per satu.
Catatan
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 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. Untuk informasi selengkapnya, lihat Menangani peristiwa DataAdapter.
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.
Catatan
Penyedia Data Microsoft SqlClient untuk SQL Server 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.