TN068: Melakukan Transaksi dengan Driver ODBC Microsoft Access 7
Catatan
Catatan teknis berikut belum diperbarui sejak pertama kali disertakan dalam dokumentasi online. Akibatnya, beberapa prosedur dan topik mungkin kedaluarsa atau salah. Untuk informasi terbaru, disarankan agar Anda mencari topik yang menarik dalam indeks dokumentasi online.
Catatan ini menjelaskan cara melakukan transaksi saat menggunakan kelas database MFC ODBC dan driver ODBC Microsoft Access 7.0 yang disertakan dalam Paket Driver Desktop Microsoft ODBC versi 3.0.
Gambaran Umum
Jika aplikasi database Anda melakukan transaksi, Anda harus berhati-hati untuk memanggil CDatabase::BeginTrans
dan CRecordset::Open
dalam urutan yang benar dalam aplikasi Anda. Driver Microsoft Access 7.0 menggunakan mesin database Microsoft Jet, dan Jet mengharuskan aplikasi Anda tidak memulai transaksi pada database apa pun yang memiliki kursor terbuka. Untuk kelas database ODBC MFC, kursor terbuka sama dengan objek terbuka CRecordset
.
Jika Anda membuka kumpulan rekaman sebelum memanggil BeginTrans
, Anda mungkin tidak melihat pesan kesalahan apa pun. Namun, setiap pembaruan recordset yang dibuat aplikasi Anda menjadi permanen setelah memanggil CRecordset::Update
, dan pembaruan tidak akan digulung balik dengan memanggil Rollback
. Untuk menghindari masalah ini, Anda harus memanggil BeginTrans
terlebih dahulu lalu membuka recordset.
MFC memeriksa fungsionalitas driver untuk penerapan kursor dan perilaku putar kembali. Kelas CDatabase
menyediakan dua fungsi anggota, GetCursorCommitBehavior
dan GetCursorRollbackBehavior
, untuk menentukan efek transaksi apa pun pada objek terbuka CRecordset
Anda. Untuk driver ODBC Microsoft Access 7.0, fungsi anggota ini kembali SQL_CB_CLOSE
karena driver Access tidak mendukung pelestarian kursor. Oleh karena itu, Anda harus memanggil CRecordset::Requery
mengikuti CommitTrans
operasi atau Rollback
.
Ketika Anda perlu melakukan beberapa transaksi satu demi satu, Anda tidak dapat memanggil Requery
setelah transaksi pertama lalu memulai transaksi berikutnya. Anda harus menutup kumpulan rekaman sebelum panggilan BeginTrans
berikutnya untuk memenuhi persyaratan Jet. Catatan teknis ini menjelaskan dua metode penanganan situasi ini:
Menutup kumpulan rekaman setelah setiap
CommitTrans
atauRollback
operasi.Menggunakan fungsi
SQLFreeStmt
ODBC API .
Menutup Recordset setelah setiap Operasi CommitTrans atau Rollback
Sebelum memulai transaksi, pastikan objek recordset ditutup. Setelah memanggil BeginTrans
, panggil fungsi anggota recordset Open
. Tutup kumpulan rekaman segera setelah memanggil CommitTrans
atau Rollback
. Perhatikan bahwa membuka dan menutup kumpulan rekaman berulang kali dapat memperlambat performa aplikasi.
Menggunakan SQLFreeStmt
Anda juga dapat menggunakan fungsi SQLFreeStmt
ODBC API untuk secara eksplisit menutup kursor setelah mengakhiri transaksi. Untuk memulai transaksi lain, panggil BeginTrans
diikuti oleh CRecordset::Requery
. Saat memanggil SQLFreeStmt
, Anda harus menentukan HSTMT kumpulan rekaman sebagai parameter pertama dan SQL_CLOSE sebagai parameter kedua. Metode ini lebih cepat daripada menutup dan membuka recordset di awal setiap transaksi. Kode berikut menunjukkan cara menerapkan teknik ini:
CMyDatabase db;
db.Open("MYDATASOURCE");
CMyRecordset rs(&db);
// start transaction 1 and
// open the recordset
db.BeginTrans();
rs.Open();
// manipulate data
// end transaction 1
db.CommitTrans(); // or Rollback()
// close the cursor
::SQLFreeStmt(rs.m_hstmt, SQL_CLOSE);
// start transaction 2
db.BeginTrans();
// now get the result set
rs.Requery();
// manipulate data
// end transaction 2
db.CommitTrans();
rs.Close();
db.Close();
Cara lain untuk menerapkan teknik ini adalah dengan menulis fungsi baru, RequeryWithBeginTrans
, yang dapat Anda panggil untuk memulai transaksi berikutnya setelah Anda menerapkan atau memutar kembali yang pertama. Untuk menulis fungsi seperti itu, lakukan langkah-langkah berikut:
Salin kode untuk
CRecordset::Requery( )
ke fungsi baru.Tambahkan baris berikut segera setelah panggilan ke
SQLFreeStmt
:m_pDatabase->BeginTrans( );
Sekarang Anda dapat memanggil fungsi ini antara setiap pasangan transaksi:
// start transaction 1 and
// open the recordset
db.BeginTrans();
rs.Open();
// manipulate data
// end transaction 1
db.CommitTrans(); // or Rollback()
// close the cursor, start new transaction,
// and get the result set
rs.RequeryWithBeginTrans();
// manipulate data
// end transaction 2
db.CommitTrans(); // or Rollback()
Catatan
Jangan gunakan teknik ini jika Anda perlu mengubah variabel anggota recordset m_strFilter atau m_strSort antar transaksi. Dalam hal ini, Anda harus menutup kumpulan rekaman setelah setiap CommitTrans
atau Rollback
operasi.
Baca juga
Catatan Teknis menurut Angka
Catatan Teknis menurut Kategori
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk