Ini karena DataAdapter
menggunakan Optimistic Concurrency
secara default. Artinya, jika Anda mencoba memperbarui baris yang tidak lagi ada di database atau diubah, pembaruan dari DataAdapter
akan gagal dengan pengecualian di atas.
Kemungkinan skenario :
- Antara Anda memilih data ke klien dan mengirim pembaruan, pengguna lain menghapus atau memperbarui baris ini dari aplikasinya.
- Bisa jadi Anda menghapus data dari tempat lain di aplikasi Anda.
Misalnya :
- Anda mengisi
DataTable
yang akan digunakan untuk pembaruan. - Menghapus baris dengan
Code = 1101
(misalnya) langsung dari database, yaitu Anda tidak menggunakanDataTable
di sini. Ini meniru pengguna lain yang menghapus baris denganCode = 1101
dari aplikasi lain. Atau bagian lain dalam kode Anda menghapus baris denganCode = 1101
. - Memilih baris dengan
Code = 1101
dariDataTable
, ini hanya untuk menunjukkan bahwa itu masih ada meskipun Anda telah menghapusnya dari database itu sendiri. - Mengedit
Quantity
kolom di baris denganCode = 1101
diDataTable
. Ini harus dilakukan, jika tidak, panggilan ke Pembaruan akan mengabaikan baris ini saat memperbarui. - Mengeksekusi pembaruan, ini akan memunculkan pengecualian karena Anda mencoba memperbarui baris yang (tidak lagi) ada di database.
Jika Anda ingin menerapkan Last Writer Wins
, Tambahkan kode berikut:
cb.ConflictOption = ConflictOption.OverwriteChanges;
Juga ada satu hal lagi yang mungkin:jika Anda memiliki Decimal
/numeric
sebagai kolom di DB mereka dapat menyebabkan kesalahan ini meskipun datanya terlihat sama. Ini karena kesalahan pembulatan desimal.
Catatan penting :Anda harus selalu menggunakan parameterized queries
omong-omong. Rangkaian string semacam ini terbuka untuk SQL Injection
.