TN053: Personalizar rotinas DFX para Classes de banco de dados DAO

Esta anotação técnica descreve o mecanismo de troca (DFX) de campo de registro do DAO. Para ajudar a entender o que está acontecendo nas rotinas DFX, a função DFX_Text será explicada em detalhes como um exemplo. Como uma fonte adicional de informações para esta anotação técnica, você pode simplesmente examinar o código para o outro as funções DFX individuais.Você provavelmente não precisará uma rotina DFX Personalizar tão frequentemente como você pode precisar de uma rotina de personalizar RFX (usada com classes de banco de dados ODBC).

Esta anotação técnica contém:

Visão geral sobre DFX

O mecanismo de troca de campo de registro do DAO (DFX) é usado para simplificar o procedimento de recuperação e atualização de dados ao usar a classe de CDaoRecordset . O processo é simplificado com o uso de membros de dados de classe CDaoRecordset . Derivando de CDaoRecordset, você pode adicionar membros de dados para a classe derivada que representa cada campo em uma tabela ou consulta. Este mecanismo de "vinculação estática" é simple, mas pode não ser o método de busca/atualizar dados de escolha para todas as aplicações. DFX recupera cada campo ligado sempre que o registro atual for alterado. Se você estiver desenvolvendo um aplicativo de desempenho-maiúsculas de minúsculas que não exigem a buscar cada campo quando moeda é alterada, "Dinâmico vinculação" via CDaoRecordset::GetFieldValue e CDaoRecordset:: SetFieldValue pode ser dados acessar o método de escolha.

&Notanbsp;  DFX e dinâmico ligação não são mutuamente exclusivos, para que uma utilização de híbrido de estática e dinâmica ligação possa ser usada.

Exemplo 1 - uso do DAO registro campo Exchange somente

(pressupõe CDaoRecordset - derivado classe CMySet já Abrir)

/ / Adicionar um novo registro à tabela customers
MYSET.AddNew();
MYSET.m_strCustID = _T("MSFT");
MYSET.m_strCustName = _T("Microsoft");
MYSET.Update)

Exemplo 2 - uso de dinâmico ligação somente

(assume usando classe CDaoRecordset , rs , e já está aberto)

/ / Adicionar um novo registro à tabela customers
COleVariantnbsp; varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / &Nota: VT_BSTRT sinalizadores tipo de Cadeia de caracteres como ANSI, em vez do padrão UNICODE
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
RS.AddNew();
RS.SetFieldValue(_T("Customer_ID"), varFieldValue1);
RS.SetFieldValue(_T("Customer_Name"), varFieldValue2);
RS.Update)

Exemplo 3 - uso do DAO registro campo Exchange e dinâmico ligação

(pressupõe navegação dados de funcionários com CDaoRecordset-derivado classe emp )

/ / Obter dados do funcionário para que ele possa ser exibido
EMP.MoveNext();

/ / Se o usuário deseja ver a fotografia do funcionário,
/ / buscá-lo
COleVariant varPhoto;
se (bSeePicture)
EMP.GetFieldValue(_T("photo"), varPhoto);

/ / Display the data
PopUpEmployeeData (emp.m_strFirstName,
 EMP.m_strLastName, varPhoto)

Como funciona o DFX

O mecanismo DFX funciona de modo semelhante ao mecanismo de troca (RFX) de campo de registro utilizado pelas classes do MFC ODBC. Os priciples de DFX e RFX são os mesmos mas há numerosas diferenças internas. O design das funções DFX era tal que praticamente todo o código é compartilhado pelas rotinas DFX individuais. No mais alto DFX nível só faz algumas coisas.

No coração do DFX mecanismo é DoFieldExchange função da classe CDaoRecordset derivada. Esta função despacha chamadas para as funções DFX individuais de um tipo de operação adequada. Antes para chamar DoFieldExchange o MFC interno funções definir o tipo de operação. A seguinte lista mostra os vários tipos de operação e uma breve descrição.

Operação Descrição
AddToParameterList Cria Parâmetros cláusula
AddToSelectList Cláusula Selecionar compilações
BindField Configura a estrutura de ligação
BindParam Define valores de parâmetro
Correção Define o status NULL
AllocCache Aloca o cache para marcar suja
StoreField Salva o registro atual para armazenar em cache
LoadField Cache de restaurações para valores de membro
FreeCache Libera o cache de
SetFieldNull Conjuntos c&o amp estatuto; valor para nulo
MarkForAddNew Marca campos sujos se não PSEUDO NULL
MarkForEdit Se suja de campos marcas não correspondem ao cache de
SetDirtyField Conjuntos campo marcados como sujos valores

Na próxima seção, cada operação será explicada com mais detalhes para DFX_Text.

A característica mais importante para entender sobre o processo de troca de campo de registro do DAO é que ele usa a função de GetRows do objeto ICDaoRecordset . A função DAO GetRows pode trabalhar de várias maneiras. Esta anotação técnica descreverá apenas brevemente GetRows como é fora do escopo desta nota técnica.

