Presentation is loading. Please wait.

Presentation is loading. Please wait.

主從式資料庫系統 - CH8 1 第 8 章 DAO 物件應用和程式設計. 主從式資料庫系統 - CH8 2 本章宗旨 簡介 DAO 物件之引用方式 簡介 DAO 物件之各項資料操作指令 介紹資料表自動連入與移除之處理方式 介紹 VBA 資料庫操作指令與程序檔建檔範例 介紹事件導向之程式設計風格 介紹多功能整合式表單之設計方式.

Similar presentations


Presentation on theme: "主從式資料庫系統 - CH8 1 第 8 章 DAO 物件應用和程式設計. 主從式資料庫系統 - CH8 2 本章宗旨 簡介 DAO 物件之引用方式 簡介 DAO 物件之各項資料操作指令 介紹資料表自動連入與移除之處理方式 介紹 VBA 資料庫操作指令與程序檔建檔範例 介紹事件導向之程式設計風格 介紹多功能整合式表單之設計方式."— Presentation transcript:

1 主從式資料庫系統 - CH8 1 第 8 章 DAO 物件應用和程式設計

2 主從式資料庫系統 - CH8 2 本章宗旨 簡介 DAO 物件之引用方式 簡介 DAO 物件之各項資料操作指令 介紹資料表自動連入與移除之處理方式 介紹 VBA 資料庫操作指令與程序檔建檔範例 介紹事件導向之程式設計風格 介紹多功能整合式表單之設計方式 簡介 DAO 物件設計 API 之進階應用- SQL 指令集管理

3 主從式資料庫系統 - CH8 3 大 綱 8-1 前置處理 8-2 DAO 指令簡介 8-3 進階應用

4 主從式資料庫系統 - CH8 4 8-1 前置處理 DAO 為 Data Access Object 之縮血寫 DAO 物件大都以 VBA 語言來設計程序或函數, 再以這些程序和函數來處理資料。完成程序設 計後,還需要將 DAO 物件引入,程序檔方能正 常執行

5 主從式資料庫系統 - CH8 5 8-1 前置處理 ( 續 ) 引用過程 開啟任一表單在設計模式 點選主功能表【檢視】、【程式碼】 點選程式碼視窗【工具】、【設定引用項目 (R) 】 出現設定引用項目視窗後,捲動可引用項目,請勾 選【 Microsoft DAO 3.6 Object Library 】 按下優先權方向鍵,將前述選項往上移至頂端 按【確定】鈕,結束引用過程

6 主從式資料庫系統 - CH8 6 8-1 前置處理 ( 續 ) 引用結果

7 主從式資料庫系統 - CH8 7 8-2 DAO 指令簡介 8-2-1 資料庫連結 8-2-2 紀錄集開啟指令語法 8-2-3 查詢介面建立與執行 8-2-4 資料處理程序 8-2-5 紀錄及欄位操作指令說明

8 主從式資料庫系統 - CH8 8 8-2-1 資料庫連結 DAO 與其他資料庫連結方式 直接以連線物件連結,資料在伺服端處理 直接以連線物件連結,資料在主控端處理 透過資料庫引擎,搭配 ODBC 將資料表連入 Access

9 主從式資料庫系統 - CH8 9 資料庫連結比較 連線方式連線方法資料處理 區 紀錄搜尋方法查詢介面 連線物件 OpenConnectiondbUseOD BC 使用 SQL 之 Where 子句 可建立暫時性查詢 但不能指名 連線物件 OpenDatabasedbUseJet/ dbUseOD BC 使用 Find 可建立暫時性查詢 但不能指名 資料庫引擎 TransferDatabasedbUseJet 使用 Find 可建立暫時性查詢 且能指名

10 主從式資料庫系統 - CH8 10 1. 以 TransferDatabase 指令連結資 料表 1.1 TransferDatabase 指令 語法: Docmd.TransferDatabase 參數一,參數二, 參數三,參數四,參數五,參數六,參數七 參數一:連結型態,分別是 acLink, acImport, acExport ,請選用【 acLink 】 參數二:資料庫類型,請選用【 ODBC 資料庫】 參數三:資料庫名稱,須包含路徑或連結字串

11 主從式資料庫系統 - CH8 11 1. 以 TransferDatabase 指令連結資 料表 ( 續 ) 參數四:資料類型,請選用【 acTable 】 參數五:來源資料名稱,請輸入【資料表名稱】 參數六:目的資料名稱,請輸入【資料表名稱】 參數七:只含資料結構,請輸入【 False 】

