Compartilhar via


Conjunto de registros: mais sobre atualizações (ODBC)

Este tópico aplica-se às classes ODBC do MFC.

Este tópico explica:

Observação

Este tópico aplica-se a objetos derivados de CRecordset nos quais o fetch de linha em massa não foi implementado. Se você implementou a busca de linhas em massa, algumas das informações não se aplicam. Por exemplo, você não pode chamar as funções de membro AddNew, Edit, Delete e Update; no entanto, você pode executar transações. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).

Como outras operações afetam Atualizações

Suas atualizações são afetadas por transações em vigor no momento da atualização, fechando o conjunto de registros antes de concluir uma transação e se deslocando antes de concluir uma transação.

Como as transações afetam Atualizações

Além de entender como AddNew, Edit e Delete funcionam, é importante entender como as funções de membro BeginTrans, CommitTrans e Rollback de CDatabase funcionam com as funções de atualização do CRecordset.

Por padrão, chamadas para AddNew e Edit afetam a fonte de dados imediatamente quando você chama Update. Chamadas Delete entram em vigor imediatamente. Mas você pode estabelecer uma transação e executar um lote dessas chamadas. As atualizações não são permanentes até que você as confirme. Se você mudar de ideia, poderá reverter a transação em vez de confirmá-la.

Para obter mais informações sobre transações, confira Transação (ODBC).

Como o fechamento do conjunto de registros afeta Atualizações

Se você fechar um conjunto de registros ou seu objeto associado CDatabase, com uma transação em andamento (você não chamou CDatabase::CommitTrans ou CDatabase::Rollback), a transação será revertida automaticamente (a menos que o back-end do banco de dados seja o mecanismo de banco de dados do Microsoft Jet).

Cuidado

Se você estiver usando o mecanismo de banco de dados do Microsoft Jet, fechar um conjunto de registros dentro de uma transação explícita não resultará na liberação de nenhuma das linhas que foram modificadas ou bloqueios que foram colocados até que a transação explícita seja confirmada ou revertida. É recomendável que você sempre abra e feche conjuntos de registros dentro ou fora de uma transação explícita do Jet.

Como o deslocamento afeta Atualizações

Quando você faz Recordset: Scrolling (ODBC) em um conjunto de registros, o buffer de edição é preenchido com cada novo registro atual (o registro anterior não é armazenado primeiro). O deslocamento ignora registros excluídos anteriormente. Se você se deslocar após uma chamada AddNew ou Edit sem chamar Update, CommitTransou Rollback primeiro, quaisquer alterações serão perdidas (sem aviso) à medida que um novo registro é trazido para o buffer de edição. O buffer de edição é preenchido com o registro deslocado, o registro armazenado é liberado e nenhuma alteração ocorre na fonte de dados. Isso se aplica a ambos AddNew e Edit.

Suas Atualizações e as Atualizações de outros usuários

Quando você usa um conjunto de registros para atualizar dados, suas atualizações afetam outros usuários. Da mesma forma, as atualizações de outros usuários durante o tempo de vida do conjunto de registros afetam você.

Em um ambiente multiusuário, outros usuários podem abrir conjuntos de registros que contêm alguns dos mesmos registros que você selecionou em seu conjunto de registros. As alterações em um registro antes de recuperá-lo são refletidas no conjunto de registros. Como os conjuntos de dynasets recuperam um registro sempre que você se desloca até ele, os conjuntos de dynasets refletem as alterações sempre que você se desloca até um registro. Os snapshots recuperam um registro na primeira vez em que você se desloca até ele, portanto, os snapshots refletem apenas as alterações que ocorrem antes de deslocar para o registro inicialmente.

Os registros adicionados por outros usuários depois de abrir o conjunto de registros não aparecem no conjunto de registros, a menos que você exiba. Se o conjunto de registros for um dynaset, as edições para registros existentes por outros usuários aparecerão em seu conjunto de dynasets quando você avançar para o registro afetado. Se o conjunto de registros for um snapshot, as edições não aparecerão até que você exiba o snapshot. Se você quiser ver registros adicionados ou excluídos por outros usuários em seu snapshot ou registros adicionados por outros usuários em seu dynaset, chame CRecordset::Requery para recompilar o conjunto de registros. (Observe que as exclusões de outros usuários aparecem em seu dynaset.) Você também pode chamar Requery para ver os registros adicionados, mas não para ver suas exclusões.

Dica

Para forçar o cache de um snapshot inteiro de uma só vez, chame MoveLast imediatamente após abrir o snapshot. Em seguida, chame MoveFirst para começar a trabalhar com os registros. MoveLast é equivalente à rolagem de todos os registros, mas recupera todos eles de uma vez. No entanto, observe que isso pode reduzir o desempenho e pode não ser necessário para alguns drivers.

Os efeitos de suas atualizações em outros usuários são semelhantes aos seus efeitos em você.

Mais sobre Atualização e Exclusão

Esta seção fornece informações adicionais para ajudá-lo a trabalhar com Update e Delete.

Êxito e falha de Atualizações

Se Update for bem-sucedido, o modo ou AddNew o Edit terminará. Para iniciar um modo AddNew ou Edit novamente, chame AddNew ou Edit.

Se Update falhar (retornar FALSE ou lançar uma exceção), você permanecerá no modo AddNew ou Edit, dependendo de qual função você chamou por último. Você pode fazer o seguinte:

  • Modifique um membro de dados de campo e tente novamente Update.

  • Chame AddNew para redefinir os membros de dados de campo como Null, defina os valores dos membros de dados do campo e, em seguida, chame Update novamente.

  • Chame Edit para recarregar os valores que estavam no conjunto de registros antes da primeira chamada para AddNew ou Edit, defina os valores dos membros de dados do campo e, em seguida, chame Update novamente. Após uma chamada bem-sucedida para Update (exceto após uma chamada AddNew), os membros de dados de campo mantêm seus novos valores.

  • Chame Move (inclusive Move com um parâmetro de AFX_MOVE_REFRESH ou 0), que libera todas as alterações e termina qualquer modo AddNew ou Edit vigente.

Atualização e Exclusão

Esta seção aplica-se somente ao Update e Delete.

Em uma operação Update ou Delete, um e apenas um registro deve ser atualizado. Esse registro é o registro atual, que corresponde aos valores de dados nos campos do conjunto de registros. Se por algum motivo nenhum registro for afetado ou mais de um registro for afetado, uma exceção será lançada contendo um dos seguintes valores RETCODE:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED

Quando essas exceções são geradas, você permanece no estado AddNew ou Edit em que estava quando chamou Update ou Delete. Aqui estão os cenários mais comuns nos quais você veria essas exceções. É mais provável que você veja:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED quando estiver usando o modo de bloqueio otimista e outro usuário modificou o registro de uma forma que impede que a estrutura identifique o registro correto para atualizar ou excluir.

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED quando a tabela que você está atualizando não tiver chave primária ou índice exclusivo e você não tem colunas suficientes no conjunto de registros para identificar exclusivamente uma linha de tabela.

Confira também

Conjunto de registros (ODBC)
Conjunto de registros: como conjuntos de registros selecionam registros (ODBC)
RFX (troca de campo de registro)
SQL
Exceções: exceções de banco de dados