53
主主主主主主主主 - CH8 1 第 8 第 DAO 第第第第第第第第第

第 8 章 DAO 物件應用和程式設計

  • Upload
    edythe

  • View
    90

  • Download
    6

Embed Size (px)

DESCRIPTION

第 8 章 DAO 物件應用和程式設計. 本章宗旨. 簡介 DAO 物件之引用方式 簡介 DAO 物件之各項資料操作指令 介紹資料表自動連入與移除之處理方式 介紹 VBA 資料庫操作指令與程序檔建檔範例 介紹事件導向之程式設計風格 介紹多功能整合式表單之設計方式 簡介 DAO 物件設計 API 之進階應用- SQL 指令集管理. 大 綱. 8-1 前置處理 8-2 DAO 指令簡介 8-3 進階應用. 8-1 前置處理. DAO 為 Data Access Object 之縮血寫 - PowerPoint PPT Presentation

Citation preview

  • 8 DAO

    - CH8

  • DAODAOVBADAOAPISQL

    - CH8

  • 8-1 8-2 DAO 8-3

    - CH8

  • 8-1 DAOData Access ObjectDAOVBADAO

    - CH8

  • 8-1 () (R)Microsoft DAO 3.6 Object Library

    - CH8

  • 8-1 ()

    - CH8

  • 8-2 DAO8-2-1 8-2-2 8-2-3 8-2-4 8-2-5

    - CH8

  • 8-2-1 DAO ODBCAccess

    - CH8

  • - CH8

  • 1. TransferDatabase 1.1 TransferDatabaseDocmd.TransferDatabase acLink, acImport, acExportacLinkODBC

    - CH8

  • 1. TransferDatabase ()acTableFalse

    - CH8

  • 1. TransferDatabase ()DoCmd.TransferDatabase acLink, "ODBC ", "ODBC; Driver={MySQL ODBC 3.51 Driver}; Server=Localhost; Database=mysal; UID=; PWD=; Option=3 ", acTable, cuinfo, cuinfo, FalseDoCmd.TransferDatabase acLink, "ODBC ", "ODBC; DSN=; Database=mysal; UID=; PWD=; Option=3 ", acTable, cuinfo, cuinfo, False

    - CH8

  • 1. TransferDatabase ()MySQLODBCDSNNameHostOn Open

    - CH8

  • 1.1 conModuleLinkTable Public Sub LinkTable(wdb as string, tbn as string)DoCmd.TransferDatabase acLink, "ODBC ", "ODBC; Driver= & _ {MySQL ODBC 3.51 Driver}; Server=Localhost; Database= & wdb & ; & _ UID=; PWD=; Option=3 ", tbn, tbn, FalseEnd Sub

    - CH8

  • 1.1 ()( On Open)Call LinkTable(,)Call LinkTable(mysal,cuinfo)

    - CH8

  • 1.2 conModuledlTmptbl

    - CH8

  • dlTmptbl1. Public Sub dlTmptbl(tbn As String)2. Dim tbl As TableDef3. Dim db As Database4. Set db = CurrentDb5. With db6. For Each tbl In db.TableDefs7. If tbl.Name = tbn Then8. db.TableDefs.Delete tbl.Name9. Exit For10. End If11. Next tbl12. End With13. End Sub

    - CH8

  • dlTmptblOn Close 1. Dim db as database2. Dim rs as recordset3. Set db = currentdb4. Set rs=db.OpenRecordset(Select * From sysTable Where database= mysal)

    - CH8

  • dlTmptbl() 5. With rs 6. Do while not .EOF 7. Call dlTmptbl(rs!Table) 8. .movenext 9. Loop10. End With11. rs.close

    - CH8

  • 1.3 Set rs = db.OpenRecordset("cuinfo")Set rs = db.OpenRecordset("Select * From cuinfo")Set qry = db.CreateQueryDef("", "SQL")Set rs = qry.OpenRecordset()

    - CH8

  • 1.3 ()AccessDAOAccess

    - CH8

  • 1.4 SQL Dim qry As QueryDefSet qry = db.CreateQueryDef("", "SQL")qry.Execute

    - CH8

  • 2. OpenDatabase Set workspace = CreateWorkspace(name, user, password, type) Set database = workspace.OpenDatabase (dbname, options, read-only, connect)

    - CH8

  • 2. OpenDatabase():WorkspacenameuserAdminMySQLpasswordtypedbUseJet()|dbUseODBC()dbname(Jet)(ODBC)Options

    - CH8

  • 2. OpenDatabase()OptionsdbDriverNoPromptdbnameconnection stringdbDriverPromptDSNDSNDSNdbDriverCompletedbDriverCompleteRequireddbDriverCompleteODBCread-onlyconnect

    - CH8

  • 2.1 - openDB1. Public ws As Workspace2. Public db As Database3. Public As Recordset4. Public Sub openDB()5. Dim str As String6. Set ws = DBEngine.CreateWorkspace("", Admin", "", dbUseJet)7. str = "ODBC; DRIVER={MySQL ODBC 3.51 Driver}; SERVER = localhost; DATABASE=mysal; UID=; PWD=; OPTION=38. Set db = ws.OpenDataBase("", dbDriverNoPrompt, False, str)9.End Sub

    - CH8

  • 2.1 ()On Open Call openDB

    - CH8

  • 8-2-2 1. Set recordset = object.OpenRecordset (, , , ) Set rs = con.OpenRecordset()Set rs = db.OpenRecordset()

    - CH8

  • 1. () Set recordset = object.OpenRecordset (, , ) Set rs = qry.OpenRecordset()

    - CH8

  • 2. SQLdbOpenTable(dbUseJet)dbOpenDynamic(dbUseODBC)dbOpenDynasetODBC keyset dbOpenSnapshot, ODBC static dbOpenForwardOnly

    - CH8

  • 2. ()dbUseJetdbUseODBC

    - CH8

  • 2. () dbAppendOnly(dbUseJetdynaset)dbSQLPassThroughSQL(dbUseJet snapshot-)dbSeeChanges(dbUseJetdynaset)

    - CH8

  • 2. - dbDenyWrite (dbUseJet) dbDenyRead(dbUseJettable)dbRunAsync(ODBCDirect)

    - CH8

  • 2. - dbExecDirectSQLPrepareSQLExecDirect (ODBCDirect )dbInconsistent(dbUseJetdynasetsnapshot)dbConsistent(dbUseJetdynasetsnapshot)

    - CH8

  • 2. - dbReadOnly(ODBCDirect)dbPessimisticEdit(Jet )dbOptimisticUpdate(Jet )dbOptimisticValue(ODBCDirect)dbOptimisticBatch(ODBCDirect)

    - CH8

  • 8-2-3 1. Set qry = object.CreateQueryDef (name, sqltext) qry object

    - CH8

  • 1. ()nameobjectdbUseJetTransferDatabasesqltextSQLqryqry.SQL

    - CH8

  • 2. (Select) Set rs = qry.OpenRecordset()(Insert, Update, Delete)qry.Execute options

    - CH8

  • 2. ()optionsdbDenyWrite(Jet)dbInconsistent(Jet)dbConsistent(Jet)dbSQLPassThroughSQL(Jet)

    - CH8

  • 2. ()dbFailOnError (Jet)dbSeeChanges(Jet)dbRunAsync(ODBCDirect)dbExecDirectSQLPrepareODBC(ODBCDirect)

    - CH8

  • 8-2-4 rs.AddNew ()rs.Update rs!CU_Tel = Me!CU_TelMe!CU_Tel = rs!CU_Tel

    - CH8

  • 8-2-4 () rs.FindFirstrs.FindFirst "CU_No ='" & Me!CU_No & "'rs.FindNext rs.Nomatch

    - CH8

  • 8-2-4 () rs.Delete Style = vbYesNo + vbCritical + vbDefaultButton2 rps = MsgBox("?", Style, "") If rps = vbYes Then rs.Delete End If

    - CH8

  • 8-2-4 ()/ rs.Edit () rs.Update

    - CH8

  • 8-2-4 () Str2= Update rcpay, Set rcpay.CR_Spamt = rcpay!CR_Spamt & _ + !Amount, rcpay.CR_Upamt = rcpay!CR_Upamt + & _!Amount, .TR_Note = T & _WHERE ((([].[TR_Note]) Is Null));Set qry2 = db.CreateQueryDef("", str2)qry2.Execute

    - CH8

  • str1= Select spbill.SP_Blno, spbill.CU_No, splist.PD_No, splist.SP_Qty, & _ cuquoat.UN_Price, splist!SP_Qty*cuquoat!UN_Price AS Amount, & _ splist.TR_Note FROM cuquoat Inner Join (spbill Inner Join splist ON & _ spbill.SP_Blno = splist.SP_Blno) ON (cuquoat.CU_No = spbill.CU_No) & _ And (cuquoat.PD_No = splist.PD_No) Where (((splist.TR_Note) Is Null)) & _ Order By spbill.CU_No;Set qry1 = db.CreateQueryDef("", str1)Set rs1 = qry1.OpenRecordset()str2 = Select * From rcpay Order By CU_No;Set rs2 = db.OpenRecordset(str2)With rs1

    - CH8

  • ()Do While Not .EOF cu=!CU_No With rs2 .MoveFirst .FindFirst CU_No = & cu & If Not .NoMatch Then .Edit !CR_Spamt = !CR_Spamt + rs1!Amount !CR_Upamt =!CR_Upamt + rs1!Amount .Update rs1.Edit rs1!TR_Note = T rs1.Update End If End With .MoveNext LoopEnd Withrs1.Closers2.Close

    - CH8

  • 8-2-5 1. FindFirst FindFirst rs.FindFirst CU_No = & cu & cu#FindNextFindLast

    - CH8

  • 8-2-5 ()2. MoveNextMovePreviousMoveFirstMoveLast3. rsRecordCount 4. rsFieldsCount 5. rs(i).Name

    - CH8

  • 8-2-5 ()6. rs()rs.Fields()rs.Fields.Item() rs(i)rs.Fields (i)rs.Fields.Item(i)i 0 rs(i)rs! rs(i)rs!= For For i = 0 To rs.Fields.Count 1 rs(i) ..Next i

    - CH8

  • 8-3 Access tblDa qryDa tblCmd

    - CH8

  • 8-3 () sqlDaSQL dtlData qryCmd

    - CH8

  • - CH8