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
DataTableyang akan digunakan untuk pembaruan. - Menghapus baris dengan
Code = 1101(misalnya) langsung dari database, yaitu Anda tidak menggunakanDataTabledi sini. Ini meniru pengguna lain yang menghapus baris denganCode = 1101dari aplikasi lain. Atau bagian lain dalam kode Anda menghapus baris denganCode = 1101. - Memilih baris dengan
Code = 1101dariDataTable, ini hanya untuk menunjukkan bahwa itu masih ada meskipun Anda telah menghapusnya dari database itu sendiri. - Mengedit
Quantitykolom di baris denganCode = 1101diDataTable. 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 .