Compartilhar via


TN068: Executando transações com o driver ODBC do Microsoft acesso 7

Observação:

A seguinte nota técnica não foi atualizada desde que foi incluída pela primeira vez na documentação online.sistema autônomo resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.Para obter informações mais recentes, é recomendável que você procurar o tópico de interesse no índice de documentação online.

Esta nota descreve como realizar transações ao usar as classes de banco de dados ODBC do MFC e o driver ODBC do Microsoft acesso 7.0 incluída na versão Microsoft ODBC área de trabalho Driver empacotar 3.0.

Visão Geral

Se seu aplicativo de banco de dados executa as transações, você deve ter cuidado para telefonar CDatabase::BeginTrans e CRecordset::Open na sequência correta em seu aplicativo. O driver do Microsoft acesso 7.0 usa o mecanismo de banco de dados Microsoft Jet e Jet requer que seu aplicativo não iniciar uma transação em qualquer banco de dados que possui um cursor em aberto.Para obter as classes de banco de dados ODBC do MFC, um cursor em aberto é igual a um em aberto CRecordset objeto.

Se você em em aberto um conjunto de registros antes de chamar BeginTrans, você não poderá ver todas as mensagens de erro.No entanto, qualquer conjunto de registros atualiza torna seu aplicativo se tornarão permanentes após chamar CRecordset::Update, e as atualizações serão não revertidas chamando Reversão.Para evitar esse problema, você deve telefonar BeginTrans primeiro e, em seguida, abra o conjunto de registros.

MFC verifica a funcionalidade do driver para confirmar e reversão comportamento do cursor. De classeCDatabase fornece duas funções de membro, GetCursorCommitBehavior e GetCursorRollbackBehavior, para determinar o efeito de qualquer transação na sua abertura CRecordset objeto. Para o driver ODBC do Microsoft acesso 7.0, essas funções de membro retornam SQL_CB_CLOSE porque o driver para o acesso faz não preservação de cursor de suporte. Portanto, você deve telefonar CRecordset::Requery Após um CommitTrans or Reversão operação.

Quando você precisar executar várias transações um após outro, você não pode telefonar Repetir a consulta depois da primeira transação e inicie próximo.Você deve fechar o conjunto de registros antes da próxima telefonar para BeginTrans para satisfazer o requisito do Jet.Esta nota técnica descreve dois métodos para lidar com essa situação:

  • Fechar o conjunto de registros após cada CommitTrans or Reversão operação.

  • Usando a função de ODBC API SQLFreeStmt.

Fechando conjunto de registros após cada operação de reversão ou CommitTrans

Antes de iniciar uma transação, certifique-se que o objeto de conjunto de registros é fechado.Depois de telefonar ndo BeginTrans, telefonar em abertofunção de membro .fechar o conjunto de registros imediatamente após chamar CommitTrans or Reversão.Observe que repetidamente abrindo e fechando o conjunto de registros podem afetar o desempenho do aplicativo.

Usando SQLFreeStmt

Você também pode usar a função de ODBC API SQLFreeStmt para fechar explicitamente o cursor após finalizar uma transação.Para iniciar outra transação telefonar BeginTrans seguido por CRecordset::Requery. Ao chamar SQLFreeStmt, você deve especificar HSTMT do conjunto de registros sistema autônomo o primeiro parâmetro e SQL_CLOSE sistema autônomo o segundo parâmetro.Esse método é mais rápido que fechar e abrir o conjunto de registros no início de cada transação.O código a seguir demonstra como implementar essa técnica:

CMyDatabase db;
db.Open( "MYDATASOURCE" );
CMyRecordset rs( &db );

// start transaction 1 and 
// open the recordset
db.BeginTrans( );
rs.Open( );

// manipulate data

// end transaction 1
db.CommitTrans( );  // or Rollback( )

// close the cursor
::SQLFreeStmt( rs.m_hstmt, SQL_CLOSE );

// start transaction 2
db.BeginTrans( );

// now get the result set
rs.Requery( );

// manipulate data

// end transaction 2
db.CommitTrans( );

rs.Close( );
db.Close( );

Outra maneira de implementar essa técnica é gravar uma nova função, RequeryWithBeginTrans, que você pode chamar para iniciar a transação próxima após você confirmar ou reverter primeiro.Para escrever uma função, siga estas etapas:

  1. Copie o código (CRecordset::repetir consulta) para a nova função.

  2. Adicione a seguinte linha imediatamente após a telefonar para SQLFreeStmt:

    m_pDatabase->BeginTrans( );

Agora você pode chamar esta função entre cada emparelhar de transações:

// start transaction 1 and 
// open the recordset
db.BeginTrans( );
rs.Open( );

// manipulate data

// end transaction 1
db.CommitTrans( );  // or Rollback( )

// close the cursor, start new transaction,
// and get the result set
rs.RequeryWithBeginTrans( );

// manipulate data

// end transaction 2
db.CommitTrans( );  // or Rollback( )
Observação:

Não use essa técnica se você precisar alterar as variáveis de membro conjunto de registros m_strFilter or m_strSort entre as transações. Nesse caso, você deve fechar o conjunto de registros após cada CommitTrans or Reversão operação.

Consulte também

Outros recursos

Notas técnicas por número

Notas técnicas por categoria