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
Chiamare la
CDatabase
funzione membro dell'oggettoBeginTrans
.Se non è stato implementato il recupero delle righe bulk, chiamare le
AddNew/Update
funzioni membro ,Edit/Update
eDelete
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.Infine, chiamare la
CDatabase
funzione membro dell'oggettoCommitTrans
. Se si verifica un errore in uno degli aggiornamenti o si decide di annullare le modifiche, chiamare la relativaRollback
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