Microsoft Access
ist eine beliebte Desktop-Datenbank und ideal für Einsteiger, die ihre
ersten Erfahrungen mit den Datenbank-Funktionen von ColdFusion machen wollen.
Sie wird aber auch in vielen Webapplikationen als einfache und günstige
Datenbanklösung eingesetzt obwohl sie hier schnell die Grenzen von Access
zeigen. Instabilität und ungenügende Multiuser-Fähigkeiten machen
einem dann schnell das Leben schwer.
Trotzdem soll hier einmal Benutzung von MS-Access mit ColdFusion näher
beleuchtet werden.
Es gibt mehrere
Möglichkeiten, Access-Datenbanken anzusprechen, jede hat ihre ihre speziellen
Vor- und Nachteile:
ODBC
OLEDB
via CFOBJECT und ADO
ODBC
Der Zugriff auf Access über ODBC ist am leichtesten zu zu realisieren und
vor allem für Einsteiger zu empfehlen. Man muss lediglich einen System-DSN
definieren und kann dann diese Datenquelle direkt im CFQUERY-Tag benutzen.
Wie das ganze funktioniert und konfiguriert werden muss wurde bereits hier
ausführlich beschrieben.
Um ODBC nutzen zu können muss der ODBC-Treiber für Access installiert
sein, der z.B. in den Data Access Components enthalten ist. Hat man ColdFusion
auf seinem Rechner installiert, findet man im Start-Menu von ColdFusion (Start->Programm->ColdFusion)
den Menüpunkt Install Microsoft Data Access Components. Damit kann
man sich nachträglich die Datenbank-Treiber für OLEDB und ODBC auf
dem Rechner instalieren. Die aktuellste Version gibt natürlich bei Microsoft.
Man kann die Stabilität und Performance einer Access-Verbingung etwas verbessern
in dem man im ColdFusion-Administrator bei den ODBC-Settings (erweiterte Einstellungen)
den Punkt Limit Connections aktiviert und in das Eingabefeld Enable
the limit of simultaneous connections einen Wert von auf 5-7 setzt. Empfohlene
Wert für OBDC-Einstellungen sind Buffer Size = 0 und Page Timeout
= 600. Die Checkbox Maintain Database Connections sollte deaktiviert
werden.
Sollten sich bei der Benutzung von Access nach längerem Betrieb Funktionsstörungen
/ Zugriffsfehler einstellen liegt das meist an der unsauberen Speicherverwaltung
des ODBC-Treibers. Allaire empfiehlt in diesem Fall das File \cfusion\bin\cycle.bat
regelmässig auszuführen.
OLEDB
OLEDB ist eine auf Microsoft's COM/DCOM-Technologie basierendes Zugriffsmöglichkeit
für Datenbanken. Es besteht aus definierten OLE-APIs und soll einen standardisierten
Zugriff auf verschiedenen Daten ermöglichen. OLEDB ist relativ neu und
soll ODBC auf Windows-Systemen ersetzen.
Während ODBC entwickelt wurde um eine einheitliche Schnittstelle zu verschiedenen
SQL-Datenbanken zu haben, wurde OLEDB darauf ausgelegt, jegliche Art von Daten
mit einem einheitlichen Zugriffsweg zu versehen. So gibt es OLEDB-Provider (Treiber)
für ODBC, SQL-Server, Oracle, MS-Exchange, Microsoft Active Directory Service,
Microsoft Index Server, Jet, AS/400 u.s.w.
Das Einrichten einer OLEDB-Verbindung mit ColdFusion ist ähnlich einfach
wie die Benutzung von ODBC.
Zuerst solle man jedoch die schon erwähnten Data Access Components 2.1
(oder grösser) installieren. Dabei wird auch der OLEDB-Provider für
Access installiert. Um zu überprüfen, ob der OLEDB-Provider für
Access bereits auf dem Server installiert ist, kann man in der Registry (regedit.exe)
nach 'Microsoft.Jet.OLEDB' suchen. Wird ein Schlüssel gefunden, ist der
Provider installiert.
Um eine OLEDB-Datenquelle einzustellen öffnet man im ColdFusion-Administrator
den Datasources-Link OLEDB. Im Feld Data Source Name gibt man
den gewünschen Namen ein, unter dem die Datenquelle dann in den Templates
ansprechbar ist. Aus der Dropdown-Box wählt man ,unabhängig von von
der installierten MDAC-Version, Microsoft.Jet.OLEDB.3.51 und betätigt
den Add-Button. Das darauf folgenden Formular (Create OLEDB Interface Data
Source) muss nun mit den korrekten Einstellungen gefüllt werden. Im
Providerfeld trägt man den gewünschten Provider ein, also z.B. Microsoft.Jet.OLEDB.3.51
(Access97) oder Microsoft.Jet.OLEDB.4.0 (Access200) je nach installierter
MDAC-Version.
Im Feld Database File trägt man den kompletten Pfad der Access-Datei
ein, z.b. c:\cfusion\database\foo.mdb.
Dann klickt man auf den Button CF Settings >> um zur erweiterten Eingabemaske
zu gelagen. Dort gibt man als Username admin an. Das Password-Feld bleibt
leer. Mit dem Button create wird die Datenquelle erzeugt. Der Status
sollte danach auf verfied stehen, ansonst wurde die Datenquelle nicht
korrekt eingerichtet.
OLEDB ist um einiges schneller und stabiler als ODBC und man sollte nach Möglichkeit
diese Methode benutzen, wenn beide zur Wahl stehen.
CFOBJECT
und ADO
Die ActiveX Data Objects ist ein Mechanismus, mit dem man Zugriff auf
verschiedene Typen von Daten erhält. Im allgemeinen dürfte es sich
bei diesen Daten aber um relationale Datenbanken handeln, die von einer Clientapplication
(in diesem Fall der ColdFusion-Server) über eine definierte Schnittstelle
angesprochen werden sollen. Im Prinzip handelt es sich bei ADO um ein Layer
über OLEDB. Es versorgt die Applikation mit einer einheitlichen Ansammlung
von Methoden und Eigenschaften um auf verschiedenen Daten zuzugreifen. Dabei
kann es sich bei diesen Daten um normale ODBC-Quellen (Provider=MSDASQL)
handeln aber um OLEDB-Provider wie z.B. Microsoft.Jet.OLEDB.4.0 für
Access oder MSDAORA für Oracle. ADO bietet für den Datenbankzugriff
ein hierarisches System von Objekten (mit Methoden und Eigenschaften) die dem
ColdFusion-Programmierer viele Möglichkeiten eröffnen, die er mit
dem normalen Zugriff mittels CFQUERY sonst nicht hat. So kann man z.B.
Datenbankverbindungen zur Laufzeit auf- und abbauen, genauer Informationen über
die Datenbank erlangen oder Verbindungen zu einer Access-DB ohne vorher erstellten
DSN aufbauen. Letzters soll in einem kurzen Beispielcode gezeigt werden. Wer
allerdings mehr über ADO und dessen Objekte wissen will, sollte sich ein
gutes Buch zu diesem Thema besorgen.
Zum Zugriff auf
ADO unter ColdFusion benutzt man das CFOBJECT-Tag, mit dem man ActiveX
Data Objects instanziiren kann. Um den nachfolgenden Code zu verstehen muss
hier kurz auf die im Code benutzte Objektstruktur eingegenagen werden.
Zuerst wird ein Connection-Objekt erzeugt, welches eine Verbindung zur
Datenbank repräsentiert. Damit wird ein Recordset-Objekt erzeugt,
dass die Ergebnismenge einer SQL-Abfrage enthält. Das RecordSet
besteht aus einer Ansammlung von Field-Objekten die jeweils eine Reihe
der Ergebnissmege repräsentieren. Das Field-Objekt enthält
nun eine Methode namens item(), mit der man auf die jeweilige Datenzelle
und mittels dem Property value auf deren Inhalt zugreifen kann. Das ganze
sieht dann als ColdFusion-Script so aus:
<!----pfad zur laufzeit festlegen-------> <cfset DBPath="C:\CFUSION\Database\demo.mdb"> <!----DSN dynamisch zusammensetzen-----> <cfset dsn="DRIVER={Microsoft AccessDriver (*.mdb)};DBQ=#DBPath#;"> <cfset dsn=dsn & "FIL=MSAccess;MaxBufferSize=512;PageTimeout=5;UID=sa;pw="> <!----connection-objekt erzeugen-----> <cfobject type="COM" name="myCon" class="ADODB.Connection" action="CREATE"> <!---mal den benutzen provider ausgeben---> <cfoutput> #myCon.Provider# <br> </cfoutput> <!----verbindung zur datenbank herstellen -----> <cfset dummy=myCon.open("#dsn#","","0","0")> <!---recordset erzeugen -----------> <cfset rs=mycon.Execute("select * from user","","0")> <!---loop ueber das recordset-------> <cfloop condition="not #rs.eof#"> <!---fieldobjekt mit der aktuellen reihe des recordsets erzeugen---> <cfset oF=rs.Fields> <!---item-objekt erzeugen---> <cfset it=oF.Item("vorname")> <!---Wert aus db ausgeben---> <cfoutput> #it.value#<br> </cfoutput> <!---db-cursor auf naechste datenreihe bewegen----> <cfset dummy=rs.moveNext()> </cfloop> <!---verbindung zur db schliessen----> <cfset dummy=myCon.close()>
Mit ADO hat man jedoch viel mehr Möglichkeiten und ist nicht nur auf SQL-Statments zur Datengewinnung angewiesen. Man kann z.B. mit diesem Code eine komplette Kopie einer ganzen Tabelle in ein Recordset holen:
<!-----Tabelle user in das recordset laden---> <cfset rs=mycon.Execute("user","","2")>
Wem also die normalen ColdFusion-Funktionen für den Datenbankzugriff nicht reichen, sollte sich näher mit ADO beschäftigen.
Links zum Thema: