Partilhar via


Troca de campo de registro: como a RFX funciona

Este tópico explica o processo de RFX. Este é um tópico avançado que abrange:

Observação

Este tópico aplica-se a classes derivadas de CRecordset nas quais o fetch de linha em massa não foi implementado. Se você estiver usando o fetch de linha em massa, a RFX (troca de campos de registro) em massa será implementada. A RFX em massa é semelhante à RFX. Para entender as diferenças, confira Conjunto de registros: efetuar fetch de registros em massa (ODBC).

RFX e o conjunto de registros

Os membros de dados de campo do objeto de conjunto de registros, juntos, constituem um buffer de edição que contém as colunas selecionadas de um registro. Quando o conjunto de registros é aberto pela primeira vez e está prestes a ler o primeiro registro, a RFX associa cada coluna selecionada ao endereço do membro de dados de campo apropriado. Quando o conjunto de registros atualiza um registro, a RFX chama funções de API ODBC para enviar uma instrução SQL UPDATE ou INSERT para o driver. A RFX usa seu conhecimento dos membros de dados de campo para especificar as colunas a serem gravadas.

A estrutura faz backup do buffer de edição em determinados estágios para que ele possa restaurar seu conteúdo, se necessário. A RFX faz backup do buffer de edição antes de adicionar um novo registro e antes de editar um registro existente. Ela restaura o buffer de edição em alguns casos, por exemplo, depois de uma chamada Update depois AddNew. O buffer de edição não será restaurado se você abandonar um buffer de edição recém-alterado, por exemplo, movendo-se para outro registro antes de chamar Update.

Além de trocar dados entre a fonte de dados e os membros de dados de campo do conjunto de registros, a RFX gerencia parâmetros de associação. Quando o conjunto de registros é aberto, todos os membros de dados de parâmetro são associados na ordem dos espaços reservados "?" na instrução SQL que CRecordset::Open é constrói. Para obter mais informações, confira Conjunto de registros: parametrizando um conjunto de registros (ODBC).

A substituição da classe de conjunto de DoFieldExchange registros faz todo o trabalho, movendo dados em ambas as direções. Assim como a DDX (troca de dados de caixa de diálogo), a RFX precisa de informações sobre os membros de dados da sua classe. O assistente fornece as informações necessárias escrevendo uma implementação específica do conjunto de registros de DoFieldExchange para você, com base nos nomes de membros de dados de campo e tipos de dados especificados com o assistente.

O processo de troca de campos de registro

Esta seção descreve a sequência de eventos RFX como um objeto de conjunto de registros é aberto e à medida que você adiciona, atualiza e exclui registros. A tabela Sequência de operações RFX durante a abertura do conjunto de registros e a tabela Sequência de operações RFX durante a rolagem neste tópico mostram o processo como RFX processa um comando Move no conjunto de registros e como RFX gerencia uma atualização. Durante esses processos, o DoFieldExchange é chamado para executar muitas operações diferentes. O membro de dados m_nOperation do objeto CFieldExchange determina qual operação é solicitada. Talvez você ache útil ler Conjunto de registros: como conjuntos de registros selecionam registros (ODBC) e Conjunto de registros: como conjuntos de registros atualizam registros (ODBC) antes de ler esse material.

RFX: Associação inicial de colunas e parâmetros

As seguintes atividades RFX ocorrem, na ordem mostrada, quando você chama a função membro Open de um objeto de conjunto de registros:

  • Se o conjunto de registros tiver membros de dados de parâmetro, a estrutura chamará DoFieldExchange para associar os parâmetros aos espaços reservados de parâmetro na cadeia de caracteres de instrução SQL do conjunto de registros. Uma representação dependente do tipo de dados do valor do parâmetro é usada para cada espaço reservado encontrado na instrução SELECT. Isso ocorre depois que a instrução SQL é preparada, mas antes de ser executada. Para obter informações sobre a preparação da instrução, consulte a função ::SQLPrepare na Referência do Programador ODBC.

  • A estrutura chama DoFieldExchange uma segunda vez para associar os valores das colunas selecionadas aos membros de dados de campo correspondentes no conjunto de registros. Isso estabelece o objeto recordset como um buffer de edição que contém as colunas do primeiro registro.

  • O conjunto de registros executa a instrução SQL e a fonte de dados seleciona o primeiro registro. As colunas do registro são carregadas nos membros de dados de campo do conjunto de registros.

A tabela a seguir mostra a sequência de operações RFX quando você abre um conjunto de registros.

