Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ADO / DAO ?

27 views
Skip to first unread message

Alex

unread,
Aug 1, 2001, 8:16:55 AM8/1/01
to
Worin liegt eigentlich genau der Unterschied zwischen ADO und DAO? Man kann
doch jedenfalles beides für den Zugriff auf eine Datenbank einsetzten.
Hat das eine Vorteile gegenüber dem anderen?

thx


GBorn

unread,
Aug 2, 2001, 1:53:50 AM8/2/01
to
"Alex" <mad...@gmx.de> schrieb im Newsbeitrag
news:OvnAePoGBHA.1892@tkmsftngp05...
Es handelt sich einfach um zwei verschiedene Ansätze (bzw.
Objektbibliotheken). DAO (Data Access Objects) ist eine Objektbibliothek,
die mit Access ausgeliefert wird und eigentlich für den Zugriff auf die
Datenbank per VBA vorgesehen ist (d.h. Access muss vorhanden sein).
Natürlich lassen sich diese Objekte auch aus anderen Anwendungen (sprich:
auch aus WSH Skripten) ansprechen. Hier einmal ein einfaches Beispiel aus
"Inside Windows Script Host" (mehr Details zu DAO findest Du in der Access
VBA-Hilfe sowie in den MS Press Titeln "Microsoft Office 2000
Programmierung" und "Microsoft Access Programmierung").

'************************************************
' File: Access.vbs (WSH-Beispiel in VBScript)
' Autor: Günter Born
'
' Zweck: Demonstriert den Zugriff auf Acesss und die
' Datenbank "Test1.mdb". Es wird ein neuer
' Datensatz angelegt, der Inhalt der Tabelle
' "Names" angezeigt und optional der letzte
' Satz in der Tabelle gelöscht.
'************************************************
Option Explicit

Const dbOpenTable = 1 ' Access-Konstante

DIM objAc ' Objektvariable
Dim ws, db, tb, rs

DIM Title, Text

Title = "WSH-Beispiel - by G. Born"

' Hier erzeugen wir eine Objektreferenz auf Access
Set objAc = WScript.CreateObject ("Access.Application")

' Jetzt auf die Datenbank Test1.mdb zugreifen
objAc.OpenCurrentDatabase GetPath + "Test1.mdb"

' Einen WorkSpace anlegen
Set ws = objAc.DBEngine.Workspaces(0)

' Hole Tabelle "Names"
Set db = ws.Databases(0) ' aktuelle Datenbank
Set rs = db.OpenRecordset("Names", dbOpenTable)

' Jetzt einen Datensatz einfügen
rs.MoveLast ' letzter Datensatz
rs.AddNew ' Leersatz anhängen

' Jetzt Name und Personalnummer abfragen und zur
' Tabelle hinzufügen.
rs("Name") = InputBox ("Name", Title, "Born") ' Name
rs("PersID") = InputBox ("Pers ID", Title, "123") ' Personalnummer

rs.Update ' jetzt speichern

' Zeige jetzt alle Datensätze an
rs.MoveFirst ' erster Datensatz
Do ' bis zum letzten Datensatz
WScript.Echo "Record ", rs("ID").value, ": ", _
rs("Name").value, " -> Pers ID: ", _
rs("PersID").value
rs.MoveNext ' nächster Datensatz
Loop Until (rs.EOF)

' Letzter Datensatz ggf. löschen
If (MsgBox("Letzter Datensatz löschen?", _
vbQuestion + vbYesNo, _
Title) = vbYes) Then
rs.MoveLast ' auf letzten Satz
rs.Delete ' löschen
WScript.Echo "Datensatz gelöscht"
End if

objAc.CloseCurrentDataBase ' Datenbank schließen
objAc.Quit ' Access jetzt schließen
Set objAc = Nothing ' Objektvariable freigeben

'##########################
Function GetPath
' Ermittle den Pfad des Skripts und entferne den
' Skriptnamen -> gebe den Pfad zurück.
DIM path
path = WScript.ScriptFullName ' Name Skript
GetPath = Left(path, InstrRev(path, "\"))
End Function
'*** Ende

Der bessere, weil von Access unabhängigere Ansatz stellt ADO (ActiveX Data
Objects) dar. Microsoft liefert hier einen Satz an unterschiedlichen
Objektbibliotheken aus, die sich in verschiedenen Anwendungen nutzen lassen.
Dabei gibt es auch eine "abgespeckte" Version von ADO zur Einbindung in
HTML-Seiten. Der Vorteil: Mit ADO kannst Du auf beliebige Datenbanken
zugreifen (brauchst also kein Access auf der Maschine). Die Zugriffe können
über die ODBC-Treiber oder über die (auch von DAO benutzte) Jet-Engine
erfolgen. Die Zugriffsparameter auf die Datenbank lassen sich über DSN (Data
Source Names) definieren (d.h. Du kannst ohne Eingriff in Deine
Skripte/Programme eventuell die Datenquelle ändern). Hier einmal ein sehr
einfaches ADO-Beispiel aus Inside Windows Script Host:

'************************************************
' File: ADOMachines.vbs (WSH-Beispiel in VBScript)
' Autor: Günter Born
'
' Demonstiert, wie sich ActiveX Data Objects (ADO)
' zum Lesen einer CSV-Datei mittels ODBC-Treiber
' nutzen lassen. Erfordert, dass eine System DSN
' "MyNames" definiert ist (per Systemsteuerung
' über ODBC-Datenquellen). Die CSV-Datei muss sich
' im Skript-Unterordner \Data befinden.
'************************************************
Option Explicit
Const adCmdTable = &H0002

Dim dsn, file
Dim rs, con
Dim Title, txt

dsn = "MyNames"
file = GetPath() + "Data\Machines.csv"

Title = "WSH ADO-Beispiel - by Günter Born"
txt = "Verbindung zu: " & file & " ===> " & _
"ODBC-Verbindungsdaten:" & vbCRLF

' Erzeuge Connection-Objekt
Set con = WScript.CreateObject("ADODB.Connection")
con.Open dsn ' DSN -> definiert in Systemsteuerung

txt = txt & con & vbCRLF & vbCRLF ' Verbindungsdaten
txt = txt & "Datensätze" & vbCRLF

' hole Recordset-Objekt mit Daten
Set rs = WScript.CreateObject("ADODB.Recordset")
rs.Open file, Con, , , adCmdTable

' Jetzt können wir die Daten lesen
Do While Not rs.EOF ' alle Einträge
txt = txt & rs("Name") & vbTab & rs("IP") & vbCRLF
rs.MoveNext ' nächster Record
Loop

MsgBox txt, vbOkonly , Title
con.Close

'#### Hilfsroutinen ####
Function GetPath
' Ermittle Skriptpfad
DIM path
path = WScript.ScriptFullName
GetPath = Left(path, InstrRev(path, "\"))
End Function
' Ende

Die DSN definiert hier beispielsweise, dass es sich um eine CSV-Datei (Comma
Separated Daten) handelt. Weitere Details kannst Du der Hilfe des ADO SDK
entnehmen, den es im Internet auf den Microsoft Webseiten (suche mal unter
msdn.microsoft.com) zum kostenlosen Download gab. Mittlerweile spricht
Microsoft auch von UDA (Universal Data Access) und die Bibliotheken werden
unter dem Begriff MDAC (Microsoft Data Access Components) angeboten.

Sieh mal nach unter:

http://www.microsoft.com/data/ado/
http://www.microsoft.com/data/download.htm


Ich hoffe es hilft Dir weiter.

Gruss

G. Born

--
______________________________________
Check out the WSH Bazaar at www.borncity.de


Alex

unread,
Aug 3, 2001, 8:03:42 AM8/3/01
to
Hallo! Danke für die Informationen! Ich habe da aber noch ein paar Fragen:

Ist es möglich auch mit DAO auf andere Datenbanken uneingeschränkt
zuzugreifen, z.B auf eine SQL Datenbank?

Ich möchte nämlich über ein selbsterstelltes Outlook Formular auf eine
solche Datenbank zugreifen. Ich habe auch schon ein Script erstellt, in dem
ich ADO nutzte. Mein Problem dabei ist, das das Script immer nur einmal
funktioniert!!!
Und zwar immer nur beim ersten Aufruf (wenn ich es aus Outlook heraus
starte, wenn ich es direkt starte, läuft es einwandfrei)!!!!
Beim zweiten Aufruf erhalte ich die Fehlermeldung: schwerwiegender Fehler in
Zeile 5

Ich habe das Problem schon einmal in dieser Newsgroup beschrieben, da ist
auch das Script aufgeführt.
Betreff des Beitrages: VBScript und Outlook Formular, vom 01.08.01 11.12


Jetzt versuche ich das ganze mit DAO, der Connect funktioniert schon, ich
weiss jetzt aber nicht, ob ich alles uneingeschränkt nutzen kann, da ich ja
nicht auf eine Access Datenbank zugreife.

Vielen Dank!


Volker Roth

unread,
Aug 9, 2001, 11:45:49 PM8/9/01
to
Hi,

>Ich habe das Problem schon einmal in dieser Newsgroup beschrieben, da ist
>auch das Script aufgeführt.
>Betreff des Beitrages: VBScript und Outlook Formular, vom 01.08.01 11.12

Das habe ich mir gerade mal angesehen. Bekommst Du denn bei den ersten
Aufrufen die gewünschten Ergebnisse? Vielleicht erzeugt da noch
irgendetwas die Verbindung und Du hämmerst da bereits das nächste Mal
drauf.
Folgendes schon probiert?

With Conn
.ConnectionTimeout = 15 'Maxzeit f. Dauer des Connectionaufbaus
.CommandTimeout = 5 'Maxzeit f. Ausführung eines SQL-Commands
end with 'Mist - kein autom. groß stellen der ersten Buchstaben in _
Free Agent :)

Außerdem würde ich an Deiner Stelle auf jeden Fall bei ADO bleiben.
DAO ist für Jet-Datenbanken wie Access optimiert. Mit ADO kannst Du
auf alles was irgendwie nach Daten aussieht zugreifen, nicht nur auf
relationale DBs. D.h. auch Zugriffe auf Active Directory, XML,
Exchange Server Stores - mach ich gerade, Textfiles - mach ich auch
gerade :) usw. sind möglich.

ciao Volker

0 new messages