TN053: Rotinas DFX personalizadas para classes de banco de dados DAO
Observação: |
---|
sistema autônomo do Visual C++. NET, o ambiente do Visual C++ e sistema autônomo assistentes não suportam mais DAO (Embora sistema autônomo classes DAO estão incluídas e você ainda poderá usá-las).A Microsoft recomenda que você use Modelos de BD OLE DB or ODBC e do MFC para novos projetos.Você só deve usar o DAO em 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 em rotinas de DFX, a DFX_Text função será explicada em detalhes sistema autônomo exemplo. sistema autônomo uma fonte de informações para esta nota técnica adicional, você pode examinar o código para o Outros sistema autônomo funções DFX individuais.Você provavelmente não será necessário uma rotina DFX personalizada sempre que você pode precisar de uma rotina RFX personalizada (usada com classes de banco de dados ODBC).
Esta nota técnica contém:
Visão geral DFX
Exemplos usando DAO registro campo Exchange e vinculação dinâmica
Como funciona a DFX
O que faz a rotina DFX personalizado
Detalhes de DFX_Text
Visão geral DFX
O mecanismo de troca de campo de registro DAO (DFX) é usado para simplificar o procedimento de recuperação e atualização de dados ao usar o CDaoRecordset classe. O processo é simplificado usando membros de dados do CDaoRecordset classe. Derivando de CDaoRecordset, você pode adicionar membros de dados para a classe derivada que representa cada campo em uma tabela ou consulta. Isso "estático vinculação" mecanismo é simples, mas talvez não seja o método de busca/atualização de dados de preferência para todos os aplicativos.DFX recupera cada campo limite sempre que o registro corrente for alterado.Se você estiver desenvolvendo um aplicativo de desempenho é fundamental que não exige a busca de todos os campos quando moeda é alterada, "vinculação dinâmica" viaCDaoRecordset::GetFieldValue e CDaoRecordset::SetFieldValue pode ser o método de acesso a dados de preferência.
Observação: |
---|
DFX e vinculação dinâmica não são mutuamente exclusivo, para que possa ser usado um uso híbrido de vinculação estática e dinâmica. |
Exemplo 1 — Uso do DAO registro campo Exchange somente
(assume CDaoRecordset — classe derivada CMySet estiver em 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 — Uso somente de vinculação dinâmica
(pressupõe usando CDaoRecordset classe, rse já está em 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 vinculação dinâmica
(supõe que a navegação 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 maneira semelhante para o mecanismo de troca (RFX) de campo de registro usada pelas classes MFC ODBC.Os princípios de DFX e RFX são os mesmos, mas existem várias diferenças internas.O design das funções DFX foi que praticamente todo o código é compartilhado pelas rotinas DFX individuais.No mais alto DFX nível somente faz algumas coisas.
DFX constrói o SQL selecionar cláusula e SQL PARÂMETROS cláusula se necessário.
DFX constrói a estrutura de vinculação usada pelo GetRows função (mais adiante).
DFX gerencia o buffer de dados usado para detectar sujos campos (se o armazenamento duplo em buffer estiver sendo usado)
DFX gerencia o NULO and DIRTY status arrays e define valores se necessário nas atualizações.
A essência do DFX do mecanismo é o CDaoRecordset classe derivada DoFieldExchange função. Esta função despacha chamadas para as funções DFX individuais de um tipo de operação apropriada.Antes de chamar DoFieldExchange as funções internas do MFC conjunto o tipo de operação. A lista a seguir mostra os vários tipos de operação e uma breve descrição.
Operation |
Descrição |
---|---|
AddToParameterList |
Compilações PARAMETERS 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 nulo |
AllocCache |
Aloca o cache para seleção suja |
StoreField |
Salva o registro corrente para o cache |
LoadField |
Cache de restaurações para valores de membro |
FreeCache |
Libera o cache |
SetFieldNull |
Conjuntos de campos status & valor como nulo |
MarkForAddNew |
Marcar campos com problemas se não PSEUDO nulo |
MarkForEdit |
Marcas de campos com problemas se não correspondem ao cache |
SetDirtyField |
Conjuntos de campo marcados sistema autônomo sujos de valores |
Na próxima seção, cada operação será explicada mais detalhadamente para DFX_Text.
O recurso mais importante para compreender sobre o processo de troca de campo de registro do DAO é que ele usa o GetRows função dos CDaoRecordset objeto. O DAO GetRows função pode trabalhar em várias formas. Esta nota técnica contém apenas uma breve descrição GetRows sistema autônomo está fora do escopo desta anotação técnicos.
DAO GetRows pode funcionar em diversas maneiras.
Ele pode buscar vários registros e vários campos de dados de uma só vez.Isso permite que mais rápido acesso a dados com complicação de lidar com uma estrutura de dados grandes e os deslocamentos apropriados a cada campo e para cada registro de dados na estrutura.MFC não tirar proveito deste registro de 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 para um registro de dados.
DAO irá também "telefonar volta" para o chamador para colunas de comprimento variável para permitir que o chamador ao alocar memória.Esse segundo recurso tem o benefício de minimizar o número de cópias dos dados, bem sistema autônomo permitindo direto de armazenamento de dados para membros de uma classe (a CDaoRecordset classe derivada). Esse mecanismo segundo é o método que MFC usa para BIND a membros de dados em CDaoRecordset classes derivadas.
O que faz a rotina DFX personalizado
É evidente a partir dessa discussão a operação mais importante implementada em qualquer função DFX deve ser a capacidade de conjunto até as estruturas de dados necessários para chamar com êxito GetRows. Há uma série de outras operações que uma função DFX deve suportar também, mas nenhum sistema autônomo importantes ou complexo sistema autônomo preparar corretamente para o GetRows Chame.
O uso de DFX é descrito na documentação online.Basicamente, existem dois requisitos.Primeiro, os membros devem ser adicionados ao CDaoRecordset classe derivada para cada campo limite e parâmetro. Seguindo essa CDaoRecordset::DoFieldExchange deve ser substituído. Observe que o tipo de dados do membro é importante.Ele deve coincidir com os dados do campo no banco de dados ou pelo menos ser conversível para esse tipo.Por exemplo, um campo numérico no banco de dados, sistema autônomo um inteiro longo, sempre pode ser convertido em texto e limite a um CString membro, mas um campo de texto em um banco de dados pode ser convertido em uma representação numérica, sistema autônomo inteiro longo não necessariamente e limite a um membro de inteiro longo. DAO e o mecanismo de banco de dados Microsoft Jet são responsáveis pela conversão (em vez de MFC).
Detalhes de DFX_Text
sistema autônomo mencionado anteriormente, a melhor maneira de explicar sistema autônomo funciona o DFX é examinar um exemplo.Para essa finalidade passar pelos 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 cláusula ("Parameters <param name>, <param type> ... ;") exigido pelo Jet. Cada parâmetro é chamado e digitado (conforme especificado na telefonar 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
Constrói o SQL selecionar cláusula.Isso é bastante direta sistema autônomo o nome de coluna especificado pela telefonar DFX é simplesmente acrescentado ("SELECT <column name>, ...").BindField
As mais complexas das operações.sistema autônomo mencionado anteriormente esta é onde a estrutura de ligação do DAO usado por GetRows é conjunto backup. sistema autônomo você pode ver o código em DFX_Text sistema autônomo tipos de informações na estrutura de incluem o tipo usado () DAODAO_CHAR or DAO_WCHAR no caso de DFX_Text). Além disso, o tipo de associação usada é também configurar. De seção em um anteriorGetRows foi descrito resumidamente, mas foi suficiente para explicar que o tipo de vinculação usado pelo MFC sempre é direto endereço vinculando)DAOBINDING_DIRECT).Além para ligação de coluna de comprimento variável (como DFX_Text) ligação de retorno de chamada é usada para que a MFC pode controlar a alocação de memória e especificar um endereço do comprimento 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 vinculação de coluna (vinculação nome de coluna).BindParam
Esta é uma operação simples que chama SetParamValue com o valor do parâmetro especificado no seu membro de parâmetro.Correção
Preenche o NULO status para cada campo.SetFieldNull
Esta operação somente marca o status de cada campo sistema autônomo NULO e define o membro do valor da variável sistema autônomo PSEUDO_NULL.SetDirtyField
ChamaSetFieldValue para cada campo marcado como sujo.
Todas as operações restantes tratam apenas usando o cache de dados.O cache de dados é um buffer extra dos dados no registro corrente que é usado para fazer certas coisas mais simples.Por exemplo, "sujos" campos podem ser detectados automaticamente.sistema autônomo descrito na documentação online ele pode ser desativado completamente ou no nível do campo.A implementação de buffer usa um MAP.Esse MAP é utilizado para comparar alocadas dinamicamente cópias dos dados com o endereço do campo "limite" (ouCDaoRecordset membro de dados derivados).
AllocCache
Dinamicamente aloca o valor do campo em cache e o adiciona ao MAP.FreeCache
Exclui o valor do campo em cache e a remove do MAP.StoreField
O valor do campo corrente será copiado para o cache de dados.LoadField
O valor em cache do membro de campo será copiado.MarkForAddNew
Verifica se o valor do campo corrente é não-NULO e marcas-dirty se necessário.MarkForEdit
Compara o valor do campo corrente 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. |