Hi,
ich hab es zwar bisher nur mit Access 2000 realisiert, aber dürfte das selbe System bzw. Problem sein.
Es gibt zum einen die Möglichkeit das über ODBC zu lösen, oder aber eine direkte Verbindung über eine DAO bzw ADO. Zu ODBC Verbindungen findet man hier im Forum wohl genug. Ich stell hier jetzt kurz die DAO Variante vor, die ich gewählt habe um unabhängig von ODBC-Treibern zu sein.
Vorbereitend:
- Um das Projekt umsetzen zu können musst du MFC in einer Statischen Bibliothek verwenden.
- Kopiere die Dateien "DAOCORE.CPP" und "DAOIMPL.H" in den Projektordner
- Füge dem Projekt die Dateien "DAOCORE.CPP" und "DAOIMPL.H" aus dem Projektordner hinzu.
Includes:
Für das Zugreifen auf Access über Dao musst du folgende Dateien includen:
<afxwin.h>
<afxdao.h>
"daoimpl.h"
DAOCORE.CPP
Da die neueren Versionen von Access auf eine MFC zugreifen wollen sie es garnicht gibt (Version 6.01) muss man hier ein wenig tricksen. Warum und wieso dieser Bug besteht kann ich jetzt nicht sagen. auf jeden Fall wirst du die gewöhnliche DAO -Schnittstelle nicht in Verbindung mit Access 2003 verwenden können, da die MFC Versionen inkompatibel scheinen.
Man könnte nun natürlich auch die DAOCORE.CPP im System ändern, aber es ist vorzuziehen es innerhalb des Projektes zutun. Die MFC an sich sollte unberührt bleiben, deswegen am Anfang das Kopieren der Datei in das eigene Projekt.
Direkt unterhalb des includes sind dort dann folgende Zeilen einzufügen:
Code:
#define _countof(array) \
(sizeof(array)/sizeof(array[0]))
#undef _MFC_VER
#define _MFC_VER 0x0601
Hier wird nun die "Standard" MFC Version Definition quasi gelöscht und anschließend neu gesetzt, auf 6.01.
Mehr ist hier auch nicht zutun, die DAO Schnittstelle ist jetzt korrekt präpariert.
Umsetzung
Nachdem die Vorarbeiten nun geleistet sind, ist es jetzt möglich über DAO-Objekte auf eine Access-Datenbank zuzugreifen. Ich stell jetzt noch kurz eine Beispielhafte simple Verbindung vor mit Datenzugriff.
1. Verbindung aufbauen
Um die Verbindung zu der Datenbank aufzubauen muss zu aller erst ein Objekt erstellt werden das den Zugriff auf die Datenbank überhaupt ermöglicht. In diesem Falle ist das ein Objekt vom Typ CDaoDatabase. Über die Open-Methode kann unserem Objekt dann eine Datenbank zugewiesen werden:
Code:
CDaoDatabase myDatabase;
try {
myDatabase.Open("C:\\meineDatenbank.mdb");
}catch (CDaoException* e){
AfXMessageBox(e->m_pErrorInfo->m_strDescription);
e->Delete();
}
Über die Fehlerroutine werden direkt eventuelle Fehler beim Zugriff abgefangen. Jetzt haben wir über "myDatabase" die Möglichkeit auf die Datenbank zuzugreifen.
2. Abfragen
Hierfür benötigen wir zB ein Objekt der Klasse CDaoRecordSet. Über das Recordset ist es möglich Abfragen abzusetzen und das Ergebnis im Folgenden zu bearbeiten.
Code:
CDaoRecordSet myRecordSet(&myDatabase)
//CDaoRecordSet myRecordSet(); <<<Hinweis siehe unten!
VARIANT varResult;
myRecordSet.Open(dbOpenDynaset, "Select count(*) from tblTest";
myRecordSet.MoveFirst();
while (!myRecordSet.IsEOF()){
varResult = myRecordSet.GetFieldValue(0);
if (varResult.lVal == 0)
AfXMessageBox("Kein Datensatz vorhanden!);
myRecordSet.MoveNext();
}
myRecordSet.close();
In dem Code-Beispiel wird ein einfaches Select-Statement auf die Datenbank mit Hilfe des RecordSets abgesetzt. Die While-Schleife geht anschließend solange durch das erhaltene Set bis dessen Ende erreicht ist. In diesem Fall also nur einmal. Da die Funktion GetFieldValue() einen Wert vom Typ COleVariant zurückgibt speichern wir den Wert in einem VARIANT zwischen, um ihn anschließend auszulesen. Am Ende der Schleife gehen wir noch einen Satz weiter um keine Endlosschleife zu erhalten.
Hinweis
Ich hatte bei Visual Studio 6 ein kleines Problem mit dem Recordset. Die Autovervollständigung funktionierte nur solange ich das Objekt nicht zugewiesen hatte. Sobald ich beim Deklarieren der Variable die Datenbank mitgegeben hatte musste ich quasi blind arbeiten. Es wäre ratsam die Datanbank erst einzufügen nachdem der Rest der Funktion steht.
3. Update/Insert etc.
Der Vollständigkeit halber hier noch kurz ein Beispiel wie man Befehle absetzen kann die kein RecordSet als Ergebnis zurückliefern. Dafür brauchen wir lediglich das bereits bekannte CDaoDatabase Objekt:
Code:
myDatabase.Execute("update tblTest set tstNummer = 0")
Das ist es auch schon. Denke dazu muss ich nichts weiter schreiben.
Auch zu den oben aufgeführten Funktionen sollte natürlich eine Fehlerbehandlung hinzugefügt werden, die der Ersten gleicht.
Am Ende des Programms sollte die Verbindung zur Datenbank noch mit einem "myDatabase.Close();" geschlossen werden.
Ich hoffe das ich nichts vergessen habe und alles verständlich erklärt habe (Ist ja schon fast ein Tutorial geworden).
Bei Fragen einfach posten.
Gruß