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_Date1 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 de CRecordset no ODBC, mas DB_OPEN_SNAPSHOT ao especificar o tipo de CDaoRecordset.

  • O tipo de conjunto de registros padrão para CRecordset é snapshot, enquanto o tipo de conjunto de registros padrão para CDaoRecordset é 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 classe CDaoRecordset, 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 objeto CDaoRecordset, 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 objetos CDaoDatabase 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 e CDaoExceptions nas classes DAO.

  • RFX_Date usa objetos CTime e TIMESTAMP_STRUCT enquanto DFX_Date usa COleDateTime. O COleDateTime é quase idêntico a CTime, 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âneos CRecordset 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âneos CRecordset 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