TN055: Migrieren von MFC ODBC-Datenbankklassen-Anwendungen zu MFC DAO-Klassen

Hinweis

DAO wird mit Access-Datenbanken verwendet und wird über Office 2013 unterstützt. DAO 3.6 ist die letzte Version und gilt als veraltet. Die Visual C++-Umgebung und -Assistenten unterstützen DAO nicht (obwohl die DAO-Klassen enthalten sind und Sie sie weiterhin verwenden können). Microsoft empfiehlt, OLE DB-Vorlagen oder ODBC- und MFC für neue Projekte zu verwenden. Sie sollten DAO nur in Standard vorhandenen Anwendungen verwenden.

Überblick

In vielen Fällen kann es wünschenswert sein, Anwendungen zu migrieren, die die ODBC-Datenbankklassen von MFC zu den DAO-Datenbankklassen von MFC verwenden. Dieser technische Hinweis enthält die meisten Unterschiede zwischen den MFC ODBC- und DAO-Klassen. Unter Berücksichtigung der Unterschiede sollte es bei Bedarf nicht übermäßig schwierig sein, Anwendungen aus den ODBC-Klassen zu den MFC-Klassen zu migrieren.

Gründe für die Migration von ODBC zu DAO

Es gibt eine Reihe von Gründen, warum Sie Anwendungen aus den ODBC-Datenbankklassen zu den DAO-Datenbankklassen migrieren möchten, aber die Entscheidung ist nicht notwendigerweise einfach oder offensichtlich. Beachten Sie, dass das von DAO verwendete Microsoft Jet-Datenbankmodul jede ODBC-Datenquelle lesen kann, für die Sie über einen ODBC-Treiber verfügen. Es kann effizienter sein, die ODBC-Datenbankklassen zu verwenden oder ODBC direkt selbst aufzurufen, aber das Microsoft Jet-Datenbankmodul kann ODBC-Daten lesen.

Einige einfache Fälle, die die ODBC/DAO-Entscheidung vereinfachen. Wenn Sie beispielsweise nur Zugriff auf Daten in einem Format benötigen, das das Microsoft Jet-Modul direkt lesen kann (Access-Format, Excel-Format usw.), besteht die offensichtliche Wahl darin, die DAO-Datenbankklassen zu verwenden.

Komplexere Fälle treten auf, wenn Ihre Daten auf einem Server oder auf einer Vielzahl unterschiedlicher Server vorhanden sind. In diesem Fall ist die Entscheidung, die ODBC-Datenbankklassen oder die DAO-Datenbankklassen zu verwenden, schwierig. Wenn Sie Vorgänge wie heterogene Verknüpfungen (Verknüpfungsdaten von Servern in mehreren Formaten wie SQL Server und Oracle) ausführen möchten, führt das Microsoft Jet-Datenbankmodul die Verknüpfung für Sie aus, anstatt sie zu zwingen, die erforderlichen Aufgaben auszuführen, wenn Sie die ODBC-Datenbankklassen verwendet oder ODBC direkt aufgerufen haben. Wenn Sie einen ODBC-Treiber verwenden, der Treibercursor unterstützt, ist die beste Wahl möglicherweise die ODBC-Datenbankklassen.

Die Auswahl kann kompliziert sein, daher können Sie einige Beispielcode schreiben, um die Leistung verschiedener Methoden zu testen, die Ihren speziellen Anforderungen entsprechen. In diesem technischen Hinweis wird davon ausgegangen, dass Sie die Entscheidung getroffen haben, von den ODBC-Datenbankklassen zu den DAO-Datenbankklassen zu migrieren.

Ähnlichkeiten zwischen ODBC-Datenbankklassen und MFC DAO-Datenbankklassen

Das ursprüngliche Design der MFC ODBC-Klassen basiert auf dem DAO-Objektmodell, das in Microsoft Access und Microsoft Visual Basic verwendet wurde. Dies bedeutet, dass es viele allgemeine Features der ODBC- und DAO MFC-Klassen gibt, die nicht alle in diesem Abschnitt aufgeführt werden. Im Allgemeinen sind die Programmiermodelle identisch.

So heben Sie einige Ähnlichkeiten hervor:

  • Sowohl die ODBC- als auch die DAO-Klasse verfügen über Datenbankobjekte, die mithilfe des zugrunde liegenden Datenbankverwaltungssystems (DBMS) verwaltet werden.

  • Beide verfügen über Recordsetobjekte, die eine Reihe von Ergebnissen darstellen, die von diesem DBMS zurückgegeben werden.

  • Die DAO-Datenbank- und Recordset-Objekte weisen Elemente nahezu identisch mit den ODBC-Klassen auf.

  • Bei beiden Klassensätzen ist der code zum Abrufen von Daten identisch, mit Ausnahme einiger Objekt- und Elementnamenänderungen. Änderungen sind erforderlich, aber in der Regel ist der Prozess eine einfache Namensänderung beim Wechsel von den ODBC-Klassen zu DAO-Klassen.

