Transação: realizando uma transação em um conjunto de registros (ODBC)
Este tópico explica como executar uma transação em um conjunto de registros.
Dica
Só um nível de transações tiver suporte; não é possível aninhar transações.
Para executar uma transação em um conjunto de registros
Chame a função de membro de BeginTrans do objeto de CDatabase .
Se você não tiver implementado a linha em massa que pesquisa, chame AddNew/Update, Edit/Update, e as funções de membro de Excluir de um ou mais objetos do conjunto de registros do mesmo base de dados tantas vezes quando necessário. Para obter mais informações, consulte Conjunto de registros: Adicionando, atualizando e excluindo registros (ODBC). Se você implementar a linha em massa que pesquisa, você deve escrever suas próprias funções para atualizar a fonte de dados.
Finalmente, chame a função de membro de CommitTrans do objeto de CDatabase . Se ocorrer um erro em uma das atualizações ou você decidir cancelar as alterações, chame a função de membro de Reverter .
O exemplo a seguir usa dois conjuntos de registros para excluir o registro de um aluno de um base de dados de registro de escola, removendo o aluno de todas as classes em que o aluno é registrado. Como as chamadas de Excluir em ambos os conjuntos de registros sejam bem-sucedidas, uma transação é necessária. O exemplo supõe a existência de m_dbStudentReg, uma variável de membro do tipo CDatabase já conectado à fonte de dados, e às classes CEnrollmentSet e CStudentSetconjunto de registros. A variável de strStudentID contém um valor obtido do usuário.
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;
}
Dica
A chamada BeginTrans novamente sem chamar CommitTrans ou Reverter é um erro.