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.
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 setiap kali. 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 pada versi ADO.NET sebelumnya, metode Update dari DataAdapter melakukan pembaruan ke database satu per satu baris. Saat melakukan iterasi melalui baris-baris dalam DataTable yang ditentukan, sistem memeriksa setiap DataRow untuk melihat apakah item tersebut 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 data melibatkan perjalanan bolak-balik melalui jaringan ke basis data.
Pada Microsoft SqlClient Data Provider for SQL Server, SqlDataAdapter memiliki properti UpdateBatchSize. Menetapkan UpdateBatchSize ke nilai bilangan bulat positif menyebabkan pembaruan ke basis data dikirim dalam 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 SqlDataAdapter menggunakan ukuran kumpulan terbesar yang dapat ditangani server. Menyetelnya ke 1 akan 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 dari perintah adalah FirstReturnedRecord atau Both, yang 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 kejadian DataAdapter.
Perilaku event berubah 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, kedua kejadian dipicu secara berselang-seling satu banding satu, yaitu satu kejadian RowUpdating dan satu kejadian RowUpdated dipicu untuk satu baris, lalu satu kejadian RowUpdating dan satu kejadian RowUpdated dipicu untuk baris berikutnya, hingga semua baris diproses.
Akses 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 dihasilkan 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 sesuai dengan urutan penambahannya 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 pada DataRow yang sesuai di 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.