DAO提供了兩種不同的對象模型,一種對象模型是通過Jet引擎來訪問數據,如下圖所示。另一種對象模型是通過ODBCDirect來訪問數據。這兩種對象模型都是層次結構的。現在分別對這兩種對象模型進行介紹。
DBEngine是一個基於對象,它包含了兩個重要的集合(Collection),一個是Errors集合,另一個是Workspaces集合。對DAO的操作總會產生一些錯誤,每產生一個錯誤,DAO就生成一個Error對象,這些Error對象都放在Errors集合中,可以用Errors.Count來計算錯誤的個數。事實上,對於每一個集合,都可以用Collection.Count來求出該集合中對象的個數。
每一個應用程序只能有一個DBEngine對象,但可以有多個Workspace對象,這些Workspace對象都包含在Workspace集合中。每個Workspace對象都包含了一個Database對象對應了一個數據庫,它裡面包含了許多用於操作數據庫的對象。這些對象中,有一些是Jet數據庫專用的,如Container、TableDef和Relation對象,有一些則是對所有數據庫都有用的,如Recordset對象和QueryDef對象。
下面對對象模型中的主要對象進行詳細的說明。
1.DBEngine對象
DBEngine對象是惟一的,不能創建,也不能聲明。通常,可以用DBEngine對象的屬性來設置數據庫訪問的安全性,即設置訪問數據庫缺省用戶名和缺省口令,如:
Dim DbEn AS DAO.DBEngine=New DAO.DBEngine()
DbEn.DefaultUser="RtLinux"
DbEn.DefaultPassword="aaa"
由於Jet數據庫引擎允許用戶定義一個工作組,對於工作組中的每一個用戶可以設置不同的數據庫訪問權限。必須把存儲這個工作組有關信息的文件告訴DAO,方法就是設置DBEngine對象的"SystemDB"屬性,如:
DbEn.SystemDB="C:\"&"System.mdw"
當使用Jet數據庫引擎時,必須把DBEngine對象的"DefaultType"屬性設置為"dbUseJet"。
DBEngine對象還提供了很多方法來操作工作區(Workspace)和數據庫,如:Creat Workspace方法創建一個工作區,Creatdatabase創建一個數據庫,OpenDatabase打開一個數據庫,CompactDatabase壓縮一個數據庫,RepairDatabase修復一個數據庫,等等。
2.Error對象
Error對象是DBEngine對象的一個子對象。在發生數據庫操作錯誤時,可以用標准的VB的Err對象來進行錯誤處理,也可以把錯誤信息保存在DAO的Error對象中。Error對象包含以下屬性:
(1)Description屬性。這個屬性包含了錯誤警告信息文本,如果沒有進行錯誤處理,這個文本將出現在屏幕上。
(2)Number屬性。這個屬性包含了產生錯誤的錯誤號。
(3)Source屬性。這個屬性包含了產生錯誤的對象名。
(4)HelpFile屬性和HelpContext屬性。這兩個屬性設置有關這個錯誤的Windows幫助文件和幫助主題。
3.Workspace對象
一個Workspace對象定義一個數據庫會話(Session)。會話描述出由Microsoft Jet完成的一系列功能,所有在會話期間的操作形成了一個事務范圍,並服從於由用戶名和密碼決定的權限。所有的Workspace對象組合在一起形成了一個Workspace集合。可以用DBEngine對象的CreateWorkspace方法畫創建一個新的工作區,只需把工作區的名稱和用戶信息傳遞給這個方法,如:
注意:當創建了一個新的Workspace對象時,它並不會自動添加到Workspace集合中,必須用Append方法把Workspace對象添加到Workspace集合中。
4.Database對象
一旦用CreateDatabase創建了一個數據庫或用OpenDatabase打開了一個數據庫,就生成了一個Database對象。所有的Database對象都自動添加到Database集合中。下面的這段代碼就是使用Database集合列出了所有的數據庫的路徑名:
db=ws.OpenDatabase(txtMDBFile.text)
Database對象有5個子集合,分別是Recordsets集合,QueryDefs集合,TableDefs集合,Relation集合和Containers集合,這些集合分別是Recordset對象、QueryDef對象、TableDef對象、Relation對象和Container對象的集合。Database對象提供一些方法來操縱數據庫和創建這些對象。
(1)Execute方法。執行一個SQL語句。這個SQL語句不僅可以操作數據庫中的數據,還可以是DLL,用來修改數據庫的結構。
(2)OpenRecordset方法。在數據庫中執行一個查詢,查詢可能涉及到表的連接,查詢的結果作為一個Recordset對象返回。
(3)CreateQuery方法。在數據庫中創建一個存儲過程並創建一個QueryDef對象。
(4)CreateRelation方法。創建一個Relation對象,定義兩個TableDef或QueryDef之間的關系。
(5)CreatTableDef方法。在數據庫中創建一個數據表,並返回一個TableDef對象。
5.Recordset對象
Recordset對象是使用最頻繁的一個對象,它代表了數據庫中一個表或一個查詢結果的記錄等。例如下面的語句在數據庫的第一表中添加一條記錄:
For Each tempdb In Workspace(0).Databases
Debug.Write("databases(x).Name=",temdb.Name)
Next
還可以在Recordset中任意移動當前的記錄的位置,使用的是Recordset對象MoveNext、MovePrevious、MoveFirst和MoveLast方法。
Recordset對象中還包含另一個對象--Field對象,這個對象代表了數據表的一個字段,用這個對象可以訪問數據表中的任何一個字段,如:下面的語句把表中當前記錄的Name字段值賦給變量sName:
Dim db As DAO.Database=ws.OpenDatabase("user","aaa")
SName=CStr(db.recordsets(0).Fields("name").value)
Source參數可以是一個表名,也可以是一個查詢的名字,還可以是一個用來創建Recordset對象的SQL語句。這個參數是必須的,而其他的三個參數是可選的。
Type參數是指Recordset的類型,這裡有必要說明一下Dynaset(動態集)和Snapshot(快照)之間的區別。Dynaset這種Recordset對象的功能強大,使用靈活,當Recordset被創建時,只有每個記錄的主鍵被取到且被緩存在本地,由於主鍵的大小總是小於整條記錄的大小,所以Dynaset創建的速度很快。在Dynaset創建以後,如果要查詢記錄,則用緩存的主鍵來進行查詢。相反,Snapshot則是把整條記錄都取出來存在本地,因此速度很慢,而且,如果別的用戶修改了數據庫,本用戶將無法看到這種改變。
6.TableDef對象
TableDef對象也是一個經常使用的對象,它有兩個子對象:一個是Field對象,另一個是Index對象。用TableDef對象可以訪問單個表的每個字段(Field對象)和表的索引(Index對象)。TableDef對象的一個重要的方法是CreateField。CreatField方法用來在表中創建一個新的字段,它的語法為:
Field=tabledef.CreateField(fieldname,fieldtype,fieldlength)
三個參數分別指明新增字段的字段名,字段類型和字段長度。
對於動態地創建一個新表或動態地修改表的結構時,這個對象是必不可少的。例如下面的語句創建一個只有字段的新表:
7.QueryDef對象
QueryDef對象用來定義一個查詢。它有兩個對象:一個是Field對象,一個是Parameter對象。用Database對象的CreateQueryDef方法來創建一個QueryDef對象。用戶可以在Jet對象模型中這樣使用QueryDef對象:
(1)用QueryDef對象的SQL屬性來設置或返回查詢的SQL語句的定義;
(2)用QueryDef對象的子對象Parameter來設置或返回查詢定義的參數;
(3)用QueryDef對象的Type屬性來設置查詢的類型,查詢的類型包括:從已有的表中取出記錄、創建一個新表、把一個表中的記錄插入到另一個表中、刪除記錄、更新記錄等;
(4)用對象的MaxRecords屬性來限制查詢返回的記錄數;
(5)用對象的ReturnRecords屬性取得查詢返回的記錄數;
(6)用對象的Execute方法來執行查詢;
(7)對象的RecordsAffected屬性來返回此查詢的所影響的記錄數;
(8)用對象ODBTimeout來設置查詢ODBC數據源時花費的最長時間;
(9)用對象的connect屬性來連接ODBC數據源進行查詢;
(10)用對象的OpenRecordset方法來返回Recordset對象,並用此recordset對象來取得查詢的結果。
8.Relation對象
Relation對象用來定義不同的表中或不同查詢中字段之間的關系。例如,定義一個表中的主鍵為另一個表的外鍵,定義一個表中的字段之間的一對一或一對多的關系等等。用Database對象的CreateRelation方法來創建一個Relation對象。
9.Field對象
Field對象是Jet對象模型中的最底層的對象,它代表了一個表中的一個字段。可以設置字段的各種屬性,如字段類型("Type"屬性)、字段長度("Size"屬性)、當前記錄中字段的值("Value"屬性)、字段的缺省值("DefaultValue"屬性)、字段是否可以為空("Required"屬性)等等。
10.Group對象和User對象
User對象代表了數據庫的一個用戶,Group對象則包含了具有相同權限的一組用戶。可以用這兩個對象來管理數據庫的用戶。下面給出了一個函數來創建用戶,使用這個函數時,必需具有創建用戶的權限。
ODBCDirect是一種不用加載Microsoft Jet數據庫引擎就可以操作ODBC數據庫服務器的技術。它是DAO3.5之後才增加的新特性。ODBCDirect提供了一種機制,使得DAO能把基於Jet的訪問變為基於RDO的訪問方法。但是,ODBCDirect並不能完全替代RDO。要在應用程序中使用ODBCDirect來訪問數據庫,只需要把下面這些話添加到應用程序的開始就可以了(任何使用DAO之前):
DbEngine.DefaultType=dbUseODBC
也可以在CreateWorkspace方法中指定dbUserODBC參數來使用ODBCDirect。如:
Dim wrkODBC as dao.Workspace=new dao.Workspaces(0)
Set wrkODBC=CreateWorkspace("ODBCWorkspace","admin","",dbUseODBC)
使用ODBCDirect的DAO對象模型和Jet對象模型大同小異,模型的層次結構圖如下:
與Jet對象模型相比,ODBCDirect去掉了用於數據庫定義的對象,如TableDef對象和Relation對象,但是新增Connection對象。Connection對象代表了和ODBC數據源的一個連接。一般用OpenConnect方法來建立一個連接並創建一個Connection對象。OpenConnection的語法如下:
conection=workspace.Openconnection(name,options,readonly,connect)
四個參數的含義和OpenDatabase方法的四個參數的含義一樣,在此就不再贅述了。請參閱前面講過的Opendatabase方法。
使用ODBCDirect操作ODBC數據源有如下一些優點:
(1)ODBCDirect通過提供對ODBC數據源的直接訪問,使程序代碼執行得更快、效率更高。因為它不需要加載Microsoft Jet數據庫引擎,所以在客戶端只需消耗較少的資源。ODBC服務器可以響應所有的查詢處理。
(2)ODBCDirect提供對特定服務器進行訪問的功能,這些訪問是Microsoft Jet使用ODBCA無法實現的。例如,對於支持光標集的服務器,ODBCDirect允許用戶指定光標集位置是在本地還是在服務器上。此外,也可以通過指定輸入值以及檢查返回值,來與服務器級別的存儲過程進行交互,這在Microsoft Jet中是不可以的。
(3)ODBCDirect支持數據的批量更新,可以將Recordset對象在本地的更改存入高速緩存,然後批理向服務器導出這些更改。
(4)使用ODBCDirect,既可以創建簡單的無游標集的結果集,也可以創建復雜的游標集。它也可以執行返回多個結果集的查詢,或是限制返回的行數,並監視所有遠程數據源生成的信息和錯誤,並不影響查詢的執行性能。
但是,ODBCDirect也有一些缺點。下面的一些功能就是ODBCDirect無法完成的,但是Microsoft Jet能夠完成的。
(1)可更新的連接。只有使用Microsoft Jet工作區才能更新基於多表連接的Recordset對象中的數據。
(2)異種連接。只有使用Microsoft Jet工作區才能執行不同數據源種的表連接。
(3)數據定義語言(DDL)的操作。只有使用Microsoft Jet工作區才能通過Dao進行DDL操作。ODBCDirect不提供TableDef對象,所以不能使用DAO來創建或修改表。不過,使用ODBCDirect可以通過執行SQL DDL語句來執行DDL操作。
(4)窗體和控件結合。如果應用程序需要將ODBC數據源種的數據與窗體相結合,就必須使用Microsoft Jet,在ODBCDirect工作區中訪問的數據不能與窗體或控件結合。
如果應用程序不需要上述功能,就可以使用ODBCDirect。
注意:可以在應用程序中同是定義Microsoft Jet和ODBCDirect工作區,並通過各種形式將它們組合起來。例如,在同一個函數中,可以定義Microsoft Jet工作區來使用DAO執行DDL操作,同時也可以定義ODBCDirect工作區來執行異步查詢。