12 主從式資料庫系統 - CH8 12 1. 以 TransferDatabase 指令連結資 料表 ( 續 ) 應用範例 DoCmd.TransferDatabase acLink, "ODBC 資料庫 ", "ODBC; Driver={MySQL ODBC 3.51 Driver}; Server=Localhost; Database=mysal; UID= 帳號 ; PWD= 密碼 ; Option=3 ", acTable, “cuinfo”, “cuinfo”, False 或改用 DoCmd.TransferDatabase acLink, "ODBC 資料庫 ", "ODBC; DSN= 資料來源名稱 ; Database=mysal; UID= 帳 號 ; PWD= 密碼 ; Option=3 ", acTable, “cuinfo”, “cuinfo”, False

13 主從式資料庫系統 - CH8 13 1. 以 TransferDatabase 指令連結資 料表 ( 續 ) 範例說明 帳號和密碼,輸入要登錄 MySQL 之對應帳號和 密碼 資料來源名稱則為 ODBC 資料管理員之設定名 稱 設定 DSN 時,可以單獨指定 Name 和 Host 參數, 帳號、密碼和資料庫名稱三項參述則在前述指 令內加入亦可,如此可提高系統安全性 上述指令可加入在表單介面內,然後搭配 On Open 事件程序使用

14 主從式資料庫系統 - CH8 14 1.1 以公用程序連結資料表 首先點取【模組物件】、【新增】,新增一個名稱叫 conModule 之模組。 在模組內新增一個名稱叫【 LinkTable 】之公用程序, 完整指令如下: 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, False End Sub

15 主從式資料庫系統 - CH8 15 1.1 以公用程序連結資料表 ( 續 ) 在處理資料之表單介面適當位置 ( 例如 On Open 事件 ) 加入下列指令,即可連結資料表: Call LinkTable(“ 資料庫名稱 ”,” 資料表名稱 ”) 例如: Call LinkTable(“mysal”,”cuinfo”)

16 主從式資料庫系統 - CH8 16 1.2 移除連結資料表 可直接在資料表物件容器點取對應資料表,然 後按刪除鍵,或是 以程序檔在應用程式介面內將連結資料表移除 應用範例:在 conModule 模組內新增一個名稱 叫 dlTmptbl 之公用程序

17 主從式資料庫系統 - CH8 17 dlTmptbl 程式內容 1. Public Sub dlTmptbl(tbn As String) 2. Dim tbl As TableDef 3. Dim db As Database 4. Set db = CurrentDb 5. With db 6. For Each tbl In db.TableDefs 7. If tbl.Name = tbn Then 8. db.TableDefs.Delete tbl.Name 9. Exit For 10. End If 11. Next tbl 12. End With 13. End Sub

18 主從式資料庫系統 - CH8 18 dlTmptbl 程式應用 在主功能表之 On Close 事件程序加入下列 指令,就可以自動移除連結資料表 1. Dim db as database 2. Dim rs as recordset 3. Set db = currentdb 4. Set rs=db.OpenRecordset(“Select * From sysTable Where database= ’mysal’”)

19 主從式資料庫系統 - CH8 19 dlTmptbl 程式應用 ( 續 ) 5. With rs 6. Do while not.EOF 7. Call dlTmptbl(rs!Table) 8..movenext 9. Loop 10. End With 11. rs.close

20 主從式資料庫系統 - CH8 20 1.3 開啟資料表 指令 方法一: Set rs = db.OpenRecordset("cuinfo") 方法二: Set rs = db.OpenRecordset("Select * From cuinfo") 方法三: Set qry = db.CreateQueryDef(" 查詢名稱 ", "SQL 指 令 ") Set rs = qry.OpenRecordset()

21 主從式資料庫系統 - CH8 21 1.3 開啟資料表 ( 續 ) 應用說明 此方式開啟之紀錄集,不能直接連結至 Access 之其他介面,只能以 DAO 物件提供之方法操作 紀錄 指定名稱建立查詢時,該查詢介面可儲存在 Access 查詢物件內,且該查詢介面可以直接連 結至表單介面

22 主從式資料庫系統 - CH8 22 1.4 操作資料庫及處理資料 使用 SQL 指令操作資料庫及處理資料 Dim qry As QueryDef Set qry = db.CreateQueryDef("", "SQL 指令 ") qry.Execute

