TN053: Personalizar DFX rotinas para Classes de banco de dados DAO
Observação |
---|
Como do Visual C++.NET, o ambiente do Visual C++ e assistentes não há mais suportam DAO (embora as classes DAO são incluídas e você ainda pode usá-los).A Microsoft recomenda que você use OLE DB modelos ou ODBC e MFC para novos projetos.Você só deve usar DAO na manutenção de aplicativos existentes. |
Esta nota 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, o DFX_Text função será explicada em detalhes como exemplo.Como uma fonte de informações para esta nota técnica adicional, você pode examinar o código para os outros as funções DFX individuais.Você provavelmente não terá uma rotina DFX personalizada geralmente pode ser necessário uma rotina personalizada de RFX (usada com classes de banco de dados ODBC).
Esta nota técnica contém:
Visão geral sobre DFX
Exemplos de usando DAO registro campo Exchange e dinâmico ligação
Como funciona a DFX
O que faz a rotina DFX personalizar
Detalhes do DFX_Text
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 usando o CDaoRecordset classe.O processo é simplificado usando membros de dados de CDaoRecordset classe.Derivando de CDaoRecordset, você pode adicionar membros de dados para a classe derivada que representa cada campo em uma tabela ou consulta.Esse mecanismo de "vinculação estática" é simple, mas talvez não seja o método de busca/atualizar dados de escolha para todos os aplicativos.DFX recupera cada campo vinculado sempre que o registro atual for alterado.Se você estiver desenvolvendo um aplicativo de diferenciação de desempenho não requer a buscar cada campo, quando a moeda é alterada, "vinculação dinâmica" via CDaoRecordset::GetFieldValue e CDaoRecordset::SetFieldValue pode ser o método de acesso de dados escolhido.
Observação |
---|
DFX e vinculação dinâmica não são mutuamente exclusivos, portanto um uso híbrido de vinculação estática e dinâmica pode ser usado. |
Exemplo 1 — Uso do DAO registro campo Exchange somente
(assume CDaoRecordset — classe derivada CMySet já aberto)
// Add a new record to the customers table
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update();
Exemplo 2 — Use de dinâmico ligação somente
(pressupõe usando CDaoRecordset classe, rs, e já está aberto)
// Add a new record to the customers table
COleVariant varFieldValue1 ( _T("MSFT"), VT_BSTRT );
//Note: VT_BSTRT flags string type as ANSI, instead of UNICODE default
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âmica ligação
(assume a procura de dados de funcionários com CDaoRecordset-classe derivada emp)
// Get the employee's data so that it can be displayed
emp.MoveNext();
// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
emp.GetFieldValue(_T("photo"), varPhoto);
// Display the data
PopUpEmployeeData(emp.m_strFirstName,
emp.m_strLastName, varPhoto);
Como funciona a DFX
O mecanismo DFX funciona de forma semelhante para o mecanismo de troca (RFX) de campo de Registro usada pelas classes do MFC ODBC.Princípios de DFX e RFX são os mesmos, mas existem várias diferenças internas.O design das funções DFX era que praticamente todo o código é compartilhado pelas rotinas DFX individuais.No somente o mais alto DFX nível faz algumas coisas.
DFX constrói a SQL Selecionar cláusula e SQL parâmetros de cláusula se necessário.
DFX constrói a estrutura de ligação usada do DAO GetRows função (mais adiante).
DFX gerencia o buffer de dados usado para detectar sujos campos (se o buffer duplo é usado)
DFX gerencia o Nulo e DIRTY status matrizes e define valores se necessário nas atualizações.
No coração do DFX mecanismo é o CDaoRecordset derivado da classe DoFieldExchange função.Esta função despacha chamadas a funções DFX individuais de um tipo de operação apropriada.Antes de chamar DoFieldExchange as funções internas do MFC definir o tipo de operação.A lista a seguir mostra os diversos tipos de operação e uma breve descrição.
Operação |
Descrição |
---|---|
AddToParameterList |
Cria cláusula parâmetros |
AddToSelectList |
Cláusula SELECT 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 seleção suja |
StoreField |
Salva o registro atual em cache |
LoadField |
Cache de restaurações para valores de membro |
FreeCache |
Libera o cache |
SetFieldNull |
Conjuntos campo status & valor para nulo |
MarkForAddNew |
Marca campos sujos se não PSEUDO NULL |
MarkForEdit |
Se sujo de campos marcas não correspondem ao cache |
SetDirtyField |
Conjuntos de campo marcados como sujos de valores |
Na próxima seção, cada operação será explicada mais detalhadamente para DFX_Text.
O recurso mais importante para entender sobre o processo de troca de campo de registro do DAO é que ele usa o GetRows função do CDaoRecordset objeto.O DAO GetRows função pode trabalhar de várias maneiras.Esta nota técnica descreverá resumidamente GetRows como está fora do escopo desta nota técnica.
DAO GetRows pode trabalhar de várias maneiras.
Ele pode buscar vários registros e vários campos de dados ao mesmo tempo.Isso permite rápido acesso a dados com a complicação de lidar com uma estrutura de dados grandes e os deslocamentos apropriados a cada campo e cada registro de dados na estrutura.MFC não tirar proveito deste registro vários mecanismo de busca.
Outra maneira de GetRows pode trabalho é permitir que os programadores especificar endereços de ligação para os dados recuperados de cada campo de um registro de dados.
DAO será também "retorno de chamada" para o chamador para colunas de comprimento variável para permitir que o chamador ao alocar memória.Esse segundo recurso tem a vantagem de minimizar o número de cópias dos dados, bem como permitindo o armazenamento direto de dados de membros de uma classe (o CDaoRecordset classe derivada).Este segundo mecanismo é o método MFC usa para vincular a membros de dados em CDaoRecordset classes derivadas.
O que faz a rotina DFX personalizar
É aparente a partir dessa discussão a operação mais importante implementada em qualquer função DFX deve ser a capacidade de configurar 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 importantes ou complexos como preparar corretamente para o GetRows de chamada.
O uso de DFX é descrito na documentação on-line.Basicamente, existem dois requisitos.Primeiro, os membros devem ser adicionados para o CDaoRecordset derivado da classe para cada campo ligado e parâmetro.Seguindo esse CDaoRecordset::DoFieldExchange deve 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 conversível no tipo.Por exemplo, um campo numérico no banco de dados, como um inteiro longo, sempre pode ser convertido em texto e acoplado a um CString membro, mas um campo de texto em um banco de dados não necessariamente pode ser convertidos em uma representação numérica, como inteiro longo e vinculado 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, a melhor maneira de explicar como funciona o DFX é trabalhar com um exemplo.Para essa finalidade passar por internos do DFX_Text deve funcionar muito bem para ajudar a fornecer pelo menos um conhecimento básico de DFX.
AddToParameterList
Esta operação cria o SQL parâmetros de cláusula ("Parameters <param name>, <param type> ... ;") exigida pelo Jet.Cada parâmetro é chamado e digitado (conforme especificado na chamada RFX).Consulte a função CDaoFieldExchange::AppendParamType função para ver os nomes dos tipos individuais.No caso de DFX_Text, o tipo usado é text.AddToSelectList
Cria o SQL Selecionar cláusula.Isso é bastante direta como o nome de coluna especificado pela chamada DFX é simplesmente acrescentado ("SELECT <column name>, ...").BindField
As mais complexas das operações.Como mencionado anteriormente, isso é onde a estrutura de ligação DAO usado por GetRows está definido.Como você pode ver o código de DFX_Text os tipos de informações na estrutura incluem o tipo DAO usado (DAO_CHAR ou DAO_WCHAR de DFX_Text).Além disso, o tipo de vinculação usado é também configurado.Em uma seção anterior GetRows foi descrito resumidamente, mas foi suficiente explicar o tipo de vinculação usado pelo MFC é sempre ligação direta de endereço (DAOBINDING_DIRECT).Além de vinculação de colunas 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.Isso significa que MFC pode sempre saber DAO "onde" colocar os dados, permitindo 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 do parâmetro especificado no membro do parâmetro.Correção
Preenche o Nulo status para cada campo.SetFieldNull
Esta operação somente marca cada status de campo como Nulo e define o membro de valor da variável 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 do registro atual é usado para fazer certas coisas mais simples.Por exemplo, "sujos" campos podem ser detectados automaticamente.Conforme descrito na documentação on-line, que ele pode ser desativado completamente ou em nível de campo.A implementação do buffer utiliza um mapa.Esse mapa é utilizado para comparar alocadas dinamicamente cópias dos dados com o endereço do campo "ligado" (ou CDaoRecordset derivada do membro de dados).
AllocCache
Dinamicamente aloca o valor do campo em cache e o adiciona ao mapa.FreeCache
Exclui o valor do campo em cache e remove o mapa.StoreField
Copia o valor do campo atual no cache de dados.LoadField
Copia o valor em cache para o membro de campo.MarkForAddNew
Verifica se o valor do campo atual é não-Nulo e marca sujo se necessário.MarkForEdit
Compara o valor do campo atual com cache de dados e marca sujo se necessário.
Dica |
---|
Modelo suas rotinas DFX personalizadas nas rotinas DFX existentes para tipos de dados padrão. |