Bagikan melalui


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 atau Rollback operasi.

  • Menggunakan fungsi SQLFreeStmtODBC 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:

  1. Salin kode untuk CRecordset::Requery( ) ke fungsi baru.

  2. 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