TN055 : Migration des applications de classe de base de données ODBC MFC aux classes DAO MFC
[!REMARQUE]
Dans Visual C++ .NET, les Assistants et l'environnement Visual C++ ne prennent plus en charge DAO (même si les classes DAO sont incluses et que vous pouvez toujours les utiliser).Microsoft recommande l'utilisation Modèles OLE DB ou ODBC et MFC pour les nouveaux projets.Vous ne devez utiliser DAO que dans les applications existantes.
Vue d'ensemble
Dans de nombreux cas il peut être souhaitable de migrer les applications qui utilisent les classes de la base de données ODBC MFC aux classes de bases de données DAO MFC.Cette note technique détaillera la plupart des différences entre les classes DAO et ODBC MFC.Avec les différences à l'esprit, il ne doit pas être arrêté difficile de migrer les applications les classes ODBC aux classes MFC si vous le souhaitez.
Pourquoi migrez ODBC vers DAO ?
Il existe plusieurs raisons pour lesquelles vous pouvez migrer les applications des classes de base de données ODBC aux classes de base de données DAO, mais la décision n'est pas nécessairement simple ou évidente.Une opération à prendre en considération est que le moteur de base de données Microsoft Jet qui est utilisé par DAO peut indiquer toute source de données ODBC pour laquelle vous possédez un pilote ODBC.Il peut être plus efficace d'utiliser les classes de base de données ODBC ou d'appeler ODBC directement vous-même, mais le moteur de base de données Microsoft Jet peut lire les données ODBC.
Certains cas simples qui prennent la décision d'ODBC/DAO facile.Format par exemple, lorsque vous avez uniquement besoin de l'accès aux données dans un format que le moteur Microsoft Jet peut lire directement (format d'accès, excel, etc.) au choix évident consiste à utiliser les classes de base de données DAO.
Des cas plus complexes se posent lorsque vos données existe sur un serveur ou sur divers serveurs.Dans ce cas, la décision d'utiliser les classes de base de données ODBC ou des classes de base de données DAO est difficile.Si vous voulez effectuer des éléments tels que les jointures hétérogènes (données de jointure des serveurs dans plusieurs formats comme SQL Server et Oracle), le moteur de base de données Microsoft Jet exécutera la jointure pour vous plutôt que vous forcer pour effectuer le travail nécessaire si vous avez utilisé les classes de base de données ODBC ou l'ODBC appelé directement.Si vous utilisez un pilote ODBC qui prend en charge les curseurs de pilote, le meilleur choix peut être les classes de base de données ODBC.
Le tableau peut être compliquée, vous pouvez donc écrire du exemple de code pour tester les performances de différentes méthodes données vos besoins particuliers.Cette note technique suppose que vous avez pris la décision pour migrer des classes de base de données ODBC aux classes de base de données DAO.
Ressemblances entre les classes de base de données ODBC et les classes de base de données DAO MFC
La conception initiale des classes ODBC MFC était basé sur le modèle d'objet DAO qui a été utilisé dans Microsoft Access et Visual Basic.Cela signifie qu'il existe de nombreuses fonctionnalités communes des classes MFC ODBC et DAO, tous ne seront pas répertoriées dans cette section.En général les modèles de programmation sont identiques.
Pour mettre en surbrillance certaines ressemblances :
Les classes ODBC et DAO offrent des objets de base de données qui gèrent à l'aide de le système de gestion de base de données sous-jacent (SGBD).
Elles ont des objets recordset représentant un ensemble de résultats retournés de ce SGBD.
Les bases de données DAO et les objets recordset ont des membres presque identiques aux classes ODBC.
Avec les deux jeux de classes, le code pour récupérer des données est identique à l'exception de certaines modifications d'objet et de nom de membre.Les modifications sont requises, mais généralement le processus est un changement de nom simple en basculant les classes ODBC aux classes DAO.
Par exemple, dans les deux modèles la procédure pour récupérer des données consiste à créer et ouvrir un objet de base de données, créer et ouvrir un objet recordset, et accéder (déplacer) toutefois les données effectuant une opération.
Différences entre les classes MFC ODBC et DAO
Les classes DAO incluent plusieurs objets et un jeu plus complet de méthodes, mais cette section détaillera uniquement les différences dans les classes et les fonctionnalités similaires.
Les différences les plus évidentes entre les classes sont éventuellement les modifications de noms pour les classes similaires et les fonctions globales.La liste suivante affiche les modifications apportées aux noms des objets, des méthodes et des fonctions globales associés aux classes de base de données :
Classe ou fonction |
Équivalent dans les classes DAO 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 * |
DFX_Date (COleDateTimebasé sur) |
RFX_Text |
DFX_Text |
RFX_Binary |
DFX_Binary |
RFX_LongBinary |
DFX_LongBinary |
* La fonction d' RFX_Date est basé sur CTime et TIMESTAMP_STRUCT.
Les principales modifications à la fonctionnalité qui peut affecter votre application et requiert davantage les modifications de noms que simples sont répertoriés ci-dessous.
Les constantes et des macros utilisées pour spécifier des éléments tels que le type ouvert de recordset et les options d'ouverture de recordset ont été modifiées.
Avec les classes MFC ODBC nécessaire pour définir ces options via des macros ou les types énumérés.
Avec les classes DAO, DAO fournit la définition de ces options dans un fichier d'en-tête (DBDAOINT.H).Le type de recordset est un membre énuméré d' CRecordset, mais avec DAO il s'agit d'une constante à la place.Par exemple vous utiliseriez snapshot en spécifiant le type d' CRecordset dans ODBC mais DB_OPEN_SNAPSHOT en spécifiant le type d' CDaoRecordset.
Le type par défaut de recordset pour CRecordset est snapshot bien que le type par défaut de recordset pour CDaoRecordset est dynaset (voir la remarque ci-dessous pour un problème supplémentaire sur les instantanés de classe ODBC).
La classe ODBC CRecordset d'une option de créer un type avant seulement de recordset.Dans la classe d' CDaoRecordset , avant seulement n'est pas un type de recordset, mais plutôt une propriété (ou l'option) pour certains types de recordsets.
Un recordset ajout seul lorsque ouvrir un objet d' CRecordset signifiait que les données du recordset peuvent être lues et ajoutées.Avec l'objet d' CDaoRecordset , l'option réservée ajouter signifie simplement que les données du recordset ne peuvent être ajoutées (et non lecture).
Les fonctions membres de la transaction les classes ODBC sont membres d' CDatabase et agissent au niveau de la base de données.Dans les classes DAO, les fonctions membres des transactions sont membres d'une classe de niveau supérieur (CDaoWorkspace) et peuvent effectuer ainsi de plusieurs objets d' CDaoDatabase qui partagent le même espace de travail (espace de transaction).
La classe d'exception a été modifiée.CDBExceptions sont levées dans les classes et CDaoExceptions ODBC dans les classes DAO.
RFX_Date utilise CTime et des objets de TIMESTAMP_STRUCT pendant que DFX_Date utilise COleDateTime.COleDateTime est quasiment identique à CTime, mais est basé sur 8 un octet OLE DATE plutôt que 4 un octet time_t il peut donc maintenir une plage beaucoup plus grande des données.
[!REMARQUE]
Les instantanés DAO (CDaoRecordset) sont en lecture seule alors que les instantanés ODBC (CRecordset) peuvent être modifiables selon le pilote et l'utilisation de la bibliothèque de curseurs ODBC.Si vous utilisez la bibliothèque de curseurs, les instantanés d' CRecordset sont modifiables.Si vous utilisez les pilotes l'un des Microsoft du pilote de bureau pack 3,0 sans la bibliothèque de curseurs ODBC, les instantanés d' CRecordset sont en lecture seule.Si vous utilisez un autre pilote, consultez la documentation du pilote pour voir si les instantanés (STATIC_CURSORS) sont en lecture seule.