☛ DAO 對象

DAO 是另一種 Access 數據訪問對象模型。從一開始,DAO 就一直包含在 Access 中。與 ADO 不同的是,DAO 對象是按照層次結構的形成排列的。特定的對象是其他對象的下級對象,如果沒有上級對象的實例,那麼它們無法存在。頂級 DAO 對象是 DBEngine,其他所有 DAO 對象都是 DBEngine 的子級,如下圖所示:

一般來講,DAO 層次結構嚴格遵循 Access 資料庫對象的排列形式。例如,Access 表 ( 即 TableDef 對象 ) 包含欄位 ( 每一個都是一個 Field 對象 )。欄位具有一組屬性,用於指定其詳細信息,包括數據類型、默認值和驗證規則等。

每種 DAO 對象還有一組適用於其對象類型的屬性。TableDef 對象可能具有一些與 QueryDef 通用的屬性,但每種對象都有特定於其對象類型的屬性。QueryDef 具有 Name 屬性,TableDef 也有該屬性,但 QueryDef 具有的 SQL 屬性是 TableDef 所沒有的。這種情況也適用於方法。每種 DAO 對象都有隻有它可以執行的操作。例如,QueryDef 定義的動作查詢具有 Execute 方法,但 TableDef 沒有該方法。對於 Access 開發人員來說,其所面臨的最大挑戰可能是瞭解適用於每種 DAO 對象的屬性和方法。

☛ DAO DBEngine 對象

DBEngine 對象是表示 ACE 引擎的對象,位於 DAO 層次結構的最頂級。它不是任何集合的成員,所有集合都是 DBEngine 的子級。該對象只有一個實例,它是爲數不多的幾個不能自行創建的數據訪問對象之一。在啓動 Access 併發出 DAO 操作時將打開 DBEngine 對象,它具有的屬性和方法較少。爲使屬性更改生效,必須在執行數據訪問對象操作之前發出它們,否則,你將接收到錯誤。由於 DBEngine 位於層次結構的最頂級,因此,幾乎總是以 DBEngine 開始 DAO 代碼序列。

注意

Access 2007 引入了 ACE ( Microsoft Access Engine ),這是一種適用於 Office 產品的新型資料庫引擎。正因爲有了 ACE 才使得 Access 2007 到 Access 2016 能夠支持諸如附件和多值字段之類的高級功能。由於這些新的數據類型,ACE 需要更新版本的 DAO ( 稱爲 ACEDAO ) 以支持新功能。DAO 與 ACEDAO 之間最大的差別是引入了 Recordset2 和 Field2 對象,以及支持 Access 2007 中引入功能所需的新屬性和方法。Access 2003 MDB 格式僅支持 DAO 3.6,不支持 ACEDAO。

☛ DAO Workspace 對象

Workspace 對象表示針對每個使用 Access 的用戶的一個打開的活動會話。所有資料庫都在一個工作區中打開,要麼作爲默認資料庫會話,要麼作爲使用 DBEngine 對象的 CreateWorkspace 方法創建的資料庫會話。

安全性也是通過 Workspace 對象來實現的 ( 不過僅適用於 MDB 文件格式 )。可用於 Workspace 對象的安全性方法允許你創建自己的安全性接口和例程。如有必要,可使用 Workspace 對象的 CreateUser 或 CreateGroup 方法創建用戶或羣組。

提示

如果選擇在應用程序中使用事務跟蹤 ( BeginTrans … EndTrans ),這些語句將包含在當前工作區中打開的所有記錄集。如果不希望對某個特定的記錄集使用事務,可創建一個新的工作區,並在新的 Workspace 對象中打開該記錄集。

☛ DAO Database 對象

Database 對象表示數據源,與 ADO Connection 對象類似。Access 可以直接打開很多不同的資料庫格式。當直接與 ACE 或 Jet 資料庫引擎結合使用時,資料庫可以是任意數量的數據源,例如另一個 ACCDB 或 ODBC 數據源。區別在於如何設置資料庫對象變量。

下面的代碼引用當前打開的 Access 資料庫:

Dim daDb As DAO.Database
Set daDb = CurrentDb

CurrentDb 是 Access Application 對象的一種方法,該對象表示整個 Access 環境及其所有對象。通過 CurrentDb 可以便捷地訪問用戶當前正在使用的資料庫。

還可以打開當前資料庫外部的 Access 資料庫,如下所示:

Dim daDb As DAO.Database
Set daDb = OpenDatabase("C:\Northwind.mdb")

請注意,OpenDatabase 方法接受指向現有 MDB 或 ACCDB 文件的路徑。OpenDatabase 方法可能會失敗,具體取決於外部 Access 資料庫是否可用,或者其當前狀態是否阻止從另一個 Access 應用程序打開。

與 ADO 對象一樣,請確保爲 DAO 對象類型聲明加上 DAO 前綴,以便 Access 可以明確在設置對象時使用哪個庫。

☛ DAO TableDef 對象

DAO TableDef 對象表示 Access 資料庫中的表。該表可能是本地表,也可能鏈接到當前資料庫。下面的代碼運行過程將創建一個 MyTempTable 的新表,並向其中添加三個文本欄位,然後將該表添加到當前資料庫的 TableDefs 集合。

Public Sub CreateNewTableDef()

    Dim daDb As DAO.Database
    Dim daTdf As DAO.TableDef

    Const sTABLENAME As String = "MyTempTable"
  
    Set daDb = Application.CurrentDb
  
    On Error Resume Next
      'Delete the new table because this is just a demonstration
      daDb.TableDefs.Delete sTABLENAME
    On Error GoTo 0

    ' Create a new TableDef object:
    Set daTdf = daDb.CreateTableDef(sTABLENAME)
  
    With daTdf
        ' Create fields and append them to the new TableDef
        .Fields.Append .CreateField("FirstName", dbText)
        .Fields.Append .CreateField("LastName", dbText)
        .Fields.Append .CreateField("Phone", dbText)
    End With
  
    ' Append the new TableDef object to the current database:
    daDb.TableDefs.Append daTdf
  
    daDb.Close
    Set daDb = Nothing
  
End Sub

注意,如果該表已經存在,則 CreateNewTableDef 運行過程會將其刪除,然後創建該表作爲一個新的 TableDef。如果資料庫已經存在同名的表,那麼 Access 無法將新的 TableDef 對象追加到其 TableDefs 集合。

TableDef 對象存儲在 TableDefs 集合中。下面代碼運行過程將顯示當前資料庫中所有 TableDef 對象 ( 包括隱藏的表和系統表 ) 的名稱:

Public Sub DisplayAllTableDefs()

    Dim daDb As DAO.Database
    Dim daTdf As DAO.TableDef
  
    Set daDb = CurrentDb
  
    With daDb
        Debug.Print .TableDefs.Count & " TableDefs in " & .Name
    
        For Each daTdf In .TableDefs
            Debug.Print , daTdf.Name
        Next daTdf
    End With
  
    daDb.Close
    Set daDb = Nothing
  
End Sub