of 35 /35
Datenbankprogrammierung von DAO nach ADO Tilo Böttcher, Technology Specialist Hans Brender, Presales Consultant [email protected] Microsoft GmbH

Datenbankprogrammierung von DAO nach ADO Tilo Böttcher, Technology Specialist Hans Brender, Presales Consultant [email protected] Microsoft GmbH

Embed Size (px)

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
  • Folie 26
  • Jet und Replication Objects JetEngine Object CompactDatabase RefreshCache Replica Object CreateReplica MakeReplicable Synchronize PopulatePartial Filter Object TableName, Filter, FilterType Properties
  • Folie 27
  • 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.