Text of Datenbankprogrammierung von DAO nach ADO Tilo Böttcher, Technology Specialist Hans Brender,...
Folie 1
Datenbankprogrammierung von DAO nach ADO Tilo Bttcher,
Technology Specialist Hans Brender, Presales Consultant
[email protected] Microsoft GmbH
Folie 2
Von DAO nach ADO Agenda Von ISAM und RDBMS? DAO vs. ADO, ADOX
und JRO Tuning und Objektorientierung Code-Migration und
Fehlerquellen
Folie 3
Von DAO nach ADO warum ein Wechsel ntig ist/sein wird,
mehrschichtige Applikationen OLE DB Provider for SQL Server ActiveX
Data Objects (ADO) RDS/HTTP VB 3-Tier VB 2-Tier IE DHTML HTML 3.2
IIS Business Objects ADO/OLEDB Client RDS/DCOM MiddleTier Data SQL
Server IIS/ASP
Folie 4
Von DAO nach ADO warum ein Wechsel ntig ist/sein wird,
verteilte und heterogene Daten Datenbank Spreadsheet Photos Mail
Landkarten Dokumente SQL 7.0 Query Processor OLE DB Interface
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
Folie 5
Von DAO nach ADO warum ein Wechsel ntig ist/sein wird, Analyse
zur Laufzeit online/offline - OLAP OLAPServer OLAP Server OLEDB/ADO
Client Tier MD ActiveX ControlsMD ActiveX Controls MD Erweiterung
fr OLE DBMD Erweiterung fr OLE DB Office SchnittstellenOffice
Schnittstellen 3rd Party Clients3rd Party Clients OLAP Server Tier
MD Daten-ModellierungMD Daten-Modellierung MD Calculation EngineMD
Calculation Engine Multidimensionaler CacheMultidimensionaler Cache
OLEDB/ODBC Data Warehouse Tier DW ManagementDW Management Plato MD
Cache (HOLAP)Plato MD Cache (HOLAP) SQL Server (ROLAP)SQL Server
(ROLAP) 3rd Party Datenspeicher3rd Party Datenspeicher
Folie 6
Von DAO nach ADO Agenda Von ISAM nach RDBMS? DAO vs. ADO, ADOX
und JRO Tuning und Objektorientierung Code-Migration und
Fehlerquellen
Folie 7
Von DAO nach ADO Von ISAM nach RDBMS? ISAM-Dateien (Indexed
Sequential Access Method) Jet/Access, Lotus RDBMS (Relationelles
DatenBank Management-System) SQL
Folie 8
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 fr Visual Basic
Speichermanagement verbessert durch Aufspaltung in mehrere
Komponenten Bestimmung der Datenlokalitt, Speicherverwendung und
Datentypen
Folie 9
Von DAO nach ADO Von ISAM nach RDBMS? Warum gerade ADO?
Applikations-Schnittstelle ADO OLE DB DAO RDBMS JET ODBC API RDO
SQL 7.0 ODBCDirect ADOADOXJRO
Folie 10
AspektSQL 6.5SQL 7.0MSDE Maximale Gre 1 Terabyte 1,048,516
Terabyte 2 Gigabytes Maximale Verbindungen Unlimited (Tuned for 5)
Maximale Anzahl DBs 32,767 Von DAO nach ADO Von ISAM nach RDBMS?
SQL Datenbanken im Vergleich
Folie 11
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?
Folie 12
MSDE / Desktop untersttzt nicht: Parallele Abfragen Planung im
Fibermodus Read-Ahead-Scans Hash- und Mergeverknpfungen
Fail-Over-Cluster Erweiterungsspeicher
Folie 13
Von DAO nach ADO Agenda Von ISAM nach RDBMS? DAO vs. ADO, ADOX
und JRO Tuning und Objektorientierung Code-Migration und
Fehlerquellen
Folie 14
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 Command Recordset
Errors Fields Parameters
Folie 15
Von DAO nach ADO DAO vs. ADO, ADOX und JRO Ein kleiner ADO
berblick Eigenschaften: ADO ist sprachunabhngig, 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)
Folie 16
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\datawww.microsoft.com\data fr Updates und News zu
UDA
Folie 17
Von DAO nach ADO DAO vs. ADO, ADOX und JRO, die wichtigsten ADO
Eigenschaften (2.1) ADO Data Source Links Persistence in XML Client
Cursor resync und auto-resync Dynamic Properties Index on the fly
ADOX Fr Schema Erzeugung und Manipulation (DDL) und Security DDL
als First Class Objekte (Schema Manipulation auch via Execute
mglich) Auf Microsoft Access resp. JET fokusiert Zugang zu DAO
Objekten ber ADO Programming Model JRO 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 mglich
Folie 18
ADO 2.1 Core Data Source Links (DSL) UI um Connect Information
zu setzen und persistent zu machen FILE NAME=C:\myudls\sql7.udl bei
Open Teil von OLEDB VB ADO Controls knnen DataSource via DSL File
instanziieren ber OLEB via IDataInitialize und/oder
IDBPromptInitialize Demo
Folie 19
ADO 2.1 Core Client Cursor Resync Fr static oder forward-only
Cursor um nderungen in der Datenbank zu sehen Kein Requery, d.h.
neue Records werden nicht angezeigt Errors Collection und
adFilterConflictRecords verwenden um gelschte Eintrge zu erkennen
Destructive und non destructive adResyncAll (default) Daten werden
berschrieben adResyncUnderlyingValues
Folie 20
ADO 2.1 Core Persistence in XML In ADO 2.0 nur als File Fr
Offline Operationen Client Cursor muss verwendet werden
(adUseClient) Offline nderungen werden ebenfalls persistiert
nderungen knnen spter via UpdateBatch commited werden Demo
Folie 21
ADO 2.1 Core Dynamic Properties Name Property Namen fr einen
Recordset Wird in der Properties Collection abgespeichert Erfordert
adUseClient Update Resync Property Gibt an ob bei einem UpdateBatch
eine Resync erfolgt und welcher Art dieser ist
Folie 22
ADO 2.1 Core Index on the fly CursorLocation muss adUseClient
sein Bestandteil der Field Properties Collection Internal fr ADO
z.B. Index fr Sort und Filter Operation Wert
Field.Properties(Optimize) = TRUE Field.Properties(Optimize) =
FALSE
Folie 23
ADOX Fr Schema Erzeugung und Manipulation (DDL) und Security
DDL als First Class Objekte (Schema Manipulation auch via Execute
mglich) Auf Microsoft Access resp. JET fokussiert Zugang zu DAO
Objekten ber ADO Programming Model
Folie 24
ADOX Objekte Catalog Table User Group View Procedure Key Index
Column Bis auf Catalog sind alle Objekte auch als Collections
vorhanden Table, Column und Index haben zustzlich noch eine
Properties Collection
Folie 25
Jet und Replication Objects Objekte JetEngine Replica Filter
Collections Filters
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
Folie 28
DAO Sub OpenJetDatabase() Dim db As DAO.Database Set db =
DBEngine.OpenDatabase("C:\Nwind.mdb") db.Close End Sub Von DAO nach
ADO DAO vs. ADO, ADOX und JRO; ffnen der Datenbank 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 Sub OpenSecuredDatabase() Dim wks As
DAO.Workspace Dim db As DAO.Database DBEngine.SystemDB =
"nwindsysdb.mdw" Set wks = DBEngine.CreateWorkspace("", "Admin",
"password") Set db = wks.OpenDatabase("c:\nwind.mdb") End Sub Sub
OpenSecuredDatabase() Dim cnn As New ADODB.Connection 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 Sub
DAOOpenISAMDatabase() Dim db As DAO.Database Set db =
DBEngine.OpenDatabase("C:\Sales.xls", _ False, False, "Excel 5.0;")
db.Close End Sub Sub OpenISAMDatabase() Dim cnn As New
ADODB.Connection cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data _
Source=C:\Sales.xls;Extended Properties=Excel 5.0;" cnn.Close End
Sub
Folie 29
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 Von DAO nach ADO DAO vs.
ADO, ADOX und JRO; Datenmanipulation 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
Folie 30 "VIEW" Then Debug.Print tbl.Name Next End
Sub">
DAO Sub CreateDatabase() Dim db As New DAO.Database Set db =
DBEngine.CreateDatabase "C:\new.mdb;", dbLangGeneral, End Sub Von
DAO nach ADO DAO vs. ADO, ADOX und JRO; Anlegen und Bearbeiten von
Datenbankschemata ADOX Sub CreateDatabase() Dim cat As New
ADOX.Catalog cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\new.mdb;" End Sub Sub DAOListTables() Dim db As
DAO.Database Dim tbl As DAO.TableDef ' Open the database Set db =
DBEngine.OpenDatabase("C:\nwind.mdb") ' Loop through the tables in
the database and print their name For Each tbl In db.TableDefs
Debug.Print tbl.Name Next End Sub 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
Folie 31
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 Von DAO nach ADO DAO vs. ADO, ADOX und JRO; Anlegen und
Bearbeiten von Datenbankschemata ADOX Dim cat As New ADOX.Catalog
Dim tbl 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
Folie 32
DAO Sub SetDatabasePassword() Dim db As DAO.Database Set db =
DBEngine.OpenDatabase("C:\nwind.mdb", True) db.NewPassword "",
"password" db.Close End Sub Von DAO nach ADO DAO vs. ADO, ADOX und
JRO; Sicherheit ADOX Sub SetDatabasePassword() Dim cat As New
ADOX.Catalog cat.ActiveConnection =
"Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data
Source=nwind.mdb;Mode=" & adModeShareExclusive cat.Modify "Jet
OLEDB:Database Password=password;" 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
Folie 33
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 Von DAO
nach ADO DAO vs. ADO, ADOX und JRO; Replikation 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
Folie 34
Von DAO nach ADO Agenda Von ISAM nach RDBMS? DAO vs. ADO, ADOX
und JRO Performancetuning und Objektorientierung Code-Migration und
Fehlerquellen
Folie 35
Von DAO nach ADO Performance Cursor Connection rules. Wird fr
einen RecordSet keine CursorLocation gesetzt erhlt dieser die
Einstellung auf Connection Basis Fr 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 Fr Remotable Connection -->
adUseClient RecordSet --> erhlt Setting von Conncetion Object
oder explizit setzten Scoll: odOpenDynamic oder adOpenKeyset
Isolation: adLockBatchOptimistic
Folie 36
Von DAO nach ADO Performance Connection Teuer, vor allem bei
Web Applikationen Asynchron ist O.K. aber nicht fr 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
Folie 37
Von DAO nach ADO Performance ODBC Connection Pooling
Einstellung ber die Registry In neueren ODBC Versionen ber den ODBC
Service Manager Default Timeout ist 60 Sekunden Anfangspoolgrsse
ist nicht konfigurierbar Num. Pools = Num. Procs. + 1 Reuse aus dem
Pool nur, wenn alle Einstellungen bereinstimmen nderungen auf
Connection Ebene, welche z.B. das Serververhalten beeinflussen
werden nicht abgespeichert (SET, USE...) --> DONT DO THAT!! OLE
DB Resource Pooling Fr native OLE DB Provider Als OLE DB Service
Provider implementiert Num Pools = (Num. Procs. + 1 ) * Num.
unterschiedliche Benutzer Services werden ber Bit Values in der
Registry definiert (Q191745) Timeout ebenfalls 60 Sekunden
Anfangspool ebenfalls nicht konfigurierbar Keine SET USE etc.
Kommandos welche das Serververhalten beeinflussen knnten
Folie 38
Von DAO nach ADO Performance Command und Connection Asynchrone
Operationen (default ist synchron) 3 Mglichkeiten adAsyncExecute:
ADO fhrt 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 nchsten Fetch werden dann die
Daten vorhanden sein. adUseClient als CursorLocation
erforderlich
Folie 39
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 doesnt return results cmd.CommandType =
adCmdStoredProc + adExecuteNoRecords cmd.Execute sp_insert
Folie 40
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 Klasse 1 Form1 Dim obj01 as new class1
Dim obj02 as new class3 Klasse 2Klasse 3 Form2 Dim obj01 as new
class1 Dim obj02 as new class2 Benutzerschicht
Anwendungsschicht
Folie 41
Von DAO nach ADO Agenda Von ISAM nach RDBMS? DAO vs. ADO, ADOX
und JRO Tuning und Objektorientierung Code-Migration und
Fehlerquellen
Folie 42
Von DAO nach ADO Code Migration und Fehlerquellen DEMO
Folie 43
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 Links
und Newsgroups
Folie 44
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
Folie 45
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.