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_Date 1 |
DFX_Date (COleDateTime basiert) |
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 inCRecordset
ODBC angeben, aber DB_OPEN_SNAPSHOT beim Angeben des Typs vonCDaoRecordset
.Der Standardrecordsettyp ist
CRecordset
Momentaufnahme, während der Standardrecordsettyp "CDaoRecordset
dynaset" 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 derCDaoRecordset
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. BeiCDaoRecordset
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 mehrereCDaoDatabase
Objekte auswirken, die denselben Arbeitsbereich (Transaktionsraum) gemeinsam nutzen.Die Ausnahmeklasse wurde geändert.
CDBExceptions
werden in den ODBC-Klassen undCDaoExceptions
in den DAO-Klassen ausgelöst.RFX_Date
verwendetCTime
undTIMESTAMP_STRUCT
Objekte währendDFX_Date
der VerwendungCOleDateTime
. DiesCOleDateTime
ist nahezu identisch mitCTime
, 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 dieCRecordset
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