Recordset: Selengkapnya tentang pembaruan (ODBC)
Topik ini berlaku untuk kelas MFC ODBC.
Topik ini menjelaskan:
Bagaimana operasi lain, seperti transaksi, memengaruhi pembaruan.
Selengkapnya tentang fungsi Perbarui dan Hapus anggota.
Catatan
Topik ini berlaku untuk objek yang berasal dari CRecordset
tempat pengambilan baris massal belum diimplementasikan. Jika Anda telah menerapkan pengambilan baris massal, beberapa informasi tidak berlaku. Misalnya, Anda tidak dapat memanggil AddNew
fungsi anggota , Edit
, Delete
, dan Update
; namun, Anda dapat melakukan transaksi. Untuk informasi selengkapnya tentang pengambilan baris massal, lihat Recordset: Mengambil Rekaman secara Massal (ODBC).
Bagaimana Operasi Lain Memengaruhi Pembaruan
Pembaruan Anda dipengaruhi oleh transaksi yang berlaku pada saat pembaruan, dengan menutup recordset sebelum menyelesaikan transaksi, dan dengan menggulir sebelum menyelesaikan transaksi.
Bagaimana Transaksi Memengaruhi Pembaruan
Di luar pemahaman bagaimana AddNew
, , dan Delete
bekerja, penting untuk memahami bagaimana BeginTrans
fungsi anggota , CommitTrans
, dan Rollback
CDatabase bekerja dengan fungsi pembaruan CRecordsetEdit
.
Secara default, panggilan ke AddNew
dan Edit
mempengaruhi sumber data segera saat Anda memanggil Update
. Delete
panggilan segera berlaku. Tetapi Anda dapat membuat transaksi dan menjalankan batch panggilan tersebut. Pembaruan tidak permanen sampai Anda menerapkannya. Jika Anda berubah pikiran, Anda dapat mengembalikan transaksi alih-alih menerapkannya.
Untuk informasi selengkapnya tentang transaksi, lihat Transaksi (ODBC).
Cara Menutup Recordset Memengaruhi Pembaruan
Jika Anda menutup kumpulan rekaman, atau objek terkait CDatabase
, dengan transaksi yang sedang berlangsung (Anda belum memanggil CDatabase::CommitTrans atau CDatabase::Rollback), transaksi digulung balik secara otomatis (kecuali backend database Anda adalah mesin database Microsoft Jet).
Perhatian
Jika Anda menggunakan mesin database Microsoft Jet, menutup kumpulan rekaman di dalam transaksi eksplisit tidak mengakibatkan melepaskan salah satu baris yang dimodifikasi atau kunci yang ditempatkan hingga transaksi eksplisit diterapkan atau digulung balik. Disarankan agar Anda selalu membuka dan menutup recordset di dalam atau di luar transaksi Jet eksplisit.
Bagaimana Pengguliran Memengaruhi Pembaruan
Saat Anda Recordset: Scrolling (ODBC) dalam recordset, buffer edit diisi dengan setiap rekaman baru saat ini (rekaman sebelumnya tidak disimpan terlebih dahulu). Menggulir melewati rekaman yang sebelumnya dihapus. Jika Anda menggulir setelah panggilan AddNew
atau tanpa memanggil Update
, , CommitTrans
atau Rollback
pertama, perubahan apa pun akan hilang (tanpa peringatan kepada Anda) karena rekaman baru dibawa ke buffer Edit
edit. Buffer edit diisi dengan rekaman yang digulir ke, rekaman tersimpan dibebaskan, dan tidak ada perubahan yang terjadi pada sumber data. Ini berlaku untuk AddNew
dan Edit
.
Pembaruan Anda dan Pembaruan Pengguna Lain
Saat Anda menggunakan kumpulan rekaman untuk memperbarui data, pembaruan Anda memengaruhi pengguna lain. Demikian pula, pembaruan pengguna lain selama masa pakai recordset Anda memengaruhi Anda.
Di lingkungan multipengguna, pengguna lain dapat membuka recordset yang berisi beberapa rekaman yang sama yang telah Anda pilih di recordset Anda. Perubahan pada rekaman sebelum Anda mengambilnya tercermin dalam kumpulan catatan Anda. Karena dinaset mengambil rekaman setiap kali Anda menggulirnya, dinaset mencerminkan perubahan setiap kali Anda menggulir ke rekaman. Rekam jepret mengambil rekaman saat pertama kali Anda menggulirnya, sehingga rekam jepret hanya mencerminkan perubahan yang terjadi sebelum Anda menggulir ke rekaman awalnya.
Rekaman yang ditambahkan oleh pengguna lain setelah Anda membuka kumpulan rekaman tidak muncul di kumpulan rekaman Anda kecuali Anda mengkueri ulang. Jika kumpulan rekaman Anda adalah dynaset, pengeditan ke rekaman yang ada oleh pengguna lain muncul di dinaset Anda saat Anda menggulir ke rekaman yang terpengaruh. Jika recordset Anda adalah rekam jepret, pengeditan tidak muncul hingga Anda mengkueri ulang rekam jepret. Jika Anda ingin melihat rekaman ditambahkan atau dihapus oleh pengguna lain di rekam jepret Anda, atau rekaman yang ditambahkan oleh pengguna lain di dynaset Anda, panggil CRecordset::Requery untuk membangun kembali kumpulan rekaman. (Perhatikan bahwa penghapusan pengguna lain muncul di dinaset Anda.) Anda mungkin juga memanggil Requery
untuk melihat rekaman yang Anda tambahkan, tetapi tidak untuk melihat penghapusan Anda.
Tip
Untuk memaksa penembolokan seluruh rekam jepret sekaligus, hubungi MoveLast
segera setelah Anda membuka rekam jepret. Kemudian panggil MoveFirst
untuk mulai bekerja dengan rekaman. MoveLast
setara dengan menggulir semua rekaman, tetapi mengambil semuanya sekaligus. Namun, perhatikan bahwa ini dapat menurunkan performa dan mungkin tidak diperlukan untuk beberapa driver.
Efek pembaruan Anda pada pengguna lain mirip dengan efeknya pada Anda.
Selengkapnya tentang Pembaruan dan Penghapusan
Bagian ini menyediakan informasi tambahan untuk membantu Anda bekerja dengan Update
dan Delete
.
Perbarui Keberhasilan dan Kegagalan
Jika Update
berhasil, AddNew
mode atau Edit
berakhir. Untuk memulai AddNew
mode atau Edit
lagi, panggil AddNew
atau Edit
.
Jika Update
gagal (mengembalikan FALSE atau melempar pengecualian), Anda tetap dalam AddNew
mode atau Edit
, tergantung pada fungsi mana yang Anda panggil terakhir. Anda kemudian dapat melakukan salah satu hal berikut:
Ubah anggota data bidang dan coba
Update
lagi.Panggil
AddNew
untuk mengatur ulang anggota data bidang ke Null, atur nilai anggota data bidang, lalu panggilUpdate
lagi.Panggil
Edit
untuk memuat ulang nilai yang ada di kumpulan rekaman sebelum panggilan pertama keAddNew
atauEdit
, atur nilai anggota data bidang, lalu panggilUpdate
lagi. Setelah panggilan berhasilUpdate
(kecuali setelahAddNew
panggilan), anggota data bidang mempertahankan nilai baru mereka.Panggilan
Move
(termasukMove
dengan parameter AFX_MOVE_REFRESH, atau 0), yang menghapus perubahan apa pun dan mengakhiri apa punAddNew
atauEdit
mode yang berlaku.
Perbarui dan Hapus
Bagian ini berlaku untuk Update
dan Delete
.
Pada operasi Update
atau Delete
, satu dan hanya satu catatan yang harus diperbarui. Rekaman tersebut adalah rekaman saat ini, yang sesuai dengan nilai data di bidang himpunan rekaman. Jika karena alasan tertentu tidak ada rekaman yang terpengaruh atau lebih dari satu rekaman terpengaruh, pengecualian dilemparkan berisi salah satu nilai RETCODE berikut:
AFX_SQL_ERROR_NO_ROWS_AFFECTED
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED
Ketika pengecualian ini dilemparkan, Anda tetap dalam AddNew
status atau Edit
Anda berada di ketika Anda menelepon Update
atau Delete
. Berikut adalah skenario paling umum di mana Anda akan melihat pengecualian ini. Kemungkinan besar Anda akan melihat:
AFX_SQL_ERROR_NO_ROWS_AFFECTED saat Anda menggunakan mode penguncian optimis dan pengguna lain telah memodifikasi rekaman dengan cara yang mencegah kerangka kerja mengidentifikasi rekaman yang benar untuk diperbarui atau dihapus.
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED saat tabel yang Anda perbarui tidak memiliki kunci primer atau indeks unik dan Anda tidak memiliki cukup kolom dalam kumpulan rekaman untuk mengidentifikasi baris tabel secara unik.
Lihat juga
Recordset (ODBC)
Recordset: Cara Recordset Memilih Rekaman (ODBC)
Pertukaran Bidang Rekaman (RFX)
SQL
Pengecualian: Pengecualian Database