Conjunto de registros: como AddNew, editar e excluir trabalho (ODBC)
Este tópico aplica-se às classes ODBC do MFC.
Este tópico explica como as funções de membro AddNew
, Edit
e Delete
da classe CRecordset
funcionam. Os tópicos abordados incluem:
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ê estiver usando busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Como um suplemento, talvez você queira ler Record Field Exchange: Como funciona o RFX, que descreve a função correspondente do RFX nas operações de atualização.
Adicionar um registro
Adicionar um novo registro a um conjunto de registros envolve chamar a função membro AddNew do conjunto de registros, definir os valores dos membros de dados de campo do novo registro e chamar a função do membro Update para gravar o registro na fonte de dados.
Como pré-condição para chamada AddNew
, o conjunto de registros não pode ter sido aberto como somente leitura. As funções de membro CanUpdate
e CanAppend
permitem determinar essas condições.
Ao chamar AddNew
:
O registro no buffer de edição é armazenado, portanto, seu conteúdo pode ser restaurado se a operação for cancelada.
Os membros de dados de campo são sinalizados para que seja possível detectar alterações neles mais tarde. Os membros de dados de campo também são marcados como limpos (inalterados) e definidos como nulos.
Depois de chamar AddNew
, o buffer de edição representa um novo registro vazio, pronto para ser preenchido com valores. Para fazer isso, defina manualmente os valores atribuindo a eles. Em vez de especificar um valor de dados real para um campo, você pode chamar SetFieldNull
para especificar o valor nulo.
Para confirmar suas alterações, você chama Update
. Quando você chama Update
para o novo registro:
Se o driver ODBC permitir a função de API ODBC
::SQLSetPos
, o MFC usará a função para adicionar o registro à fonte de dados. Com::SQLSetPos
, o MFC pode adicionar um registro com mais eficiência porque não precisa construir e processar uma instrução SQL.Se
::SQLSetPos
não puder ser usado, o MFC fará o seguinte:Se nenhuma alteração for detectada,
Update
não fará nada e retornará 0.Se houver alterações,
Update
construirá uma instrução INSERT do SQL. As colunas representadas por todos os membros de dados de campo sujo são listadas na instrução INSERT. Para forçar a inclusão de uma coluna, chame a função de membro SetFieldDirty:SetFieldDirty( &m_dataMember, TRUE );
Update
confirma o novo registro – a instrução INSERT é executada e o registro é confirmado na tabela na fonte de dados (e no conjunto de registros, se não um instantâneo), a menos que uma transação esteja em andamento.O registro armazenado é restaurado para o buffer de edição. O registro atual antes da chamada
AddNew
é atual novamente, independentemente de a instrução INSERT ter sido executada com êxito.
Dica
Para o controle completo de um novo registro, siga a seguinte abordagem: defina os valores de todos os campos que terão valores e defina explicitamente todos os campos que permanecerão nulos chamando
SetFieldNull
com um ponteiro para o campo e o parâmetro TRUE (o padrão). Se quiser garantir que um campo não seja gravado na fonte de dados, chameSetFieldDirty
com um ponteiro para o campo e o parâmetro FALSE e não modifique o valor do campo. Para determinar se o campo tem permissão para ser nulo, chameIsFieldNullable
.Dica
Para detectar quando os membros de dados do conjunto de registros alteram o valor, o MFC usa um valor de PSEUDO_NULL apropriado para cada tipo de dados que você pode armazenar em um conjunto de registros. Se você precisar definir explicitamente um campo para o valor PSEUDO_NULL e esse campo já estiver marcado como Nulo, você também deverá chamar
SetFieldNull
, passando o endereço do campo no primeiro parâmetro e FALSE no segundo parâmetro.
Visibilidade dos registros adicionados
Quando um registro adicionado está visível ao conjunto de registros? Os registros adicionados às vezes aparecem e às vezes não são visíveis, dependendo de dois aspectos:
Do que seu driver é capaz.
Do que a estrutura pode tirar proveito.
Se o driver ODBC permitir a função de API ODBC do ::SQLSetPos
, o MFC usará a função para adicionar o registro à fonte de dados. Com ::SQLSetPos
, os registros adicionados estão visíveis para qualquer conjunto de registros MFC atualizável. Sem suporte para a função, os registros adicionados não são visíveis e você precisa ligar Requery
para vê-los. Usar ::SQLSetPos
também é mais eficiente.
Editando um registro existente
Editar um registro existente em um conjunto de registros envolve chamar a função membro Edit do conjunto de registros, definir os valores dos membros de dados de campo do novo registro e chamar a função do membro Update para gravar o registro alterado na fonte de dados.
Como pré-condição para chamar Edit
, o conjunto de registros precisa ser atualizável e em um registro. As funções de membro CanUpdate
e IsDeleted
permitem determinar essas condições. O registro atual também não pode ter sido excluído e precisa haver registros no conjunto de registros (ambos IsBOF
e IsEOF
retornar 0).
Quando você chama Edit
, o registro no buffer de edição (o registro atual) é armazenado. Os valores do registro armazenado são usados posteriormente para detectar se algum campo foi alterado.
Depois de chamar Edit
, o buffer de edição ainda representa o registro atual, mas agora está pronto para aceitar alterações nos membros de dados do campo. Para alterar o registro, defina manualmente os valores de todos os membros de dados de campo que deseja editar. Em vez de especificar um valor de dados real para um campo, você pode chamar SetFieldNull
para especificar o valor nulo. Para confirmar suas alterações, chame Update
.
Dica
Para sair do modo AddNew
ou Edit
, chame Move
com o parâmetro AFX_MOVE_REFRESH.
Como pré-condição para chamar Update
, o conjunto de registros não pode estar vazio e o registro atual não pode ter sido excluído. IsBOF
, IsEOF
e IsDeleted
devem retornar 0.
Quando você chama Update
o registro editado:
Se o driver ODBC permitir a função de API ODBC
::SQLSetPos
, o MFC usará a função para atualizar o registro à fonte de dados. Com::SQLSetPos
, o driver compara o buffer de edição com o registro correspondente no servidor, atualizando o registro no servidor se os dois forem diferentes. Com::SQLSetPos
, o MFC pode atualizar um registro com mais eficiência porque não precisa construir e processar uma instrução SQL.- ou -
Se
::SQLSetPos
não puder ser usado, o MFC fará o seguinte:Se não houver alterações,
Update
não fará nada e retornará 0.Se houver alterações,
Update
construirá uma instrução UPDATE do SQL. As colunas listadas na instrução UPDATE são baseadas nos membros de dados de campo que foram alterados.Update
confirma as alterações, executa a instrução UPDATE, e o registro é alterado na fonte de dados, mas não confirmado se uma transação está em andamento (confira Transação: executando uma transação em um conjunto de registros (ODBC) para obter informações sobre como a transação afeta a atualização). O ODBC mantém uma cópia do registro, que também é alterada.Ao contrário do processo para
AddNew
, processoEdit
não restaura o registro armazenado. O registro editado permanece em vigor como o registro atual.
Cuidado
Ao se preparar para atualizar um conjunto de registros chamando
Update
, assegure-se de que seu conjunto de registros inclua todas as colunas que compõem a chave primária da tabela (ou todas as colunas de qualquer índice exclusivo na tabela, ou colunas suficientes para identificar exclusivamente a linha). Em alguns casos, a estrutura pode usar apenas as colunas selecionadas em seu conjunto de registros para identificar qual registro em sua tabela deverá ser atualizado. Sem todas as colunas necessárias, vários registros podem ser atualizados na tabela. Nesse caso, a estrutura gera exceções quando você chamaUpdate
.Dica
Se você chamar
AddNew
ouEdit
depois de ter chamado qualquer função anteriormente, mas antes de chamarUpdate
, o buffer de edição será atualizado com o registro armazenado, substituindo o registro novo ou editado em andamento. Esse comportamento oferece uma maneira de anular umAddNew
ouEdit
e começar um novo: se você determinar que o registro em andamento está com falha, basta chamarEdit
ouAddNew
novamente.
Excluindo um registro
Excluir um registro de um conjunto de registros envolve rolar até o registro e chamar a função de membro Delete de um conjunto de registros. Ao contrário de AddNew
e Edit
, Delete
não requer uma chamada correspondente para Update
.
Como pré-condição para chamar Delete
, o conjunto de registros precisa ser atualizável e estar em um registro. As funções de membro CanUpdate
, IsBOF
, IsEOF
e IsDeleted
permitem determinar essas condições.
Ao chamar Delete
:
Se o driver ODBC permitir a função de API ODBC
::SQLSetPos
, o MFC usará a função para excluir o registro à fonte de dados. Usar::SQLSetPos
geralmente é mais eficiente do que usar o SQL.- ou -
Se
::SQLSetPos
não puder ser usado, o MFC fará o seguinte:O registro atual no buffer de edição não é feito com backup como dentro
AddNew
eEdit
.Delete
constrói uma instrução DELETE de SQL que remove o registro.O registro atual no buffer de edição não é armazenado como
AddNew
eEdit
.Delete
confirma a exclusão – executa a instrução DELETE. O registro é marcado como excluído na fonte de dados e, se o registro for um instantâneo, no ODBC.Os valores do registro excluído ainda estão nos membros de dados de campo do conjunto de registros, mas os membros de dados de campo são marcados como Nulo e a função membro de
IsDeleted
do conjunto de registros retorna um valor diferente de zero.
Observação
Depois de excluir um registro, você deve rolar para outro registro para recarregar o buffer de edição com os dados do novo registro. É um erro chamar
Delete
de novo ou chamarEdit
.
Para obter informações sobre as instruções SQL usadas em operações de atualização, confira SQL.
Confira também
Conjunto de registros (ODBC)
Conjunto de registros: mais sobre atualizações (ODBC)
RFX (troca de campo de registro)