DAO GetRows pode trabalhar de várias maneiras.

O que faz a rotina DFX Personalizar

É evidente a partir dessa discussão que a operação mais importante implementada em qualquer função DFX deve ser capaz de definir as estruturas de dados necessárias para chamar com êxito GetRows. Há um número de outras operações que uma função DFX deve suportar bem, mas nenhum como importante nem complexas como preparar corretamente para o GetRows chamar.

O uso de DFX é descrito na documentação on-line. Basicamente, existem 2 requisitos. Em primeiro lugar, Membros devem ser adicionados para a classe de CDaoRecordset derivada para cada campo ligado e parâmetro. Após esta CDaoRecordset:: DoFieldExchange devem ser substituído. Observe que o tipo de dados do membro é importante. Ele deve corresponder aos dados do campo no banco de dados ou pelo menos ser convertable para esse tipo. Por exemplo, um campo numérico em banco de dados, como um inteiro longo, sempre pode ser convertido em texto e ligado a um membro de CString , mas um campo de texto em um banco de dados não necessariamente pode ser convertido em uma representação numérica, como inteiro longo e ligado a um membro de um inteiro longo. DAO e o mecanismo de banco de dados Microsoft Jet são responsáveis pela conversão (em vez de MFC).

Detalhes do DFX_Text

Como mencionado anteriormente, provavelmente a melhor maneira de explicar como funciona DFX é simplesmente trabalhar através de um exemplo. Para esse efeito passando por internos de DFX_Text deve funcionar muito bem para ajudar a fornecer pelo menos um conhecimento básico do DFX.

AddToParameterList

Esta operação cria a cláusula de SQL parâmetros (" Parameters lt;param name>, <param type> ... ; ") exigida pelo Jet. Cada parâmetro é chamado e digitado (conforme especificado na chamada RFX). Consulte a função de função de CDaoFieldExchange::AppendParamType para ver os nomes dos tipos individuais. No maiúscminúsc de DFX_Text, o tipo usado étext.

AddToSelectList

Cria a cláusula SQL Selecionar . Isto é consideravelmente direto como o nome de coluna especificado pela chamada DFX é simplesmente acrescentado (" SELECT lt;column name>, ... ").

BindField

-De longe a mais complexa das operações. Como mencionado anteriormente, que isso é onde a estrutura de ligação de DAO usada por GetRows está configurada. Como você pode ver o código em DFX_Text os tipos de informações na estrutura incluem o tipo DAO usado (DAO_CHAR ou DAO_WCHAR no maiúscminúsc de DFX_Text). Além disso, o tipo de ligação usada também é configurar. Em uma seção anterior GetRows foi descritos resumidamente, mas foi suficiente para explicar que o tipo de ligação usada pelo MFC é sempre endereço directo ligação (DAOBINDING_DIRECT). Além disso, para ligação de coluna de comprimento variável (como DFX_Text) ligação de retorno de chamada é usada para que MFC pode controlar a alocação de memória e especificar um endereço do tamanho correto. O que isto significa é que MFC pode sempre dizer DAO "onde" colocar os dados, permitindo assim a ligação diretamente para variáveis de membro. O restante da estrutura de ligação é preenchido com coisas como o endereço da função de retorno de chamada de alocação de memória e o tipo de ligação de coluna (ligação por nome de coluna).

BindParam

Esta é uma operação simple que chama SetParamValue com o valor de parâmetro especificado em seu membro de parâmetro.

Correção

Preenche o status NULL para cada campo.

SetFieldNull

Esta operação somente marca cada status de campo como NULL e define o membro de valor da variável para PSEUDO_NULL.

SetDirtyField

Chamadas SetFieldValue para cada campo marcado sujo.

Todas as operações restantes somente lidam com usando o cache de dados. O cache de dados é um buffer extra dos dados no registro atual que é usado para fazer certas coisas mais simples. Por exemplo "sujos" campos podem ser automaticamente detectados. Conforme descrito na documentação on-line pode ter sido desativado completamente ou no nível do campo. A implementação do buffer utiliza um mapa. Este mapa é utilizado para igualar-se alocadas dinamicamente cópias dos dados com o endereço do campo "ligado" (ou membro de dados CDaoRecordset derieved).

AllocCache

Dinamicamente aloca o valor do campo em cache e o adiciona ao mapa.

FreeCache

Exclui o valor do campo em cache e remove-lo do mapa.

StoreField

Copia o valor do campo atual para o cache de dados.

LoadField

Copiará o valor em cache para o membro de domínio.

MarkForAddNew

Verifica se o valor do campo atual é não-NULL e marcas dirty se necessário.

MarkForEdit

Compara o valor do campo atual com cache de dados e marca sujo se necessário.

Dica   Modelar seus Personalizar rotinas DFX nas rotinas DFX existentes para tipos de dados padrão.

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index