TN055: migrando aplicativos de classe de banco de dados ODBC MFC para classes DAO MFC
Observação
O DAO é usado com bancos de dados do Access e tem suporte do Office 2013. O DAO 3.6 é a versão final e é considerado obsoleto. O ambiente e os assistentes do Visual C++ não dão suporte a DAO (embora as classes DAO estejam incluídas e você ainda possa usá-las). A Microsoft recomenda que você use modelos OLE DB ou ODBC e MFC para novos projetos. Use DAO apenas na manutenção de aplicativos existentes.
Visão geral
Em muitas situações, pode ser desejável migrar aplicativos que usam as classes de banco de dados ODBC do MFC para as classes de banco de dados DAO do MFC. Esta nota técnica detalhará a maioria das diferenças entre as classes ODBC e DAO do MFC. Com as diferenças em mente, não deve ser muito difícil migrar aplicativos das classes ODBC para as classes MFC, se desejado.
Por que migrar de ODBC para DAO
Há vários motivos pelos quais você pode querer migrar aplicativos das Classes de Banco de Dados ODBC para as Classes de Banco de Dados DAO, mas a decisão não é necessariamente simples ou óbvia. É importante ter em mente que o mecanismo de banco de dados do Microsoft Jet usado pelo DAO pode ler qualquer fonte de dados ODBC para a qual você tenha um driver ODBC. Pode ser mais eficiente usar as Classes de Banco de Dados ODBC ou chamar o próprio ODBC diretamente, mas o mecanismo de banco de dados do Microsoft Jet pode ler dados ODBC.
Alguns casos simples que facilitam a decisão quanto a ODBC/DAO. Por exemplo, quando você só precisa acessar dados em um formato que o mecanismo do Microsoft Jet possa ler diretamente (formato Acess, formato do Excel e assim por diante) a opção óbvia é usar as Classes de Banco de Dados DAO.
Casos mais complexos surgem quando seus dados existem em um servidor ou em uma variedade de servidores diferentes. Nesse caso, a decisão de usar as classes do Banco de Dados ODBC ou as classes do Banco de Dados DAO é difícil. Se você quiser fazer coisas como junções heterogêneas (unir dados de servidores em vários formatos, como SQL Server e Oracle), o mecanismo de banco de dados do Microsoft Jet executará a junção para você em vez de forçá-lo a fazer o trabalho necessário caso você tenha usado as Classes de Banco de Dados ODBC ou chamado diretamente o ODBC. Se você estiver usando um driver ODBC que dá suporte a cursores de driver, sua melhor opção pode ser as classes de Banco de Dados ODBC.
A escolha pode ser complicada, portanto, talvez você queira escrever algum código de exemplo para testar o desempenho de vários métodos considerando suas necessidades especiais. Esta nota técnica pressupõe que você tenha tomado a decisão de migrar das Classes de Banco de Dados ODBC para as classes do Banco de Dados DAO.
Semelhanças entre classes de banco de dados ODBC e classes de banco de dados DAO do MFC
O design original das classes ODBC do MFC foi baseado no modelo de objeto DAO que está em uso no Microsoft Access e no Microsoft Visual Basic. Isso significa que há muitos recursos comuns das classes ODBC e DAO do MFC, mas nem todas serão listadas nesta seção. Em geral, os modelos de programação são os mesmos.
Para destacar algumas semelhanças:
As classes ODBC e DAO têm objetos de banco de dados que gerenciam usando o DBMS (sistema de gerenciamento de banco de dados) subjacente.
Ambas têm objetos de conjunto de registros que representam um conjunto de resultados retornados desse DBMS.
O banco de dados DAO e os objetos do conjunto de registros têm membros quase idênticos às classes ODBC.
Com os dois conjuntos de classes, o código para recuperar dados é idêntico, exceto por algumas alterações de nome de objeto e membro. As alterações serão necessárias, mas geralmente o processo é uma simples alteração de nome ao alternar das classes ODBC para classes DAO.
Por exemplo, em ambos os modelos, o procedimento para recuperar dados é criar e abrir um objeto de banco de dados, criar e abrir um objeto de conjunto de registros e navegar (mover) pelos dados que executam alguma operação.
Diferenças entre classes MFC ODBC e DAO
As classes DAO incluem mais objetos e um conjunto mais avançado de métodos, mas esta seção só detalhará as diferenças em classes e funcionalidades semelhantes.
Provavelmente as diferenças mais óbvias entre as classes são as alterações de nome para classes semelhantes e funções globais. A lista a seguir mostra as alterações de nome dos objetos, métodos e funções globais associados às classes de banco de dados:
Classe ou função | Equivalente em classes DAO do MFC |
---|---|
CDatabase |
CDaoDatabase |
CDatabase::ExecuteSQL |
CDaoDatabase::Execute |
CRecordset |
CDaoRecordset |
CRecordset::GetDefaultConnect |
CDaoRecordset::GetDefaultDBName |
CFieldExchange |
CDaoFieldExchange |
RFX_Bool |
DFX_Bool |
RFX_Byte |
DFX_Byte |
RFX_Int |
DFX_Short |
RFX_Long |
DFX_Long |
DFX_Currency |
|
RFX_Single |
DFX_Single |
RFX_Double |
DFX_Double |
RFX_Date 1 |
DFX_Date (baseado em COleDateTime ) |
RFX_Text |
DFX_Text |
RFX_Binary |
DFX_Binary |
RFX_LongBinary |
DFX_LongBinary |
1 A função RFX_Date
é baseada em CTime
e TIMESTAMP_STRUCT
.
As principais alterações na funcionalidade que podem afetar seu aplicativo e exigem mais do que simples alterações de nome estão listadas abaixo.
As constantes e macros usadas para especificar itens como o tipo aberto do conjunto de registros e as opções abertas do conjunto de registros foram alteradas.
Com as classes ODBC, o MFC precisava definir essas opções por meio de macros ou tipos enumerados.
Com as classes DAO, o DAO fornece a definição dessas opções em um arquivo de cabeçalho (DBDAOINT.H). Assim, o tipo de conjunto de registros é um membro enumerado de
CRecordset
, mas com DAO é uma constante. Por exemplo, você usaria snapshot ao especificar o tipo deCRecordset
no ODBC, mas DB_OPEN_SNAPSHOT ao especificar o tipo deCDaoRecordset
.O tipo de conjunto de registros padrão para
CRecordset
é snapshot, enquanto o tipo de conjunto de registros padrão paraCDaoRecordset
é dynaset (consulte a Observação abaixo para ver um problema adicional sobre instantâneos de classe ODBC).A classe ODBC
CRecordset
tem uma opção para criar um tipo de conjunto de registros somente de encaminhamento. Na classeCDaoRecordset
, somente de encaminhamento não é um tipo de conjunto de registros, mas sim uma propriedade (ou opção) de determinados tipos de conjuntos de registros.Um conjunto de registros somente de acréscimo ao abrir um objeto
CRecordset
significava que os dados do conjunto de registros poderiam ser lidos e acrescentados. Com o objetoCDaoRecordset
, a opção somente de acréscimo significa literalmente que os dados do conjunto de registros só podem ser acrescentados (e não lidos).As funções membro de transação das classes ODBC são membros de
CDatabase
e atuam no nível do banco de dados. Nas classes DAO, as funções membro de transação são membros de uma classe de nível superior (CDaoWorkspace
) e, portanto, podem afetar vários objetosCDaoDatabase
que compartilham o mesmo workspace (espaço de transação).A classe de exceção foi alterada.
CDBExceptions
são lançados nas classes ODBC eCDaoExceptions
nas classes DAO.RFX_Date
usa objetosCTime
eTIMESTAMP_STRUCT
enquantoDFX_Date
usaCOleDateTime
. OCOleDateTime
é quase idêntico aCTime
, mas é baseado em um OLE DATE de 8 bytes em vez de um time_t de 4 bytes para que possa conter um intervalo muito maior de dados.Observação
Instantâneos DAO (
CDaoRecordset
) são somente leitura, enquanto instantâneos ODBC (CRecordset
) podem ser atualizados dependendo do driver e do uso da biblioteca de cursores ODBC. Se você estiver usando a biblioteca de cursores, os instantâneosCRecordset
poderão ser atualizados. Se você estiver usando qualquer um dos drivers da Microsoft do Desktop Driver Pack 3.0 sem a biblioteca de cursores ODBC, os instantâneosCRecordset
serão somente leitura. Se você estiver usando outro driver, verifique a documentação do driver para ver se os instantâneos (STATIC_CURSORS
) são somente leitura.
Confira também
Observações técnicas por número
Observações técnicas por categoria