In beiden Modellen besteht die Prozedur zum Abrufen von Daten beispielsweise darin, ein Datenbankobjekt zu erstellen und zu öffnen, ein Recordsetobjekt zu erstellen und zu öffnen und zu navigieren (zu verschieben), obwohl die Daten einen Vorgang ausführen.

Unterschiede zwischen ODBC- und DAO MFC-Klassen

Die DAO-Klassen enthalten weitere Objekte und einen umfangreicheren Satz von Methoden. In diesem Abschnitt werden jedoch nur die Unterschiede in ähnlichen Klassen und Funktionen beschrieben.

Wahrscheinlich sind die offensichtlichsten Unterschiede zwischen den Klassen die Namensänderungen für ähnliche Klassen und globale Funktionen. In der folgenden Liste sind die Namensänderungen der Objekte, Methoden und globalen Funktionen aufgeführt, die den Datenbankklassen zugeordnet sind:

Klasse oder Funktion Äquivalent in MFC DAO-Klassen
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 (COleDateTimebasiert)
RFX_Text DFX_Text
RFX_Binary DFX_Binary
RFX_LongBinary DFX_LongBinary

1 Die RFX_Date Funktion basiert auf CTime und TIMESTAMP_STRUCT.

Die wichtigsten Änderungen an Funktionen, die sich auf Ihre Anwendung auswirken können und mehr als einfache Namensänderungen erfordern, sind unten aufgeführt.

  • Die Konstanten und Makros, die verwendet werden, um Elemente wie den geöffneten Recordset-Typ und die geöffneten Optionen des Recordset-Objekts anzugeben, wurden geändert.

    Mit den ODBC-Klassen muss MFC diese Optionen über Makros oder Aufzählungstypen definieren.

    Mit den DAO-Klassen stellt DAO die Definition dieser Optionen in einer Headerdatei (DBDAOINT) bereit. H). Daher ist der Recordset-Typ ein aufgezähltes Element von CRecordset, aber mit DAO ist es stattdessen eine Konstante. Sie würden z. B. Momentaufnahme verwenden, wenn Sie den Typ in CRecordset ODBC angeben, aber DB_OPEN_SNAPSHOT beim Angeben des Typs von CDaoRecordset .

  • Der Standardrecordsettyp ist CRecordset Momentaufnahme, während der Standardrecordsettyp "CDaoRecordsetdynaset" ist (weitere Informationen zu ODBC-Klassen-Momentaufnahme s finden Sie unten im Folgenden.

  • Die ODBC-Klasse CRecordset verfügt über eine Option zum Erstellen eines Vorwärtsrecordsettyps. In der CDaoRecordset Klasse ist forward-only kein Recordsettyp, sondern eine Eigenschaft (oder Option) bestimmter Recordsetstypen.

  • Ein Nur-Anfüge-Recordset beim Öffnen eines CRecordset Objekts bedeutete, dass die Daten des Recordsets gelesen und angefügt werden konnten. Bei CDaoRecordset Einem Objekt bedeutet die Option "Nur anfügen" buchstäblich, dass die Daten des Recordsets nur angefügt werden können (und nicht gelesen).

  • Die Transaktionsmemberfunktionen der ODBC-Klassen sind Elemente CDatabase und handeln auf Datenbankebene. In den DAO-Klassen sind die Transaktionsmemberfunktionen Mitglieder einer höheren Klasse (CDaoWorkspace) und können sich daher auf mehrere CDaoDatabase Objekte auswirken, die denselben Arbeitsbereich (Transaktionsraum) gemeinsam nutzen.

  • Die Ausnahmeklasse wurde geändert. CDBExceptions werden in den ODBC-Klassen und CDaoExceptions in den DAO-Klassen ausgelöst.

  • RFX_Date verwendet CTime und TIMESTAMP_STRUCT Objekte während DFX_Date der Verwendung COleDateTime. Dies COleDateTime ist nahezu identisch mit CTime, basiert jedoch auf einem 8-Byte-OLE-DATUM und nicht auf einem 4-Byte-time_t, sodass sie einen viel größeren Datenbereich enthalten kann.

    Hinweis

    DAO (CDaoRecordset) Momentaufnahme sind schreibgeschützt, während ODBC(CRecordset)-Momentaufnahme je nach Treiber und Verwendung der ODBC-Cursorbibliothek aktualisiert werden können. Wenn Sie die Cursorbibliothek verwenden, CRecordset können Momentaufnahme aktualisiert werden. Wenn Sie einen der Microsoft-Treiber aus Desktop Driver Pack 3.0 ohne die ODBC-Cursorbibliothek verwenden, sind die CRecordset Momentaufnahme schreibgeschützt. Wenn Sie einen anderen Treiber verwenden, überprüfen Sie die Dokumentation des Treibers, um festzustellen, ob Momentaufnahme (STATIC_CURSORS) schreibgeschützt sind.

Siehe auch

Technische Hinweise – nach Nummern geordnet
Technische Hinweise – nach Kategorien geordnet