Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este tópico se aplica às classes ODBC do MFC.
Este tópico explica:
Como outras operações, como transações, afetam as atualizações.
Mais informações sobre as funções Atualizar e Excluir membros.
Observação
Este tópico aplica-se a objetos derivados de CRecordset
nos quais a busca de linhas em massa não foi implementada. Se tiver implementado a extração em lote de linhas, algumas das informações não se aplicam. Por exemplo, você não pode invocar as funções membro AddNew
, Edit
, Delete
e Update
; no entanto, você pode executar transações. Para obter mais informações sobre a busca de linhas em massa, consulte Recordset: Buscando registros em massa (ODBC).
Como outras operações afetam as atualizações
Suas atualizações são afetadas pelas transações em vigor no momento da atualização, pelo fecho do conjunto de registros antes de concluir uma transação e pelo scrolling antes de concluir uma transação.
Como as transações afetam as atualizações
Além de entender como AddNew
, Edit
e Delete
trabalham, é importante entender como as funções membro BeginTrans
, CommitTrans
e Rollback
de CDatabase funcionam com as funções de atualização de CRecordset.
Por padrão, as chamadas a AddNew
e Edit
afetam imediatamente a fonte de dados quando chamar Update
.
Delete
as chamadas têm efeito imediato. 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 mudar de ideias, pode reverter a transação em vez de a confirmar.
Para obter mais informações sobre transações, consulte Transação (ODBC).
Como o fechamento do conjunto de registros afeta as 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 Microsoft Jet).
Atenção
Se você estiver usando o mecanismo de banco de dados 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 a rolagem afeta as atualizações
Quando você 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). A rolagem ignora os registros excluídos anteriormente. Se se deslocar depois de numa chamada AddNew
ou Edit
sem chamar primeiro Update
, CommitTrans
ou Rollback
, todas as alterações são perdidas (sem aviso) quando um novo registo é trazido para o buffer de edição. O buffer de edição é preenchido com o registro para o qual se rolou, o registro armazenado é apagado e nenhuma alteração ocorre na fonte de dados. Isto aplica-se a ambos e AddNew
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 seu 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 dynasets recuperam um registro cada vez que você rola até ele, os dynasets refletem as alterações cada vez que você rola para um registro. Os instantâneos recuperam um registro na primeira vez que você rola para ele, portanto, os instantâneos refletem apenas as alterações que ocorrem antes de você rolar para o registro inicialmente.
Os registros adicionados por outros usuários depois que você abre o conjunto de registros não aparecem no conjunto de registros, a menos que você faça uma nova consulta. Se o conjunto de registros for um dynaset, as edições feitas em registros existentes por outros usuários aparecerão no dynaset quando você rolar para o registro afetado. Se o conjunto de registros for um instantâneo, as edições não aparecerão até que você consulte novamente o instantâneo. Se você quiser ver registros adicionados ou excluídos por outros usuários em seu instantâneo ou registros adicionados por outros usuários em seu dynaset, chame CRecordset::Requery para reconstruir o conjunto de registros. (Observe que as exclusões de outros usuários aparecem no seu dynaset.) Você também pode ligar Requery
para ver os registros adicionados, mas não para ver suas exclusões.
Sugestão
Para forçar o cache de um snapshot inteiro de uma só vez, ligue MoveLast
imediatamente depois de abrir o snapshot. Em seguida, ligue MoveFirst
para começar a trabalhar com os registros.
MoveLast
é equivalente a percorrer todos os registos, mas recupera-os todos de uma vez. Observe, no entanto, que isso pode diminuir o desempenho e pode não ser necessário para alguns drivers.
Os efeitos das suas atualizações sobre outros utilizadores são semelhantes aos seus efeitos sobre si.
Mais sobre Atualizar e Excluir
Esta seção fornece informações adicionais para ajudá-lo a trabalhar com Update
e Delete
.
Sucesso e falha da atualização
Se Update
for bem-sucedido, o modo AddNew
ou Edit
termina. Para iniciar um modo AddNew
ou modos Edit
novamente, chame AddNew
ou Edit
.
Se Update
falhar (retorna FALSE ou lança uma exceção), você permanece no AddNew
modo ou Edit
dependendo de qual função você chamou por último. Em seguida, você pode seguir um destes procedimentos:
Modifique um campo de dados e tente
Update
novamente.Chame
AddNew
para redefinir os membros de dados de campo como Nulo, defina os valores dos membros de dados de campo e chameUpdate
novamente.Chame
Edit
para recarregar os valores que estavam no conjunto de registros antes da primeira chamada paraAddNew
ouEdit
, defina os valores dos membros de dados de campo e chameUpdate
novamente. Após uma chamada bem-sucedidaUpdate
(exceto após umaAddNew
chamada), os membros de dados de campo retêm seus novos valores.Ligue
Move
(incluindoMove
com um parâmetro de AFX_MOVE_REFRESH ou 0), que aplica quaisquer alterações e encerra qualquer modoAddNew
ouEdit
em execução.
Atualizar e excluir
Esta secção aplica-se tanto a Update
como a Delete
.
Em uma Update
ou Delete
operação, um e apenas um único registo deve ser atualizado. Esse registo é o registo atual, que corresponde aos valores dos dados nos campos do conjunto de registos. 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_ERRO_SQL_NENHUMA_LINHA_AFETADA
ERRO_SQL_AFX_VÁRIAS_LINHAS_AFETADAS
Quando essas exceções são lançadas, você permanece no estado AddNew
ou Edit
em que estava quando chamou Update
ou Delete
. Aqui estão os cenários mais comuns em que você veria essas exceções. É mais provável que veja:
AFX_SQL_ERROR_NO_ROWS_AFFECTED quando você estiver usando o modo de bloqueio otimista e outro usuário tiver modificado o registro de uma forma que impeça a estrutura de identificar o registro correto para atualizar ou excluir.
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED quando a tabela que você está atualizando não tem chave primária ou índice exclusivo e você não tem colunas suficientes no conjunto de registros para identificar exclusivamente uma linha da tabela.
Ver também
Conjunto de registros (ODBC)
Conjunto de registros: Como os conjuntos de registros selecionam registros (ODBC)
Troca de campos de registro (RFX)
SQL
Exceções: Exceções de banco de dados