Sequência de operações RFX durante a abertura do conjunto de registros

Sua operação Operação DoFieldExchange Operação Banco de Dados/SQL
1. Abra o conjunto de registros.
2. Crie uma instrução SQL.
3. Envie o SQL.
4. Associe membros de dados do parâmetro.
5. Associe membros de dados de campo a colunas.
6. O ODBC faz a movimentação e preenche os dados.
7. Corrija os dados para C++.

Os conjuntos de registros usam a execução preparada do ODBC para permitir a execução rápida com a mesma instrução SQL. Para obter mais informações sobre essa execução preparada, consulte a Referência do Programador de ODBC.

RFX: Rolagem

Quando você rola de um registro para outro, a estrutura chama DoFieldExchange para substituir os valores armazenados anteriormente nos membros de dados de campo pelos valores para o novo registro.

A tabela a seguir mostra a sequência de operações RFX quando o usuário passa de registro para registro.

Sequência de operações RFX durante a rolagem

Sua operação Operação DoFieldExchange Operação Banco de Dados/SQL
1. Chame MoveNext ou uma das outras funções Move.
2. O ODBC faz a movimentação e preenche os dados.
3. Corrija os dados para C++.

RFX: Adicionando novos registros e editando registros existentes

Se você adicionar um novo registro, o conjunto de registros funcionará como um buffer de edição para compilar o conteúdo do novo registro. Assim como acontece com a adição de registros, a edição de registros envolve a alteração dos valores dos membros de dados de campo do conjunto de registros. Na perspectiva da RFX, a sequência é a seguinte:

  1. Sua chamada para a função membro AddNew ou Edit do conjunto de registros faz com que a RFX armazene o buffer de edição atual para que ele possa ser restaurado posteriormente.

  2. AddNew ou Edit prepara os campos no buffer de edição para que a RFX possa detectar membros de dados de campo alterados.

    Como um novo registro não tem valores anteriores com os quais comparar os novos, AddNew define o valor de cada membro de dados de campo como um valor PSEUDO_NULL. Posteriormente, quando você chama Update, a RFX compara o valor de cada membro de dados com o valor PSEUDO_NULL. Se houver uma diferença, o membro de dados foi definido. (PSEUDO_NULL não o mesmo que uma coluna de registro com um valor nulo verdadeiro, nem é igual a NULL do C++).

    Ao contrário da chamada Update para AddNew, a chamada Update para Edit compara valores atualizados com valores armazenados anteriormente em vez de usar PSEUDO_NULL. A diferença é que AddNew não tem valores armazenados anteriormente para comparação.

  3. Você define diretamente os valores dos membros de dados de campo cujos valores você deseja editar ou que deseja preencher para um novo registro. Isso pode incluir chamadas a SetFieldNull.

  4. Sua chamada para Atualizar verifica se há membros de dados de campo alterados, conforme descrito na etapa 2 (consulte a Sequência de tabelas de operações RFX durante a rolagem). Se nenhum tiver sido alterado, Update retornará 0. Se alguns membros de dados de campo tiverem sido alterados, Update preparará e executará uma instrução SQL INSERT, que contém valores para todos os campos atualizados no registro.

  5. Para AddNew, Update conclui restaurando os valores armazenados anteriormente do registro que era o atual antes da chamada a AddNew. Pois Edit, os novos valores editados permanecem em vigor.

A tabela a seguir mostra a sequência de operações RFX quando você adiciona um novo registro ou edita um registro existente.

Sequência de operações RFX durante AddNew e Edit

Sua operação Operação DoFieldExchange Operação Banco de Dados/SQL
1. Chame AddNew ou Edit.
2. Faça backup do buffer de edição.
3. Para AddNew, marque os membros de dados de campo como "limpos" e nulos.
4. Atribua valores a membros de dados do campo de conjunto de registros.
5. Chame Update.
6. Verifique se há campos alterados.
7. Crie a instrução SQL INSERT para AddNew ou instrução UPDATE para Edit.
8. Envie o SQL.
9. Para AddNew, restaure o buffer de edição para seu conteúdo de backup. Para Edit, exclua o backup.

RFX: Excluindo registros existentes

Quando você exclui um registro, o RFX define todos os campos como NULL como um lembrete de que o registro foi excluído e você deve movê-lo. Você não precisa de nenhuma outra informação de sequência RFX.

Confira também

RFX (troca de campo de registro)
Consumo ODBC do MFC
Macros, funções globais e variáveis globais
Classe CFieldExchange
CRecordset::DoFieldExchange