Bagikan melalui


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

  1. CDatabase Panggil fungsi anggota objekBeginTrans.

  2. Jika Anda belum menerapkan pengambilan baris massal, panggil AddNew/Updatefungsi anggota , Edit/Update, dan Delete 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.

  3. Terakhir, panggil CDatabase fungsi anggota objek CommitTrans . Jika terjadi kesalahan di salah satu pembaruan atau Anda memutuskan untuk membatalkan perubahan, panggil fungsi anggotanya Rollback .

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