Transaksi: Melakukan Transaksi dalam Recordset (ODBC)
Topik ini menjelaskan cara melakukan transaksi dalam recordset.
Catatan
Hanya satu tingkat transaksi yang didukung; Anda tidak dapat menumpuk transaksi.
Untuk melakukan transaksi dalam kumpulan rekaman
CDatabase
Panggil fungsi anggota objekBeginTrans
.Jika Anda belum menerapkan pengambilan baris massal, panggil
AddNew/Update
fungsi anggota ,Edit/Update
, danDelete
dari satu atau beberapa objek kumpulan rekaman dari database yang sama sebanyak yang diperlukan. Untuk informasi selengkapnya, lihat Recordset: Menambahkan, Memperbarui, dan Menghapus Rekaman (ODBC). Jika Anda telah menerapkan pengambilan baris massal, Anda harus menulis fungsi Anda sendiri untuk memperbarui sumber data.Terakhir, panggil
CDatabase
fungsi anggota objekCommitTrans
. Jika terjadi kesalahan di salah satu pembaruan atau Anda memutuskan untuk membatalkan perubahan, panggil fungsi anggotanyaRollback
.
Contoh berikut menggunakan dua recordset untuk menghapus pendaftaran siswa dari database pendaftaran sekolah, menghapus siswa dari semua kelas tempat siswa terdaftar. Delete
Karena panggilan di kedua recordset harus berhasil, transaksi diperlukan. Contoh mengasumsikan keberadaan m_dbStudentReg
, variabel anggota jenis CDatabase
yang sudah terhubung ke sumber data, dan kelas CEnrollmentSet
recordset dan CStudentSet
. Variabel strStudentID
berisi nilai yang diperoleh dari pengguna.
BOOL CEnrollDoc::RemoveStudent( CString strStudentID )
{
// remove student from all the classes
// the student is enrolled in
if ( !m_dbStudentReg.BeginTrans( ) )
return FALSE;
CEnrollmentSet rsEnrollmentSet(&m_dbStudentReg);
rsEnrollmentSet.m_strFilter = "StudentID = " + strStudentID;
if ( !rsEnrollmentSet.Open(CRecordset::dynaset) )
return FALSE;
CStudentSet rsStudentSet(&m_dbStudentReg);
rsStudentSet.m_strFilter = "StudentID = " + strStudentID;
if ( !rsStudentSet.Open(CRecordset::dynaset) )
return FALSE;
TRY
{
while ( !rsEnrollmentSet.IsEOF( ) )
{
rsEnrollmentSet.Delete( );
rsEnrollmentSet.MoveNext( );
}
// delete the student record
rsStudentSet.Delete( );
m_dbStudentReg.CommitTrans( );
}
CATCH_ALL(e)
{
m_dbStudentReg.Rollback( );
return FALSE;
}
END_CATCH_ALL
rsEnrollmentSet.Close( );
rsStudentSet.Close( );
return TRUE;
}
Catatan
Memanggil BeginTrans
lagi tanpa memanggil CommitTrans
atau Rollback
adalah kesalahan.
Baca juga
Transaksi (ODBC)
Transaksi: Bagaimana Transaksi Memengaruhi Pembaruan (ODBC)
Kelas CDatabase
Kelas CRecordset
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