Partilhar via


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:

    1. Se nenhuma alteração for detectada, Update não fará nada e retornará 0.

    2. 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 );
      
    3. 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.

    4. 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, chame SetFieldDirty 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, chame IsFieldNullable.

    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:

    1. Se não houver alterações, Update não fará nada e retornará 0.

    2. 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.

    3. 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.

    4. Ao contrário do processo para AddNew, processo Edit 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ê chama Update.

    Dica

    Se você chamar AddNew ou Edit depois de ter chamado qualquer função anteriormente, mas antes de chamar Update, 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 um AddNew ou Edit e começar um novo: se você determinar que o registro em andamento está com falha, basta chamar Edit ou AddNew 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:

    1. O registro atual no buffer de edição não é feito com backup como dentro AddNew e Edit.

    2. 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 e Edit.

    3. 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.

    4. 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 chamar Edit.

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)