Datenbankprogrammierung
von DAO nach ADO
Tilo Böttcher, Technology Specialist
Hans Brender, Presales Consultant
[email protected]
Microsoft GmbH
Von DAO nach ADO
Agenda
Von ISAM und RDBMS?
DAO vs. ADO, ADOX und JRO
Tuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADO
warum ein Wechsel nötig ist/sein wird, mehrschichtige Applikationen
Client
IE DHTML
HTML 3.2
RDS/HTTP
Middle
Tier
IIS
VB 3-Tier
VB 2-Tier
RDS/DCOM
ADO/OLEDB
IIS/ASP
Business Objects
ActiveX Data Objects (ADO)
OLE DB Provider for SQL Server
Data
SQL Server
Von DAO nach ADO
warum ein Wechsel nötig ist/sein wird, verteilte und heterogene Daten
Directory
Service
Select top 10
SS.customer_ name,
SS.sales,
Excel.sales_plan,
Oracle.DSO,
Mail.call_reports,
Access.Entertainment_budget
From SS.cust_sales,
Excel.budget_worksheet,
Oracle.receivables,
Mail.my_mail_folder,
Access.Entertainment
Where SS.sales and
SS.cust = Excel.cust and
SS.cust = Oracle.cust
SS.cust = Mail.cust
SS.cust = Access.cust
Order by SS.sales
Datenbank
SQL 7.0
Query
Processor
OLE DB
Interface
Spreadsheet
Photos
Mail
Landkarten
Dokumente
Von DAO nach ADO
warum ein Wechsel nötig ist/sein wird, Analyse zur Laufzeit online/offline - OLAP
OLEDB/ADO
OLAP Server
OLEDB/ODBC
Client Tier
•MD ActiveX Controls
•MD Erweiterung für OLE DB
•Office Schnittstellen
•3rd Party Clients
OLAP Server Tier
•MD Daten-Modellierung
•MD Calculation Engine
•Multidimensionaler Cache
Data Warehouse Tier
•DW Management
•Plato MD Cache (HOLAP)
•SQL Server (ROLAP)
•3rd Party Datenspeicher
Von DAO nach ADO
Agenda
Von ISAM nach RDBMS?
DAO vs. ADO, ADOX und JRO
Tuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADO
Von ISAM nach RDBMS?
ISAM-Dateien (Indexed Sequential Access Method)
Jet/Access, Lotus
RDBMS (Relationelles DatenBank Management-System)
SQL
Von DAO nach ADO
Warum gerade ADO?
Vereinfachtes Objektmodell
via OLE DB
Verwendung von VARIANTS (VB oder Type-Mapping)
Bei Benutzung von Visual C++
#import Methode verwenden
Neue ADO Komponenten zur einfachen Benutzung
Optimiert für Visual Basic
Speichermanagement verbessert durch Aufspaltung in
mehrere Komponenten
Bestimmung der Datenlokalität, Speicherverwendung und
Datentypen
Von DAO nach ADO
Von ISAM nach RDBMS? Warum gerade ADO?
Applikations-Schnittstelle
DAO
ODBC
Direct
RDO
ADO
ADOX
JRO
OLE DB
JET
ODBC API
ADO
RDBMS
SQL 7.0
Von DAO nach ADO
Von ISAM nach RDBMS?
SQL Datenbanken im Vergleich
M SD E
SQL D eskt o p
SQL Ser ver
SQL Ent er p r ise
W 9 x,N T W ,N T S
W 9 x,N T W ,N T S
NTS
N T S, N T S Ent .
2 GB
-
-
-
2 GB
2 GB
2 GB
3 GB ( siehe 5)
x
-
-
-
v e r f ügba r
-
x( siehe 0 )
x
x
R e pl i k a t i on
-
x( siehe 1)
x
x
OLA P S e r v i c e s
-
-
x( siehe 2 )
x
ca. 5
ca. 5
unlimit ed
unlimit ed
S e r v e r e r l a ubt
-
x( siehe 3 )
x
x
P r oz e ssor l i m i t
2
2
4
8 ( siehe 4 )
S QL S e r v e r Tool
-
x
x
x
Obj e c t s)
x
x
x
x
S QL N a m e spa c e
x
x
x
x
-
x
x
x
-
x
x
x
z um S QL S e r v e r
-
x
x
x
Ful l t e x t I nde x i ng
-
-
x
x
R e posi t or y
-
x
x
x
Li nk e d S e r v e r
-
x
x
x
C oor di na t or )
-
x
x
x
Engl i sh Que r y
-
-
x
x
C l ust e r i ng
-
-
-
x
Läuf t unt e r OS
m a x D B Gr öße
A dr e ssi e r ba r e r
S pe i c he r
Li z e nz f r e i
D i st r i bui e r ba r
Als S KU
P e r f or m a nc e
opt i m e r t bi s
( U se r )
Wor k e r t hr e a ds
l i mi t i e r t !
Zugr i f f a uf S QL
Aspekt
SQL 6.5
SQL 7.0
MSDE
S QL D M O
( D i st r .
M a na ge m e nt
Maximale
Größe
1 Terabyte
1,048,516
Terabyte
2 Gigabytes
S QL
Ent e r pr i se m a na g
er
D i st r i but e d
Que r i e s
Maximale
Verbindungen
Maximale
Anzahl DBs
D TS S e r v i c e s
Unlimited
Unlimited
Unlimited
(Tuned for 5)
D TC
( D i st r i but e d
32,767
32,767
32,767
Tr a nsa c t i on
Von DAO nach ADO
Von ISAM nach RDBMS? Access 2000 ADP Objekte, ein Kompromiss beim Umstieg?
Tabellen
Sichten
Datenbankdiagramme
Gespeicherte Prozeduren
Formulare/Berichte
Seiten
Makros
Module
Von DAO nach ADO
Von ISAM nach RDBMS? Access 2000 ADP Objekte, ein Kompromiss beim Umstieg?
MSDE / Desktop unterstützt nicht:
• Parallele Abfragen
• Planung im Fibermodus
• Read-Ahead-Scans
• Hash- und Mergeverknüpfungen
• Fail-Over-Cluster
• Erweiterungsspeicher
Von DAO nach ADO
Agenda
Von ISAM nach RDBMS?
DAO vs. ADO, ADOX und JRO
Tuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO
Ein kleiner ADO Überblick
Eigenschaften:
Scrolling cursors
Fabricated data caches
Disconnected caching
Rich data-oriented services
Sort, filter, find
Multiple-tier deployment & configuration
Remoting of data via HTTP and DCOM
Business object integration
persistent RecordSets (auch XML >= 2.1)
Architektur:
Connection
Errors
Recordset
Fields
Command
Parameters
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO
Ein kleiner ADO Überblick
Eigenschaften:
ADO ist sprachunabhängig, da als COM inproc Server implementiert
(VB, VC++, VJ++, ASP ...)
Zugriff auf unterschiedlichste relationale und nicht relationale Daten
(SQL-Server, Oracle, DB2, Access, Active Directory, Index Server ...)
Abstraktion erfolgt über den unterliegenden OLE DB Provider; ADO
Programming Model bleibt gleich (Robust gegen Änderungen)
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO
Ein kleiner ADO Überblick
ADO 2.0
Shipped mit Visual Studio 6.0
Shipped mit NT 4.0 Service Pack 4 (2.0 SP1, kein standalone
Setup)
ADO 2.1
Shipped mit SQL Server 7.0
Shipped mit Office 2000
Dokumentation nur mit Office 2000
Dokumentation Online unter msdn.microsoft.com\library
ADO 2.5
Shipped mit Windows 2000
Shipped als MDAC 2.5 (derzeit nur US)
www.microsoft.com\data für Updates und News zu UDA
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO, die wichtigsten ADO Eigenschaften (2.1)
ADO
ADOX
JRO
Data Source Links
Persistence in XML
Client Cursor resync und
auto-resync
Dynamic Properties
Index “on the fly”
Für Schema Erzeugung
und Manipulation (DDL)
und Security
DDL als First Class
Objekte (Schema
Manipulation auch via
Execute möglich)
Auf Microsoft Access resp.
JET fokusiert
Zugang zu DAO Objekten
über ADO Programming
Model
Nur ACCESS resp.
JET/DAO
Replica erzeugen und
synchronisieren
Replica Priority
CompactDatabase mit
Passwort Proctection und
Encryption
JET Cache Refresh
Sync. zwischen MDB und
SQL Server Publication
möglich
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO
Bereiche
Öffnen der Datenbank
Datenmanipulation
Anlegen und Bearbeiten der Datenbankschema
Sicherheit
Replikation
Fehler(teufel) abfangen
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO; Öffnen der Datenbank
DAO
Sub OpenJetDatabase()
Dim db
As DAO.Database
Set db = DBEngine.OpenDatabase("C:\Nwind.mdb")
db.Close
ADO
Sub OpenJetDatabase()
Dim cnn
As New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Nwind.mdb;"
cnn.Close
End Sub
End Sub
Sub OpenSecuredDatabase()
Dim wks
As DAO.Workspace
Dim db
As DAO.Database
Sub OpenSecuredDatabase()
Dim cnn
As New ADODB.Connection
DBEngine.SystemDB = "nwindsysdb.mdw"
Set wks = DBEngine.CreateWorkspace("", "Admin",
"password")
Set db = wks.OpenDatabase("c:\nwind.mdb")
cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
cnn.Properties("Jet OLEDB:System database") =
"nwindsysdb.mdw"
cnn.Open "Data Source=c:\nwind.mdb;User
Id=Admin;Password=password;"
End Sub
End Sub
Sub DAOOpenISAMDatabase()
Dim db
As DAO.Database
Sub OpenISAMDatabase()
Dim cnn
As New ADODB.Connection
Set db = DBEngine.OpenDatabase("C:\Sales.xls", _
False, False, "Excel 5.0;")
_
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Sales.xls;Extended
db.Close
End Sub
Properties=Excel 5.0;"
cnn.Close
End Sub
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO; Datenmanipulation
DAO
Sub OpenRecordset()
Dim db
As DAO.Database
Dim rst
As DAO.Recordset
Dim fld
As DAO.Field
'Open the database
Set db = DBEngine.OpenDatabase("C:\nwind.mdb")
'Open the Recordset
Set rst = db.OpenRecordset("Select * from
Customers where Region" & _
' = WA'", dbOpenSnapshot,
dbOpenForwardOnly)
' Display the records in the debug window
While Not rst.EOF
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
Debug.Print
rst.MoveNext
Wend
'Close the recordset
rst.Close
End Sub
ADO
Sub OpenRecordset()
Dim cnn
As New ADODB.Connection
Dim rst
As New ADODB.Recordset
Dim fld
As ADODB.Field
' Open the connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\nwind.mdb;"
' Open the forward-only, read-only recordset
rst.Open "Select * from Customers where Region =
'WA'", cnn, _
adOpenForwardOnly,
adLockReadOnly
' Display the records in the debug window
While Not rst.EOF
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
Debug.Print
rst.MoveNext
Wend
'Close the recordset
rst.Close
End Sub
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO; Anlegen und Bearbeiten von Datenbankschemata
DAO
Sub CreateDatabase()
Dim db
As New DAO.Database
Set db = DBEngine.CreateDatabase
"C:\new.mdb;", dbLangGeneral,
ADOX
Sub CreateDatabase()
Dim cat
As New ADOX.Catalog
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" &
_
End Sub
"Data Source=C:\new.mdb;"
End Sub
Sub DAOListTables()
Dim db
As DAO.Database
Dim tbl
As DAO.TableDef
' Loop through the tables in the database and
print their name
For Each tbl In db.TableDefs
Debug.Print tbl.Name
Next
Dim cat
As New ADOX.Catalog
Dim tbl
As ADOX.Table
' Open the catalog
cat.ActiveConnection =
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\nwind.mdb;"
' Loop through the tables in the database and
print their name
For Each tbl In cat.Tables
If tbl.Type <> "VIEW" Then Debug.Print
tbl.Name
Next
End Sub
End Sub
' Open the database
Set db = DBEngine.OpenDatabase("C:\nwind.mdb")
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO; Anlegen und Bearbeiten von Datenbankschemata
DAO
Sub DAOCreateTable()
Dim db
As DAO.Database
Dim tbl
As DAO.TableDef
'Open the database
Set db = DBEngine.OpenDatabase("C:\nwind.mdb")
' Create a new TableDef object.
Set tbl = db.CreateTableDef("Contacts")
With tbl
' Create fields and append them to the new
TableDef object.
' This must be done before appending the
TableDef object to
' the TableDefs collection of the database.
.Fields.Append .CreateField("FirstName",
dbText)
.Fields.Append .CreateField("LastName",
dbText)
.Fields.Append .CreateField("Phone", dbText)
.Fields.Append .CreateField("Notes", dbMemo)
End With
' Add the new table to the database.
db.TableDefs.Append tbl
db.Close
End Sub
ADOX
Dim cat
Dim tbl
As New ADOX.Catalog
As New ADOX.Table
' Open the catalog
cat.ActiveConnection =
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\nwind.mdb;"
' Create a new TableDef object.
With tbl
.Name = "Contacts"
' Create fields and append them to the new
TableDef
' object. This must be done before appending
the
' TableDef object to the TableDefs
collection of the
' database.
.Columns.Append "FirstName", adVarWChar
.Columns.Append "LastName", adVarWChar
.Columns.Append "Phone", adVarWChar
.Columns.Append "Notes", adLongVarWChar
End With
' Add the new table to the database.
cat.Tables.Append tbl
Set cat = Nothing
End Sub
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO; Sicherheit
DAO
ADOX
Sub SetDatabasePassword()
Dim db
As DAO.Database
Sub SetDatabasePassword()
Dim cat
As New ADOX.Catalog
Set db = DBEngine.OpenDatabase("C:\nwind.mdb",
True)
db.NewPassword "", "password"
db.Close
cat.ActiveConnection =
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data
Source=nwind.mdb;Mode=" & adModeShareExclusive
cat.Modify "Jet OLEDB:Database
Password=password;"
End Sub
End Sub
Sub CreateUser()
Dim wks
As DAO.Workspace
' Open a workspace
DBEngine.SystemDB = "c:\nwindsysdb.mdw"
Set wks = DBEngine.CreateWorkspace("", "Admin",
"password")
' Create the user and append it to the Users
collection
wks.Users.Append wks.CreateUser("User1",
"User001", "password")
End Sub
Sub CreateUser()
Dim cat
As New ADOX.Catalog
' Open the catalog, specifying the system
database to use
cat.ActiveConnection =
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\nwind.mdb;"
& _
"Jet OLEDB:System
database=C:\nwindsysdb.mdw;" & _
"User
Id=Admin;Password=password;"
' Create the new user and append it to the users
collection
cat.Users.Append "NewUser", "password",
"User001"
End Sub
Von DAO nach ADO
DAO vs. ADO, ADOX und JRO; Replikation
DAO
Sub MakeDesignMaster()
Dim dbsNorthwind As DAO.Database
Dim prpNew As DAO.Property
' Open database for exclusive access.
Set dbsNorthwind =
DBEngine.OpenDatabase("Northwind.mdb", True)
With dbsNorthwind
' If Replicable property
doesn't exist, create it.
' Turn off error handling in
case property exists.
On Error Resume Next
Set prpNew =
.CreateProperty("Replicable", dbText, "T")
.Properties.Append prpNew
' Set database Replicable
property to True.
.Properties("Replicable") =
"T"
.Close
End With
End Sub
ADO/JRO
Sub MakeDesignMaster()
Dim repMaster As New JRO.Replica
' Make the Northwind database
replicable.
' If successful, this will create a connection to
the
' database.
repMaster.MakeReplicable "Northwind.mdb", False
Set repMaster = Nothing
End Function
Von DAO nach ADO
Agenda
Von ISAM nach RDBMS?
DAO vs. ADO, ADOX und JRO
Performancetuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADO
Performance
Cursor
Connection “rules”. Wird für
einen RecordSet keine
“CursorLocation” gesetzt
erhält dieser die Einstellung
auf Connection Basis
Für remotable Recordsets
muss dies “adUseClient”
sein
Bei incompatiblen
Cursoreinstellungen
versucht der Provider einen
“best guess” zu machen.
Default:
• Connection --> adUseServer
• Recordset --> adUseServer
– Scroll: adOpenForwardOnly
– Isolation: adLockReadOnly
Für Remotable
• Connection --> adUseClient
• RecordSet --> erhält Setting von
Conncetion Object oder explizit
setzten
– Scoll: odOpenDynamic oder
adOpenKeyset
– Isolation:
adLockBatchOptimistic
Von DAO nach ADO
Performance
Connection
“Teuer”, vor allem bei Web Applikationen
Asynchron ist O.K. aber nicht für
3-Tier Applikationen
Connection Objekte sollten bei einer Web App nicht im Session Object
abgespei-chert werden
• Connection immer explizit erzeugen  “under the hood” Connections
nicht poolable
Abhilfe
--> Connection Pooling
Von DAO nach ADO
Performance
Command und Connection
Asynchrone Operationen (default ist synchron)
3 Möglichkeiten
• adAsyncExecute: ADO führt Command in einem zweiten Thread
aus, über ExecuteComplete erfolgt die Notification
• adAsynchFetch: Zweiter Thread, bei einem Fetch wird solange
geblockt bis der Datensatz gelesen ist.
– adUseClient als CursorLocation
• adAsyncFetchNonBlocking: Niemals Blocking, wenn ein Fetch
auf einen Datensatz erfolgt der noch nicht da ist, erfolgt eine
MoveEOF; im nächsten Fetch werden dann die Daten vorhanden
sein.
• adUseClient als CursorLocation erforderlich
Von DAO nach ADO
Performance
Commands
Beste Performance über Stored
Procedures
Parameter im Code definieren
(nicht über Refresh, extra
Roundtrip zum Server)
Command Typ angeben
Asynchron wenn angebracht
adExecuteNoRecords
Prepare - Falls es Sinn macht
Wenn der Typ nicht angegeben
wird, versucht ADO über “Try and
Error” den Typ zu erkennen
• Reihenfolge: aCmdText,
adCmdTable,
adCmdStoredProc, adCmdFile
Set cmd.ActiveConnection = cnn
‘Opening a table directly
cmd.CommandType = adCmdTable
Set rst = cmd.Execute(“authors”)
‘Executing a proc that doesn’t return results
cmd.CommandType = adCmdStoredProc +
adExecuteNoRecords
cmd.Execute “sp_insert”
Von DAO nach ADO
Objektorientierung
Kapselung von logischen Einheiten in Klassen – keine
direkte Datenbindung an GUI-Elemente (siehe Demo)
Arbeit mit zwei oder drei Schichten
Gepufferter Zugriff auf typisierte Daten
Benutzerschicht
Form1
Form2
Dim obj01 as new class1
Dim obj02 as new class3
Dim obj01 as new class1
Dim obj02 as new class2
Klasse 1
Klasse 2
Klasse 3
Anwendungsschicht
Von DAO nach ADO
Agenda
Von ISAM nach RDBMS?
DAO vs. ADO, ADOX und JRO
Tuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADO
Code Migration und Fehlerquellen
DEMO
Links und Newsgroups
http://www.microsoft.com/germany/msdn/techtalk
http://www.microsoft.com/germany/data
http:// msdn.microsoft.com/library
http://www.microsoft.com/AccessDev/ProdInfo/AUT97dat.htm
http://www.vba-magazin.de/
http://www.basicworld.com/
Newsgroups
Server msnews.microsoft.com
microsoft.public.de.germany.entwickler.techtalk
microsoft.public.de.germany.entwickler.techtalk.office2000
Informationen von Microsoft Press
http://www.microsoft.com/germany/mspress
Datenbankprogrammierung mit
Visual Basic 6
Autor: Walter Doberenz, Thomas
Kowalski
ISBN: 3-86063-485-2
Umfang: 633 Seiten
Preis: 79,00 DM
ADO-Programmierung
Autor: David Sceppa
ISBN: 3-86063-618-9
Umfang: 384 Seiten
Preis: 79,00 DM
Artikel: Migrating from DAO to ADO
(Using ADO with the Microsoft Jet OLE
DB Provider)
Alyssa Henry
Msdn Library
This document is for informational purposes only. MICROSOFT
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS
DOCUMENT.
2000 Microsoft Corporation. All rights reserved.
Companies, names, and/or data used in screens and sample
output are fictitious, unless otherwise noted.
Microsoft, Windows, and Windows NT are either registered
trademarks or trademarks of Microsoft Corporation in the United
States and/or other countries. Other product and company names
mentioned herein may be the trademarks of their respective
owners.