DAO可以訪問本地數據庫和遠程數據庫。這裡指的本地和遠程並不是地理位置上的概念,它們是兩個邏輯概念。本地數據庫可以在本地計算機(物理)上,也可以不在本地計算機上,而遠程計算機也並不局限於遠程計算機(物理)上。
本地數據庫是通過文件系統訪問的數據庫,它可以放在本地計算機上,也可以放在網絡上,它由應用程序直接操作。而遠程數據庫只能由DBMS操作,應用程序對它的訪問通過DBMS來完成,這樣就產生了Client/Server體系結構,應用程序是Client端,DBMS是Server端。
Microsoft Jet是Microsoft Access和Visual Basic使用的一種數據庫引擎。在DAO3.1版本以前,DAO被定義為“Microsoft Jet引擎的編程接口”,也就是說,DAO和Jet在歷史上幾乎是同義詞。DAO訪問數據庫都要通過Microsoft Jet數據庫引擎來完成。當然,這兩個概念在內涵上是不一樣的,Jet不能被直接使用,只有通過DAO或Access才能直接使用Jet.
但是,DAO3.1之後增加了一項重要的功能,這就是ODBCDirect訪問。ODBCDirect使得DAO可以跳過Jet引擎,直接訪問ODBC數據源。正是由於有了這項功能,DAO不再綁定在Jet上了,DAO與Jet仍有千絲萬縷的聯系。一般來說,如果應用程序使用的是本地數據庫,那麼DAO一般都通過Jet來訪問數據庫,反之,如果使用的是遠程數據庫,那麼DAO通過ODBCDirect來訪問數據庫。
Jet是通過SQL來驅動的,但是這種SQL可能和通常的實現不太一樣。這種情況下可能會帶來好處,也有可能會帶來壞處。當使用DAO訪問數據庫時就必須考慮這種差別。因為Jet的SQL的運行和一些標准的SQL運行性能差異很大。考慮下面這個SQL語句:
SELECT * FROM Student,Teacher
WHERE Student.Course_No=Teacher.Course_No
在SQL SERVER中執行這個SQL語句時,SQLSERVER會在內部自動把Student表和Teacher表使用的最優化方式連接起來,即用Student表的Course_No域的值來索引Teacher表,因此,每讀取一條Student記錄,只需讀一條Teacher記錄,整個語句的執行共需讀取2*COUNT(Student)個記錄。
但是,同樣是這個語句,通過DAO和Jet來執行時,Jet會把兩個表進行笛卡爾連接,然後再濾掉一些不合格條件的記錄。這樣一來,每讀一條Student記錄,都必須讀取所有的Teacher記錄,即COUNT(Teacher)條Teacher記錄,整個語句的執行共需讀取COUNT(Student)*COUNT(Teacher)條記錄。如果這兩個表的數據龐大的話,這個語句的執行速度將令人不可忍受。