Bagikan melalui


Recordset: Selengkapnya tentang pembaruan (ODBC)

Topik ini berlaku untuk kelas MFC ODBC.

Topik ini menjelaskan:

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 AddNewfungsi 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 BeginTransfungsi 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, , CommitTransatau 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 panggil Update lagi.

  • Panggil Edit untuk memuat ulang nilai yang ada di kumpulan rekaman sebelum panggilan pertama ke AddNew atau Edit, atur nilai anggota data bidang, lalu panggil Update lagi. Setelah panggilan berhasil Update (kecuali setelah AddNew panggilan), anggota data bidang mempertahankan nilai baru mereka.

  • Panggilan Move (termasuk Move dengan parameter AFX_MOVE_REFRESH, atau 0), yang menghapus perubahan apa pun dan mengakhiri apa pun AddNew atau Edit 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.

Baca juga

Recordset (ODBC)
Recordset: Cara Recordset Memilih Rekaman (ODBC)
Pertukaran Bidang Rekaman (RFX)
SQL
Pengecualian: Pengecualian Database