Esta anotação descreve como realizar transações quando usando as classes de banco de dados ODBC do MFC e o driver de ODBC do Microsoft Acessar 7.0 incluída na versão Microsoft ODBC Desktop Driver Pack 3.0.
Visão geral
Se seu aplicativo de banco de dados executa transações, você deve ter cuidado para chamar CDatabase:: BeginTrans e CRecordset:: Open na seqüência correta em seu aplicativo. O driver do Microsoft Acessar 7.0 usa o mecanismo de banco de dados do Microsoft Jet e Jet requer que seu aplicativo não iniciar uma transação em qualquer banco de dados que tem um cursor aberto. Para as classes de banco de dados ODBC do MFC, um Abrir cursor equivale a um Abrir objeto CRecordset.
Se você abrir um conjunto de registros antes de chamar BeginTrans, você não poderá ver quaisquer mensagens de erro. No entanto, quaisquer atualizações de conjunto de registros que seu aplicativo torna-se permanente após chamar CRecordset:: Updatee as atualizações serão não revertidas chamando Rollback. Para evitar esse problema, você deve chamar BeginTrans primeiro e, em seguida, abrir o conjunto de registros.
MFC verifica a funcionalidade de driver para o comportamento de commit e rollback de cursor. Classe CDatabase fornece duas funções de membro, GetCursorCommitBehavior e GetCursorRollbackBehavior, para determinar o efeito de qualquer transação em seu Abrir objeto CRecordset . Para o driver ODBC do Microsoft Access 7.0, essas funções de membro retornam SQL_CB_CLOSE porque o driver do Access não oferece suporte a preservação de cursor. Portanto, você deve chamar CRecordset:: Requery após um CommitTrans ou Rollback operação.
Quando você precisa executar várias transações um após o outro, você não pode chamar RepetirConsulta depois da primeira transação e, em seguida, iniciar o próximo um. Você deve fechar o conjunto de registros antes da próxima chamada para BeginTrans em ordem para satisfazer o requisito do Jet. Esta anotação técnica descreve dois métodos de lidar com esta situação:
Fechar o conjunto de registros após cada CommitTrans ou Rollback operação
Antes de iniciar uma transação, certifique-se que o objeto recordset é fechado. Depois de chamar BeginTrans, chame função de membro Abrir conjunto de registros. Feche o conjunto de registros imediatamente após chamar CommitTrans ou Rollback. Observe que várias vezes abrindo e fechando o conjunto de registros podem diminuir o desempenho do aplicativo.
Usando SQLFreeStmt
Você também pode usar a função de API de ODBC SQLFreeStmt para fechar explicitamente o cursor depois de encerrar uma transação. Para iniciar outra transação, chame BeginTrans seguido CRecordset:: Requery. Ao chamar SQLFreeStmt, você deve especificar HSTMT o conjunto de registros como o primeiro parâmetro e SQL_CLOSE como o segundo parâmetro. Este método é mais rápido do 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.&Abrir ("MINHAFONTEDEDADOS");
CMyRecordset rs (amp; db);
/ / inicia transação 1 e / / abrir o conjunto de registros
DB.BeginTrans ();
RS.(Aberto);
/ / manipular dados
/ / fim transação 1
DB.CommitTrans (); / / ou Rollback)
/ / fechar o cursor
:: SQLFreeStmt (SQL_CLOSE, rs.m_hstmt);
/ / inicia transação 2
DB.BeginTrans ();
/ / agora obter o conjunto de resultados
RS.RepetirConsulta ();
/ / manipular dados
/ / fim operação 2
DB.CommitTrans ();
RS.(Fechar);
DB.(Fechar)
Outra forma de implementar essa técnica é escrever uma nova função, RequeryWithBeginTrans, que você pode chamar para iniciar a próxima transação após você confirmar ou reverter a primeira delas. Para escrever uma função, siga estas etapas:
m_pDatabase-gt;BeginTrans( );Agora você pode chamar esta função entre cada par de transações:
/ / i&nicia transação 1 e / / abrir o conjunto de registros
DB.BeginTrans ();
RS.(Aberto);
/ / manipular dados
/ / fim transação 1
DB.() CommitTrans; nbsp; / / ou Rollback)
/ / fechar o cursor, inicia nova transação,
/ / e obter o conjunto de resultados
RS.RequeryWithBeginTrans ();
/ / manipular dados
/ / fim operação 2
DB.CommitTrans (); / / ou Rollback)
&Notanbsp; Não use essa técnica se você precisar alterar o conjunto de registros membro variáveis m_strFilter ou m_strSort entre as transações. Nesse caso, você deve fechar o conjunto de registros após cada CommitTrans ou Rollback operação.
Técnico anotações por número |nbsp; &Notas técnicas por categoria