Datenbankprogrammierung von DAO nach ADO
Tilo Böttcher, Technology SpecialistHans Brender, Presales Consultant
[email protected] GmbH
Von DAO nach ADO
AgendaVon 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
OLE DB Provider for SQL ServerOLE DB Provider for SQL Server
ActiveX Data Objects (ADO)ActiveX Data Objects (ADO)
RDS/HTTPRDS/HTTP
VB 3-TierVB 3-Tier VB 2-TierVB 2-TierIE DHTMLIE DHTML HTML 3.2HTML 3.2
IISIIS
Business ObjectsBusiness Objects
ADO/OLEDBADO/OLEDB
ClientClient
RDS/DCOMRDS/DCOM
MiddleMiddleTierTier
DataData SQL Server SQL Server
IIS/ASPIIS/ASP
Von DAO nach ADO warum ein Wechsel nötig ist/sein wird, verteilte und heterogene Daten
Datenbank
Spreadsheet
Photos
Landkarten
Dokumente
SQL 7.0Query
Processor
OLE DBInterface
DirectoryService
Select top 10 SS.customer_ name, SS.sales, Excel.sales_plan, Oracle.DSO, Mail.call_reports, Access.Entertainment_budgetFrom SS.cust_sales, Excel.budget_worksheet, Oracle.receivables, Mail.my_mail_folder, Access.EntertainmentWhere SS.sales and SS.cust = Excel.cust and SS.cust = Oracle.cust SS.cust = Mail.cust SS.cust = Access.custOrder by SS.sales
Von DAO nach ADO warum ein Wechsel nötig ist/sein wird, Analyse zur Laufzeit online/offline - OLAP
OLAPOLAP ServerServer
OLEDB/ADOOLEDB/ADO
Client TierClient Tier •MD ActiveX ControlsMD ActiveX Controls•MD Erweiterung für MD Erweiterung für OLE DBOLE DB•Office SchnittstellenOffice Schnittstellen•3rd Party Clients3rd Party ClientsOLAP Server TierOLAP Server Tier•MD Daten-MD Daten-ModellierungModellierung•MD Calculation MD Calculation Engine Engine •Multidimensionaler Multidimensionaler CacheCache
OLEDB/ODBCOLEDB/ODBC
Data Warehouse TierData Warehouse Tier•DW ManagementDW Management•Plato MD Cache Plato MD Cache (HOLAP)(HOLAP)•SQL Server (ROLAP)SQL Server (ROLAP)•3rd Party 3rd Party DatenspeicherDatenspeicher
Von DAO nach ADO
AgendaVon ISAM nach RDBMS?DAO vs. ADO, ADOX und JRO Tuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADOVon ISAM nach RDBMS?
ISAM-Dateien (Indexed Sequential Access Method) Jet/Access, Lotus
RDBMS (Relationelles DatenBank Management-System)SQL
Von DAO nach ADOWarum gerade ADO?
Vereinfachtes Objektmodell via OLE DBVerwendung von VARIANTS (VB oder Type-Mapping)Bei Benutzung von Visual C++ #import Methode verwendenNeue ADO Komponenten zur einfachen BenutzungOptimiert für Visual Basic Speichermanagement verbessert durch Aufspaltung in mehrere KomponentenBestimmung der Datenlokalität, Speicherverwendung und Datentypen
Von DAO nach ADOVon ISAM nach RDBMS? Warum gerade ADO?
Applikations-SchnittstelleApplikations-Schnittstelle
ADOADO
OLE DBOLE DB
DAODAO
RDBMSRDBMS
JETJET
ODBC APIODBC API
RDORDO
SQL 7.0SQL 7.0
ODBCODBCDirectDirect ADO ADOX JRO
MSDE SQL Desktop SQL Server SQL Enterprise
Läuft unter OS W9x,NTW,NTS W9x,NTW,NTS NTS NTS, NTS Ent.
max DB Größe 2 GB - - -
Adressierbarer
Speicher 2 GB 2 GB 2 GB 3 GB (siehe 5)
Lizenzfrei
Distribuierbar x - - -
Als SKU
verfügbar - x(siehe 0) x x
Replikation - x(siehe 1) x x
OLAP Services - - x(siehe 2) x
Performance
optimert bis
(User)
Workerthreads
limitiert!
Zugriff auf SQL
Server erlaubt - x(siehe 3) x x
Prozessorlimit 2 2 4 8 (siehe 4)
SQL Server Tool - x x x
SQL DMO
(Distr.
Management
Objects)
SQL Namespace x x x x
SQL
Enterprisemanag
er - x x x
Distributed
Queries - x x x
DTS Services
zum SQL Server - x x x
Fulltext Indexing - - x x
Repository - x x x
Linked Server - x x x
DTC
(Distributed
Transaction
Coordinator)
English Query - - x x
Clustering - - - x
ca. 5 ca. 5 unlimited unlimited
x x x x
- x x x
Aspekt SQL 6.5
SQL 7.0 MSDE
Maximale Größe 1
Terabyte
1,048,516
Terabyte2 Gigabytes
MaximaleVerbindungen
Unlimited
UnlimitedUnlimited(Tuned for
5)
MaximaleAnzahl DBs 32,767 32,767 32,767
Von DAO nach ADOVon ISAM nach RDBMS? SQL Datenbanken im Vergleich
TabellenSichtenDatenbankdiagrammeGespeicherte ProzedurenFormulare/BerichteSeitenMakrosModule
Von DAO nach ADOVon ISAM nach RDBMS? Access 2000 ADP Objekte, ein Kompromiss beim Umstieg?
Von DAO nach ADOVon 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
AgendaVon ISAM nach RDBMS?DAO vs. ADO, ADOX und JRO Tuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADODAO vs. ADO, ADOX und JROEin kleiner ADO Überblick
Eigenschaften:
Scrolling cursorsFabricated data cachesDisconnected cachingRich data-oriented services
Sort, filter, findMultiple-tier deployment & configurationRemoting of data via HTTP and DCOMBusiness object integrationpersistent RecordSets (auch XML >= 2.1)
Architektur:
ConnectionConnection
CommandCommand
RecordsetRecordset
ErrorsErrors
FieldsFields
ParametersParameters
Von DAO nach ADODAO vs. ADO, ADOX und JROEin 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 ADODAO vs. ADO, ADOX und JROEin kleiner ADO Überblick
ADO 2.0Shipped mit Visual Studio 6.0Shipped mit NT 4.0 Service Pack 4 (2.0 SP1, kein standalone Setup)
ADO 2.1Shipped mit SQL Server 7.0Shipped mit Office 2000Dokumentation nur mit Office 2000Dokumentation Online unter msdn.microsoft.com\library
ADO 2.5Shipped mit Windows 2000Shipped als MDAC 2.5 (derzeit nur US)
www.microsoft.com\data für Updates und News zu UDA
Von DAO nach ADODAO vs. ADO, ADOX und JRO, die wichtigsten ADO Eigenschaften (2.1)
ADO
Data Source LinksPersistence in XMLClient Cursor resync und auto-resyncDynamic PropertiesIndex “on the fly”
ADOX
Für Schema Erzeugung und Manipulation (DDL) und SecurityDDL als First Class Objekte (Schema Manipulation auch via Execute möglich)Auf Microsoft Access resp. JET fokusiertZugang zu DAO Objekten über ADO Programming Model
JRO
Nur ACCESS resp. JET/DAOReplica erzeugen und synchronisierenReplica PriorityCompactDatabase mit Passwort Proctection und EncryptionJET Cache Refresh Sync. zwischen MDB und SQL Server Publication möglich
BereicheÖffnen der DatenbankDatenmanipulationAnlegen und Bearbeiten der DatenbankschemaSicherheitReplikationFehler(teufel) abfangen
Von DAO nach ADODAO vs. ADO, ADOX und JRO
DAOSub OpenJetDatabase() Dim db As DAO.Database Set db = DBEngine.OpenDatabase("C:\Nwind.mdb") db.Close End Sub
Von DAO nach ADODAO vs. ADO, ADOX und JRO; Öffnen der Datenbank
ADOSub 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
DAOSub 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.CloseEnd Sub
Von DAO nach ADODAO vs. ADO, ADOX und JRO; Datenmanipulation
ADOSub 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
DAOSub CreateDatabase() Dim db As New DAO.Database
Set db = DBEngine.CreateDatabase "C:\new.mdb;", dbLangGeneral, End Sub
Von DAO nach ADODAO vs. ADO, ADOX und JRO; Anlegen und Bearbeiten von Datenbankschemata
ADOXSub 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
DAOSub 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.CloseEnd Sub
Von DAO nach ADODAO 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 = NothingEnd Sub
DAOSub SetDatabasePassword() Dim db As DAO.Database Set db = DBEngine.OpenDatabase("C:\nwind.mdb", True) db.NewPassword "", "password" db.Close End Sub
Von DAO nach ADODAO vs. ADO, ADOX und JRO; Sicherheit
ADOXSub 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
DAOSub MakeDesignMaster()
Dim dbsNorthwind As DAO.DatabaseDim 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 NextSet prpNew
= .CreateProperty("Replicable", dbText, "T").Properties.Append prpNew' Set database Replicable
property to True..Properties("Replicable") =
"T".Close
End WithEnd Sub
Von DAO nach ADODAO vs. ADO, ADOX und JRO; Replikation
ADO/JROSub 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
AgendaVon ISAM nach RDBMS?DAO vs. ADO, ADOX und JRO Performancetuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADOPerformance
CursorConnection “rules”. Wird für einen RecordSet keine “CursorLocation” gesetzt erhält dieser die Einstellung auf Connection BasisFür remotable Recordsets muss dies “adUseClient” seinBei incompatiblen Cursoreinstellungen versucht der Provider einen “best guess” zu machen.
Default:• Connection --> adUseServer• Recordset --> adUseServer
– Scroll: adOpenForwardOnly
– Isolation: adLockReadOnlyFür Remotable
• Connection --> adUseClient• RecordSet --> erhält Setting
von Conncetion Object oder explizit setzten
– Scoll: odOpenDynamic oder adOpenKeyset
– Isolation: adLockBatchOptimistic
Von DAO nach ADOPerformance
Connection“Teuer”, vor allem bei Web ApplikationenAsynchron ist O.K. aber nicht für 3-Tier ApplikationenConnection 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 ADOPerformance
Command und ConnectionAsynchrone 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 ADOPerformance
CommandsBeste Performance über Stored ProceduresParameter im Code definieren (nicht über Refresh, extra Roundtrip zum Server)Command Typ angebenAsynchron wenn angebrachtadExecuteNoRecordsPrepare - 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 ADOObjektorientierung
Kapselung von logischen Einheiten in Klassen – keine direkte Datenbindung an GUI-Elemente (siehe Demo)Arbeit mit zwei oder drei SchichtenGepufferter Zugriff auf typisierte Daten
Klasse 1
Form1Dim obj01 as new class1Dim obj02 as new class3
Klasse 2 Klasse 3
Form2Dim obj01 as new class1Dim obj02 as new class2
Benutzerschicht
Anwendungsschicht
Von DAO nach ADO
AgendaVon ISAM nach RDBMS?DAO vs. ADO, ADOX und JRO Tuning und Objektorientierung
Code-Migration und Fehlerquellen
Von DAO nach ADOCode Migration und Fehlerquellen
DEMO
http://www.microsoft.com/germany/msdn/techtalk
http://www.microsoft.com/germany/datahttp:// msdn.microsoft.com/libraryhttp://www.microsoft.com/AccessDev/ProdInfo/AUT97dat.htm
http://www.vba-magazin.de/http://www.basicworld.com/
NewsgroupsServer msnews.microsoft.commicrosoft.public.de.germany.entwickler.techtalkmicrosoft.public.de.germany.entwickler.techtalk.office2000
Links und Newsgroups
Informationen von Microsoft Press
http://www.microsoft.com/germany/mspress
Datenbankprogrammierung mit Visual Basic 6Autor: Walter Doberenz, Thomas KowalskiISBN: 3-86063-485-2Umfang: 633 SeitenPreis: 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.
Top Related