Session D-ADO

ADO - ActiveX Database Objects

Norbert Abb
Wizards & Builders GmbH


Einleitung

ADO (ActiveX Data Objects) ist das neue Kürzel von Microsoft für ‚Universal Data Access‘ also im Prinzip jede Art von Datenzugriff. Mit ADO ist es möglich auf die unterschiedlichsten Arten von Datenquellen zuzugreifen, auch nicht relationale Daten stehen mit ADO.

Kürzel, Kürzel, Kürzel

ADO und die ‚Anderen‘

ADO ist ein relativ neues Kürzel von Microsoft. Wie ist nun ADO mit DAO, RDO, ODBC, OLE DB usw. zu vergleichen oder verwandt?

Nun ADO ist eine Schicht über den anderen ‚Data Providern‘

Was die anderen Zugriffsarten DAO und RDO angeht: Die sind veraltet und können ad acta gelegt werden. DAO war eine Möglichkeit auf Jet (MS Access Datenbanken) zuzugreifen und hauptsächlich für VB gedacht. RDO arbeitet auf einer Ebene mit OLE DB zusammen. OLE DB ist der low level Zugriff auf Daten und wird eventuell auch von C++ Programmierern weiter genutzt werden. Der Zugriff auf Daten via ADO ist aber die erklärte Methode von Microsoft für die Zukunft.

MDAC, RDS

MDAC (Microsoft Data Access Components) ist einfach nur ein Toolkit das alle möglichen Treiber für die neuen Technologien enthält (ADO, OLE DB, ODBC). Das Toolkit kann von der MS Web Site geladen werden und mit allen Tools des Visual Studios verwendet werden.

RDS bedeutet Remote Data Sercvice und ist ein Feature von ADO für den Datenzugriff via Web.

Infos

Informationen zu all diesen Techniken und Kürzeln findet man unter: http://www.microsoft.com/data

Das ADO Objekt Modell

Da es sich bei ADO um eine ActiveX Architektur handelt, benötigt man als Dokumentation das ADO Objekt Modell um sinnvoll arbeiten zu können (s.a. Vorträge aus den Vorjahren)

So stellt sich die Hierarchie der ADO Objekte dar. Wenn man sich das Zusammenspiel der verschiedenen Objekte verdeutlichen möchte, so ist folgende Grafik besser geeignet:

Man sieht hier insbesondere, daß es verschiedene Möglichkeiten gibt Recordsets zu erzeugen, aber das wird später erläutert.

Enscheidend ist, daß diese ADO Objekte alle entweder durch Andere erzeugt werden (z.B. Recordset durch Command.Execute) oder durch einen CreateObject Befehl in VFP erzeugt werden können und dann wie andere Automations Objekte manipuliert werden können.

Connection

Das ‚Connection‘ Objekt stellt die Verbindung zur Datenquelle her. Dieses Objekt dient dazu die Verbindungsparameter zu verwalten, ähnlich wie die ‚Remote Connection‘ im DBC von VFP. Auch hier kann man Verbindungen über die definierten DSNs aufbauen. Das heißt die Verbindung kann über die ODBC Datenquellen laufen. Dies ist die Art, die am bekanntesten sein dürfte. Auch die Transaktionsverwaltung wird über das Connection Objekt geregelt.

Verbindungen können auch ohne DSNs erstellt werden allerdings muß dazu der ‚Provider‘ der Datenquelle bekannt sein. Am einfachsten findet man den Connection String heraus wenn beispielhaft eine solche Quelle als DSN definiert und dann bei aufgebauter Verbindung den ConnectionString der Verbindung sich anzeigen läßt.

Errors

Die Errors Collection dient der Fehlerbehandlung. Sie besteht aus Error Objekten. In diesen Objekten stehen Informationen (Klartext, originale Fehlernummer, usw. zu den aufgetretenen Fehlern).

Command

Das Command Objekt bietet die Möglichkeit über eine (aktive) Connection Befehle an die verbundene Datenquelle abzusetzen. Welche Befehle möglich und sinnvoll sind hängt von der Art der Datenquelle und dem verwendeten Treiber ab. Diesem Command Objekt können über die Parameters Collection Parameter mitgegeben werden. Das Ergebnis der Execute Methode dieses Command Objektes kann dann ein RecordSet sein.

