Transazione: esecuzione di una transazione in un recordset (ODBC)

In questo argomento viene illustrato come eseguire una transazione in un recordset.

Nota

È supportato un solo livello di transazioni; non è possibile annidare le transazioni.

Per eseguire una transazione in un recordset

  1. Chiamare la CDatabase funzione membro dell'oggetto BeginTrans .

  2. Se non è stato implementato il recupero delle righe bulk, chiamare le AddNew/Updatefunzioni membro , Edit/Updatee Delete di uno o più oggetti recordset dello stesso database quante più volte necessario. Per altre informazioni, vedere Recordset: Aggiunta, aggiornamento ed eliminazione di record (ODBC). Se è stato implementato il recupero delle righe bulk, è necessario scrivere funzioni personalizzate per aggiornare l'origine dati.

  3. Infine, chiamare la CDatabase funzione membro dell'oggetto CommitTrans . Se si verifica un errore in uno degli aggiornamenti o si decide di annullare le modifiche, chiamare la relativa Rollback funzione membro.

Nell'esempio seguente vengono usati due recordset per eliminare la registrazione di uno studente da un database di registrazione dell'istituto di istruzione, rimuovendo lo studente da tutte le classi in cui viene registrato lo studente. Poiché le Delete chiamate in entrambi i recordset devono avere esito positivo, è necessaria una transazione. Nell'esempio si presuppone l'esistenza di m_dbStudentReg, una variabile membro di tipo CDatabase già connessa all'origine dati e le classi CEnrollmentSet recordset e CStudentSet. La strStudentID variabile contiene un valore ottenuto dall'utente.

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;

}

Nota

Chiamare BeginTrans di nuovo senza chiamare CommitTrans o Rollback è un errore.

Vedi anche

Transazione (ODBC)
Transazione: effetti delle transazioni sugli aggiornamenti (ODBC)
Classe CDatabase
Classe CRecordset