23 主從式資料庫系統 - CH8 23 2. 使用 OpenDatabase 方法 此方法須建立一個工作區,作為主從端對話空 間 連結指令: 語法: Set workspace = CreateWorkspace(name, user, password, type) Set database = workspace.OpenDatabase (dbname, options, read-only, connect)

24 主從式資料庫系統 - CH8 24 2. 使用 OpenDatabase 方法 ( 續 ) 其中各項變數之意義 : Workspace :工作區物件變數 name :工作區名稱,只建立一個工作區時,可不指名 user :工作區帳號,通常使用預設值 ”Admin” ,非 MySQL 之登入帳號。 password :密碼,可缺設 type :使用 dbUseJet( 主控端 )| 或是 dbUseODBC( 伺服端 ) dbname :資料庫名稱 (Jet) 或是資料來源名稱 (ODBC) Options :選項常數

25 主從式資料庫系統 - CH8 25 2. 使用 OpenDatabase 方法 ( 續 ) Options :可使用下列常數值 dbDriverNoPrompt :預設以 dbname 和 connection string 與伺服器連線,若連線資訊不足時將提示錯誤 dbDriverPrompt :連線時將提示 DSN 對話框,若處理人 員未選取 DSN ,則以預設之 DSN 資訊來連結 dbDriverComplete :此為預設值,假設連線字串已包含 足夠的連線資訊 dbDriverCompleteRequired :與 dbDriverComplete 類似, 除了 ODBC 驅動程式無法提示足夠的連線資訊時 read-only :唯讀屬性 connect :連線字串

