Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico explica como executar uma transação em um conjunto de registros.
Observação
Apenas um nível de transações é suportado. Não é possível aninhar transações.
Para executar uma transação em um conjunto de registros
Chame a função membro
CDatabasedo objetoBeginTrans.Se não tiver implementado a extração de linhas em massa, chame as funções de membro
AddNew/Update,Edit/UpdateeDeletede um ou mais recordsets do mesmo banco de dados, quantas vezes forem necessárias. Para obter mais informações, consulte Recordset: Adicionando, atualizando e excluindo registros (ODBC). Caso tenhas implementado a busca de linhas em massa, deverás escrever as tuas próprias funções para atualizar a fonte de dados.Finalmente, chame a função membro do objeto
CDatabaseCommitTrans. Se ocorrer um erro numa das atualizações ou se decidires cancelar as alterações, chama a funçãoRollbackde membro.
O exemplo a seguir usa dois conjuntos de registros para excluir a inscrição de um aluno de um banco de dados de registro escolar, removendo o aluno de todas as classes em que o aluno está matriculado. Como as Delete chamadas em ambos os conjuntos de registros devem ser bem-sucedidas, uma transação é necessária. O exemplo pressupõe a existência de m_dbStudentReg, uma variável membro do tipo CDatabase já conectada a uma fonte de dados, e as classes de conjunto de registros CEnrollmentSet e CStudentSet. A strStudentID variável 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;
}
Observação
Ligar BeginTrans novamente sem ligar CommitTrans ou Rollback é um erro.
Ver também
Transação (ODBC)
Transação: Como as transações afetam as atualizações (ODBC)
Classe CDatabase
Classe CRecordset