Transazione: esecuzione di una transazione in un recordset (ODBC)
In questo argomento viene illustrata l'esecuzione di una transazione in un recordset.
Nota
È supportato un solo livello di transazioni, che non possono essere annidate.
Per eseguire una transazione in un recordset
Chiamare la funzione membro BeginTrans dell'oggetto CDatabase.
Se non è stato implementato il recupero di massa di righe, chiamare le funzioni membro AddNew/Update, Edit/Update e Delete di uno o più oggetti recordset dello stesso database per il numero di volte desiderato. Per ulteriori informazioni, vedere Recordset: aggiunta, aggiornamento ed eliminazione di record (ODBC). Se è stato implementato il recupero di massa di righe, è necessario creare le funzioni richieste per aggiornare l'origine dati.
Chiamare infine la funzione membro CommitTrans dell'oggetto CDatabase. Se in uno degli aggiornamenti si verifica un errore o si decide di annullare le modifiche, chiamare la relativa funzione membro Rollback.
Nel seguente esempio vengono utilizzati due recordset per eliminare l'iscrizione di uno studente dal database di registrazione di una scuola, rimuovendo i dati dello studente da tutti i corsi ai quali è iscritto. Le chiamate a Delete devono essere eseguite correttamente in entrambi i recordset, pertanto è necessario utilizzare una transazione. Nell'esempio si presuppone l'esistenza di m_dbStudentReg, una variabile membro di tipo CDatabase già collegata all'origine dati e delle classi recordset CEnrollmentSet e CStudentSet. La variabile strStudentID contiene un valore specificato 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
Se si chiama nuovamente BeginTrans senza chiamare CommitTrans o Rollback, si verificherà un errore.
Vedere anche
Riferimenti
Concetti
Transazione: effetti delle transazioni sugli aggiornamenti (ODBC)