26 主從式資料庫系統 - CH8 26 2.1 應用範例 在模組內新增一公用程序 - openDB ,指令如下: 1. Public ws As Workspace 2. Public db As Database 3. Public As Recordset 4. Public Sub openDB() 5. Dim str As String 6. Set ws = DBEngine.CreateWorkspace("", “Admin", "", dbUseJet) 7. str = "ODBC; DRIVER={MySQL ODBC 3.51 Driver}; SERVER = localhost; DATABASE=mysal; UID= 帳號 ; PWD= 密碼 ; OPTION=3“ 8. Set db = ws.OpenDataBase(" 資料來源 ", dbDriverNoPrompt, False, str) 9.End Sub

27 主從式資料庫系統 - CH8 27 2.1 應用範例 ( 續 ) 在主功能表之 On Open 事件程序加入下列指令, 就可以自動建立連線物件 Call openDB 資料表開啟與處理方法與第一種連結方式相同, 但是建立查詢介面時,不能指定介面名稱

28 主從式資料庫系統 - CH8 28 8-2-2 紀錄集開啟指令 1. 語法 搭配連線物件或資料庫物件 語法: Set recordset = object.OpenRecordset ( 資料源, 型 態, 選項, 讀寫模式 ) 範例: Set rs = con.OpenRecordset( 引數串列 ) Set rs = db.OpenRecordset( 引數串列 )

29 主從式資料庫系統 - CH8 29 1. 語法 ( 續 ) 搭配查詢、紀錄集或資料表 語法: Set recordset = object.OpenRecordset ( 型態, 選項, 讀寫模式 ) 範例: Set rs = qry.OpenRecordset( 引數串列 )

30 主從式資料庫系統 - CH8 30 2. 各項參數之用法 資料源:可以是資料表或是 SQL 指令 型態:可選用下列常數 dbOpenTable :開啟資料表型式之紀錄集 ( 適用於 dbUseJet) dbOpenDynamic :開啟動態型之紀錄集 ( 適用於 dbUseODBC) dbOpenDynaset :開啟動態集之紀錄集,類似 ODBC keyset 紀錄指標 dbOpenSnapshot :開啟快照型之紀錄集, 類似 ODBC static 紀錄指標 dbOpenForwardOnly :開啟前導型之紀錄集

31 主從式資料庫系統 - CH8 31 2. 各項參數之用法 ( 續 ) 註: 若未指定型態, dbUseJet 預設為資料表型 若搭配物件為資料表或查詢,則預設為動態集 dbUseODBC 預設為前導型。

32 主從式資料庫系統 - CH8 32 2. 各項參數之用法 ( 續 ) 可選用下列常數選項 dbAppendOnly :新增紀錄,但不能編輯和刪 除 ( 適用於 dbUseJet 之 dynaset 紀錄集 ) dbSQLPassThrough :傳送一道 SQL 指令至伺 服端 ( 適用於 dbUseJet 之 snapshot- 紀錄集 ) dbSeeChanges :在多人使用環境下,有人試 圖變更他人正在編輯的資料,立即產生錯誤信 息 ( 適用於 dbUseJet 之 dynaset 紀錄集 )

33 主從式資料庫系統 - CH8 33 2. 各項參數之用法 - 選項 dbDenyWrite :預防他人修改或新增紀錄 ( 適用於 dbUseJet 紀錄集物件 ) dbDenyRead :預防他人讀取紀錄 ( 適用於 dbUseJet 之 table 紀錄集 ) dbRunAsync :非同步查詢 ( 適用於 ODBCDirect 工 作區 )

34 主從式資料庫系統 - CH8 34 2. 各項參數之用法 - 選項 dbExecDirect :執行查詢時,跳過 SQLPrepare 直 接叫用 SQLExecDirect ( 適用於 ODBCDirect 工作 區 ) ,當紀錄未以參數式查詢開啟時,需搭配此項 參數 dbInconsistent :允許不一致更新資料 ( 適用於 dbUseJet 之 dynaset 與 snapshot 紀錄集 ) dbConsistent :允許一致更新資料 ( 適用於 dbUseJet 之 dynaset 與 snapshot 紀錄集 )

35 主從式資料庫系統 - CH8 35 2. 各項參數之用法 - 讀寫模式 dbReadOnly :唯讀模式 (ODBCDirect 工作區預設模式 ) , 此模式不能同時出現在選項和讀寫參數設定 dbPessimistic :當下達 Edit 指令後,立即將包含該紀錄 之資料頁鎖定 (Jet 工作區預設模式 ) dbOptimistic :當下達 Update 指令後,才將包含該紀錄 之資料頁鎖定 (Jet 工作區預設模式 ) dbOptimisticValue :以記錄為單位樂觀型更新資料 ( 適用 於 ODBCDirect 工作區 ) dbOptimisticBatch :允許以批次方式樂觀型更新資料 ( 適 用於 ODBCDirect 工作區 )

36 主從式資料庫系統 - CH8 36 8-2-3 查詢介面建立與執行 1. 查詢介面建立語法 語法: Set qry = object.CreateQueryDef (name, sqltext) qry :查詢物件變數 object :資料來源物件,可以是連線物件或是資料 庫物件

37 主從式資料庫系統 - CH8 37 1. 查詢介面建立語法 ( 續 ) name :查詢介面名稱 若 object 為連線物件或是資料庫物件時(只適用於 dbUseJet ),不得指定名稱 若為連結型資料表(以 TransferDatabase 連線者), 可以指定名稱,也可以缺設 指定名稱時,不可以和查詢物件內的其他介面同名 sqltext : SQL 指令敘述,建立 qry 物件時可缺設, 然後在他處設定 qry.SQL 之屬性值即可

38 主從式資料庫系統 - CH8 38 2. 查詢介面執行語法 若屬選取型 (Select) 之查詢介面,可直接連結至 表單來查看資料 或是以下列指令來開啟一個紀錄集 Set rs = qry.OpenRecordset() 若屬動作型 ( 如 Insert, Update, Delete 等 ) 之查詢 介面,可以使用下列指令來處理資料 qry.Execute options

39 主從式資料庫系統 - CH8 39 2. 查詢介面執行語法 ( 續 ) 其中 options 有下列常數選項: dbDenyWrite :預防他人寫入資料 ( 只適用於 Jet 工 作區 ) dbInconsistent :預設值,不一致的更新資料 ( 只適 用於 Jet 工作區 ) dbConsistent :一致型更新資料 ( 只適用於 Jet 工作 區 ) dbSQLPassThrough :將 SQL 傳送給伺服端去處理 資料 ( 只適用於 Jet 工作區 )

40 主從式資料庫系統 - CH8 40 2. 查詢介面執行語法 ( 續 ) dbFailOnError :處理資料發生錯誤時,倒捲回原 始狀態 ( 只適用於 Jet 工作區 ) dbSeeChanges :在多人使用環境下,有人試圖變 更他人正在編輯的資料,立即產生錯誤信息 ( 只適 用於 Jet 工作區 ) dbRunAsync :非同步處理資料 ( 適用於 ODBCDirect 工作區 ) dbExecDirect :使用於未以 SQLPrepare 方式呼叫 ODBC 介面方法 ( 適用於 ODBCDirect 連線物件之查 詢介面 )

41 主從式資料庫系統 - CH8 41 8-2-4 資料處理程序 新增紀錄 指令 : rs.AddNew :新增一筆空白紀錄 ( 在記憶體 ) rs.Update :將記憶體資料寫回磁碟 rs!CU_Tel = Me!CU_Tel :將表單控制項資料置 入紀錄集之對應欄位 Me!CU_Tel = rs!CU_Tel :將紀錄集之欄位資 料置入表單控制項

42 主從式資料庫系統 - CH8 42 8-2-4 資料處理程序 ( 續 ) 查詢紀錄 搜尋紀錄指令: rs.FindFirst 範例: rs.FindFirst "CU_No ='" & Me!CU_No & "'“ 找次筆指令: rs.FindNext 判斷未找到: rs.Nomatch

43 主從式資料庫系統 - CH8 43 8-2-4 資料處理程序 ( 續 ) 刪除記錄 指令: rs.Delete 刪除資料時,最好能提示處理人員 Style = vbYesNo + vbCritical + vbDefaultButton2 rps = MsgBox(" 刪除紀錄嗎 ?", Style, " 刪除紀錄 ") If rps = vbYes Then rs.Delete End If

44 主從式資料庫系統 - CH8 44 8-2-4 資料處理程序 ( 續 ) 儲存 / 編輯紀錄 指令: rs.Edit :執行編輯資料 ( 記憶體 ) rs.Update :將記憶體資料寫回磁碟

45 主從式資料庫系統 - CH8 45 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

46 主從式資料庫系統 - CH8 46 更新資料、轉檔或批次刪除資料 使用紀錄集操作方法, 範例: 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

47 主從式資料庫系統 - CH8 47 使用紀錄集操作方法 ( 續 ) 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 Loop End With rs1.Close rs2.Close

48 主從式資料庫系統 - CH8 48 8-2-5 紀錄及欄位操作指令說明 1. 搜尋紀錄指令: FindFirst 語法: FindFirst 參數一 參數二 參數三 說明:參數一為欄名,參數二為關係運算子,參數三為欄位 值 範例: rs.FindFirst “CU_No = ‘” & cu & “’” ,因為 cu 為字串變 數,所以前後需加上單引號,若為日期變數則前後要加上 # , 若為數值則直接代入變數 搜尋次筆,語法: FindNext 搜尋末筆,語法: FindLast

49 主從式資料庫系統 - CH8 49 8-2-5 紀錄及欄位操作指令說明 ( 續 ) 2. 移動紀錄指令 移次筆,語法: MoveNext 移上筆,語法: MovePrevious 第一筆,語法: MoveFirst 最末筆,語法: MoveLast 3. 計算紀錄筆數 語法: rs . RecordCount ,回傳結果為長整數 4. 計算欄位數 語法: rs . Fields . Count ,回傳結果為整數 5. 取得欄名語法: rs(i).Name

50 主從式資料庫系統 - CH8 50 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

51 主從式資料庫系統 - CH8 51 8-3 進階應用 使用一個表單作為資料查詢介面,資料來源將 伺服端資料表直接連入 Access 查詢介面將使用下列元件: 組合方塊一:命名為【 tblDa 】,標籤抬頭提示 為【資料表】 組合方塊二:命名為【 qryDa 】 ,標籤抬頭提 示為【查詢表】 指令按鈕一:命名為【 tblCmd 】,標籤抬頭提 示為【查看資料表】

52 主從式資料庫系統 - CH8 52 8-3 進階應用 ( 續 ) 文字方塊:命名為【 sqlDa 】,標籤抬頭提示為 【 SQL 指令】 子表單:命名為【 dtlData 】,標籤抬頭提示為 【資料明細】 指令按鈕二:命名為【 qryCmd 】,標籤抬頭提 示為【查看查詢表】 各控制項指令明細請看書本範例

53 主從式資料庫系統 - CH8 53 測試成果


Download ppt "主從式資料庫系統 - CH8 1 第 8 章 DAO 物件應用和程式設計. 主從式資料庫系統 - CH8 2 本章宗旨 簡介 DAO 物件之引用方式 簡介 DAO 物件之各項資料操作指令 介紹資料表自動連入與移除之處理方式 介紹 VBA 資料庫操作指令與程序檔建檔範例 介紹事件導向之程式設計風格 介紹多功能整合式表單之設計方式."

Similar presentations


Ads by Google