thx
'************************************************
' 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
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!
>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