Compartilhar via


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

  1. Chame a função de membro de BeginTrans do objeto de CDatabase .

  2. 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.

  3. 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.

Consulte também

Referência

Classe incorporadas

Classe CRecordset

Conceitos

Transação (ODBC)

Transação: como as transações afetam atualizações (ODBC)