RecordSet

Das RecordSet Objekt enthält die eigentlichen Daten. Die Daten sind in der Fields Collection dieses RecordSet Objektes enthalten. Das RecordSet Objekt steht jeweils auf einem Record (Datenasatz), der bearbeitet werden kann. Je nach Art dieses Recordsets kann mit diesem Datensatz gearbeitet werden. Auf dem RecordSet finden die eigentlichen Datenoperationen statt (Udate, Delete, Insert). Aber auch das ‚Bewegen‘ über die Daten (First, Next, Last, Previous) findet über Methoden des RecordSets statt. Das RecordSet Objekt mit der Fields Collection wird noch genauer betrachtet.

Übrigens steckt hinter dem RecordSet Objekt ein FoxPro Cursor! Dies sei hier aber nur als Tatsache vorgestellt direkt nutzen kann man diese Information nicht.

Die Nutzung des Command Objektes

Das Command Objekt kann zum einen dazu benutzt werden um parametrisierte Abfragen abzusetzen:

#Define adChar                  129

#Define adparamInput            1

 

parameter = "U%"

oConnection.Open("tastrade")

oCommand.activeconnection = oConnection

oCommand.commandtext = "Select * From customer Where country Like ?"

oParameter = oCommand.CreateParameter("country",adChar,;

  adParamInput,Len(parameter),parameter)

ocommand.Parameters.Append(oParameter)

oRecordSet = ocommand.execute()

Zum anderen können über das Command Objekt auch DDL (Data Definition Language) Befehle abgesetzt werden die kein RecordSet als Ergebnis haben. Beispielsweise können so Tabellen angelegt und verändert werden. Es können auch stored procedures ausgeführt werden.

Dies gilt allerdings nicht für VFP DBCs!

RecordSet

Zum Arbeiten mit Record Sets:

Ein Recordset hat als eine der wichtigsten Methoden die open Methode. Damit kann ein Record Set erstellt werden. Die open Methode hat fünf Parameter:

Ein RecordSet repräsentiert einen Cursor. Es gibt vier verschiedene Arten von Cursor in ADO:

Der Cursor kann sowohl als Client-Side Cursor als auch als Server-Side Cursor geführt werden. Der Server Cursor ist der Default. Dies kann verändert werden durch das Setzen des CursorLocation Properties auf 3.

Das RecordSet Objekt hat eine Filter Eigenschaft. Damit ist es möglich die Daten des Cursors selektiv zu betrachten.

Es gibt eine Find Methode um Daten im Cursor zu finden.

Ein Client-Side Cursor kann indiziert werden, indem ein Feld als optimized gesetzt wird:

oRecordSet.Fields('company_name').Properties('optimize') = .T. 

Das Rücksetzen auf .F. beseitigt den Index wieder.

Recordsets können auch in lokalen Dateien zwischengespeichert werden:

oRecordSet.Save("c:\rs\foo.rs") 

Sie können dann wieder geöffnet werden. Die Änderungen können auch dann an eine Datenquelle weitergegeben werden:

oRecordSet.Open("c:\temp\foo.rs",,3,3)

oConnection.open("tastrade","","")

oRecordset.activeconnection = oConnection

oRecordset.updatebatch()

Zusammenfassung

ADO ist die Methode um auf alle möglichen Datenquellen zuzugreifen. Es wird in Zukunft mehr und mehr direkte Treiber für ADO (OLE DB) geben.

ADO sollte mit VFP verwendet werden, wenn man COM Komponenten baut, da die Verbindung über ADO Recordsets über alle möglichen Entwicklungstools verwendet werden kann. ADO bietet sich also als Datenzugriffsmethode besonders an wenn mit VFP middle Tier Module gebaut werden sollen.

VFP hat im Gegesatz zu VB nicht die Möglichkeit Controls (ActiveX Controls, z.B. FlexGrid) direkt an ein ADO Recordset zu binden. Um Data Bound arebiten zu können muß ein ADO Recordset in einen VFP Cursor überführt werden.

ADO ist also für VFP Programmierer interessant wenn nicht nur VFP als Frontend eingesetzt wird, sondern mit VFP COM Komponenten erstellt werden.