當前Microsoft 的最新數(shù)據(jù)訪問技術(shù) ActiveX Data Objects (ADO) 非常流行。ADO 是以前的 DAO、尤其是 RDO 數(shù)據(jù)訪問接口的一個替代,它提供了前兩者都不具備的附加功能。
本文主要討論如何把正使用 RDO 進行的數(shù)據(jù)訪問慮移植到 ADO 上,以便大家使用 ADO 轉(zhuǎn)換自己的應用程序。
一、ADO 和 RDO、DAO 的比較
ADO 并不是自動和您現(xiàn)存的數(shù)據(jù)訪問應用程序代碼兼容的。當 ADO 封裝 DAO 和 RDO 的功能性的時候,就必須將許多語言要素轉(zhuǎn)換為 ADO 語法。在某些情況下,您可以將現(xiàn)存代碼的某些功能做一個簡單轉(zhuǎn)換。在其他情況下,是用 ADO 的新功能重寫該應用程序。
DAO (Data Access Objects) 數(shù)據(jù)訪問對象是第一個面向?qū)ο蟮慕涌?,它顯露了 Microsoft Jet 數(shù)據(jù)庫引擎(由 Microsoft Access 所使用),并允許 Visual Basic 開發(fā)者通過 ODBC 象直接連接到其他數(shù)據(jù)庫一樣,直接連接到 Access 表。DAO 最適用于單系統(tǒng)應用程序或小范圍本地分布使用。
RDO (Remote Data Objects) 遠程數(shù)據(jù)對象是一個到 ODBC 的、面向?qū)ο蟮臄?shù)據(jù)訪問接口,它同易于使用的 DAO style組合在一起,提供了一個接口,形式上展示出所有 ODBC 的底層功能和靈活性。盡管 RDO 在很好地訪問 Jet 或 ISAM 數(shù)據(jù)庫方面受到限制,而且它只能通過現(xiàn)存的 ODBC 驅(qū)動程序來訪問關系數(shù)據(jù)庫。但是,RDO 已被證明是許多 SQL Server、Oracle 以及其他大型關系數(shù)據(jù)庫開發(fā)者經(jīng)常選用的接口。RDO 提供了用來訪問存儲過程和復雜結(jié)果集的更多和更復雜的對象、屬性,以及方法。
ADO 是 DAO/RDO 的后繼產(chǎn)物。ADO 2.0在功能上與 RDO 更相似,而且一般來說,在這兩種模型之間有一種相似的映射關系。ADO "擴展"了 DAO 和 RDO 所使用的對象模型,這意味著它包含較少的對象、更多的屬性、方法(和參數(shù)),以及事件。例如,ADO 沒有與 rdoEngine 和 rdoEnvironment 對象相等同的對象,可以顯露 ODBC 驅(qū)動程序管理器和 hEnv 接口。雖然您的接口可能是通過 ODBC OLE DB 服務提供程序?qū)崿F(xiàn)的,但您當前也不能從 ADO 中創(chuàng)建 ODBC 數(shù)據(jù)源。
包含在 DAO 和 RDO 模型中的許多功能被合并為單個對象,這樣就生成了一個簡單得多的對象模型。然而,由于這個原因,起初您可能會覺得找到合適的 ADO 對象、集合、屬性、方法,或事件非常困難。與 DAO 和 RDO不同的是,雖然 ADO 對象是分層結(jié)構(gòu)的,但在分層結(jié)構(gòu)范圍之外也是可以創(chuàng)建的。
不過,也應當注意,ADO 當前并不支持 DAO 的所有功能。ADO 主要包括 RDO 風格的功能性,以便和 OLE DB 數(shù)據(jù)源交互,另外還包括遠程和 DHTML 技術(shù)。
一般說來,在 ADO 的演化過程中,馬上把大多數(shù) DAO 應用程序移植到 ADO 上可能為時太早,因為當前的 ADO 并不支持數(shù)據(jù)定義 (DDL)、用戶、組,等等。不過,如果您只將 DAO 用于客戶-服務器應用程序,而并不依賴于 Jet 數(shù)據(jù)庫引擎或不使用 DDL,那么現(xiàn)在就可能移植到 ADO。最終,Microsoft 將提供一個 ADO DDL 部件來幫助進行 DAO 到 ADO 的移植,并為 OLE DB 供應商提供一般的 DDL 支持。
二、如何在 Visual Basic 中引用 ADO 2.0
要在 Visual Basic 中對 ADO 2.0 對象進行訪問,可設置對合適的 ADO 類型庫的訪問。有兩種 ADO 類型庫。一種叫 ADODB,包含在 MSADO15.DLL 中。它以"Microsoft ActiveX Data Objects 2.0 Library"出現(xiàn)在"工程"菜單中"引用..." 中。另一種叫做 ADOR,包含在 MSADOR15.DLL 中。它以"Microsoft ActiveX Data Objects Recordset 2.0 Library"出現(xiàn)在"引用..."對話框中。
在兩種類型庫中,第一種類型庫 (ADODB) 更大,具有更多功能;它包含了主要的 ADO 對象,而且可能在大多數(shù)情況下使用。第二種是只支持記錄集的 ADODB 類型庫的一個"輕量"子集。如果只想操作記錄集的話,就可以選擇使用該類型庫。
三、ADO 2.0 對象模型
ADO 2.0 對象模型由八個對象組成的,它們中的大多數(shù)在功能上和 RDO 對象相似,只不過具有更強的功能性而已。需要花一些時間在 Object Browser (F2) 中瀏覽對象模型,以便于熟悉各種不同屬性、方法、事件、集合等等所在的位置。
注意 所有后面帶有星號 (*) 的對象都是同時應用于 ADO Recordset 類型庫 (ADOR) 的對象。
· Command 對象 包含關于某個命令,例如查詢字符串、參數(shù)定義等的信息。Command 對象在功能上和 RDO 的 rdoQuery 對象是相似的。
· Connection 對象 包含關于某個數(shù)據(jù)提供程序的信息。Connection 對象在功能上和 RDO 的 rdoConnection 對象是相似的,并且包含了關于結(jié)構(gòu)描述的信息。它還包含某些 RDOEnvironment 對象的功能,例如 transaction 控件。
· Error 對象 包含數(shù)據(jù)提供程序出錯時的擴展信息。Error 對象在功能上和 RDO 的 rdoError 對象是相似的。
· Field 對象* 包含記錄集中數(shù)據(jù)的某單個列的信息。Field 對象在功能上和 RDO 的 rdoColumn 對象是相似的。
· Parameter 對象 包含參數(shù)化的 Command 對象的某單個參數(shù)的信息。該 Command 對象有一個包含其所有 Parameter 對象的 Parameters 集合。Parameter 對象在功能上和 RDO 的 rdoParameter 對象是相似的。
· Property 對象* 包含某個 ADO 對象的提供程序定義的特征。沒有任何等同于該對象的 RDO,但 DAO 有一個相似的對象。ADO 對象可以具有兩種屬性:
· Built-In 屬性:ADO 的"本地"屬性。也就是說,任何使用熟悉的 MyObject.Property 語法的新對象都可以立即使用的 ADO 中的屬性。Built-in 屬性并不在某個對象的 Properties 集合中以 Property 對象的形式出現(xiàn),因此盡管您可以修改它們的值,您卻不能修改它們的特性或?qū)⑺鼈儎h除。
· Dynamic 屬性:ADO 的非本地屬性,它們是由下一級數(shù)據(jù)提供程序定義的。它們出現(xiàn)在合適的 ADO 對象的 Properties 集合中。
例如,一個數(shù)據(jù)提供程序特有的屬性可能指明某個 Recordset 對象是支持事務還是支持更新。這些附加的屬性在 Recordset 的 Properties 集合中以 Property 對象的形式出現(xiàn)。Dynamic 屬性只能用 MyObject.Properties(0) 或 MyObject.Properties("Name") 語法通過集合來引用。不同的數(shù)據(jù)提供程序可能提供一個或多個特殊的屬性,來處理提供程序特有的操作。
· Recordset 對象* Recordset 對象包含某個查詢返回的記錄,以及那些記錄中的游標。Recordset 對象在功能上和 RDO 的 rdoResultset 對象相似。您可以在不用顯式地打開 Connection 對象的情況下,打開一個 Recordset(例如,執(zhí)行一個查詢)。不過,如果您選擇創(chuàng)建一個 Connection 對象,您就可以在同一個連接上打開多個 Recordset 對象。
本文主要討論如何把正使用 RDO 進行的數(shù)據(jù)訪問慮移植到 ADO 上,以便大家使用 ADO 轉(zhuǎn)換自己的應用程序。
一、ADO 和 RDO、DAO 的比較
ADO 并不是自動和您現(xiàn)存的數(shù)據(jù)訪問應用程序代碼兼容的。當 ADO 封裝 DAO 和 RDO 的功能性的時候,就必須將許多語言要素轉(zhuǎn)換為 ADO 語法。在某些情況下,您可以將現(xiàn)存代碼的某些功能做一個簡單轉(zhuǎn)換。在其他情況下,是用 ADO 的新功能重寫該應用程序。
DAO (Data Access Objects) 數(shù)據(jù)訪問對象是第一個面向?qū)ο蟮慕涌?,它顯露了 Microsoft Jet 數(shù)據(jù)庫引擎(由 Microsoft Access 所使用),并允許 Visual Basic 開發(fā)者通過 ODBC 象直接連接到其他數(shù)據(jù)庫一樣,直接連接到 Access 表。DAO 最適用于單系統(tǒng)應用程序或小范圍本地分布使用。
RDO (Remote Data Objects) 遠程數(shù)據(jù)對象是一個到 ODBC 的、面向?qū)ο蟮臄?shù)據(jù)訪問接口,它同易于使用的 DAO style組合在一起,提供了一個接口,形式上展示出所有 ODBC 的底層功能和靈活性。盡管 RDO 在很好地訪問 Jet 或 ISAM 數(shù)據(jù)庫方面受到限制,而且它只能通過現(xiàn)存的 ODBC 驅(qū)動程序來訪問關系數(shù)據(jù)庫。但是,RDO 已被證明是許多 SQL Server、Oracle 以及其他大型關系數(shù)據(jù)庫開發(fā)者經(jīng)常選用的接口。RDO 提供了用來訪問存儲過程和復雜結(jié)果集的更多和更復雜的對象、屬性,以及方法。
ADO 是 DAO/RDO 的后繼產(chǎn)物。ADO 2.0在功能上與 RDO 更相似,而且一般來說,在這兩種模型之間有一種相似的映射關系。ADO "擴展"了 DAO 和 RDO 所使用的對象模型,這意味著它包含較少的對象、更多的屬性、方法(和參數(shù)),以及事件。例如,ADO 沒有與 rdoEngine 和 rdoEnvironment 對象相等同的對象,可以顯露 ODBC 驅(qū)動程序管理器和 hEnv 接口。雖然您的接口可能是通過 ODBC OLE DB 服務提供程序?qū)崿F(xiàn)的,但您當前也不能從 ADO 中創(chuàng)建 ODBC 數(shù)據(jù)源。
包含在 DAO 和 RDO 模型中的許多功能被合并為單個對象,這樣就生成了一個簡單得多的對象模型。然而,由于這個原因,起初您可能會覺得找到合適的 ADO 對象、集合、屬性、方法,或事件非常困難。與 DAO 和 RDO不同的是,雖然 ADO 對象是分層結(jié)構(gòu)的,但在分層結(jié)構(gòu)范圍之外也是可以創(chuàng)建的。
不過,也應當注意,ADO 當前并不支持 DAO 的所有功能。ADO 主要包括 RDO 風格的功能性,以便和 OLE DB 數(shù)據(jù)源交互,另外還包括遠程和 DHTML 技術(shù)。
一般說來,在 ADO 的演化過程中,馬上把大多數(shù) DAO 應用程序移植到 ADO 上可能為時太早,因為當前的 ADO 并不支持數(shù)據(jù)定義 (DDL)、用戶、組,等等。不過,如果您只將 DAO 用于客戶-服務器應用程序,而并不依賴于 Jet 數(shù)據(jù)庫引擎或不使用 DDL,那么現(xiàn)在就可能移植到 ADO。最終,Microsoft 將提供一個 ADO DDL 部件來幫助進行 DAO 到 ADO 的移植,并為 OLE DB 供應商提供一般的 DDL 支持。
二、如何在 Visual Basic 中引用 ADO 2.0
要在 Visual Basic 中對 ADO 2.0 對象進行訪問,可設置對合適的 ADO 類型庫的訪問。有兩種 ADO 類型庫。一種叫 ADODB,包含在 MSADO15.DLL 中。它以"Microsoft ActiveX Data Objects 2.0 Library"出現(xiàn)在"工程"菜單中"引用..." 中。另一種叫做 ADOR,包含在 MSADOR15.DLL 中。它以"Microsoft ActiveX Data Objects Recordset 2.0 Library"出現(xiàn)在"引用..."對話框中。
在兩種類型庫中,第一種類型庫 (ADODB) 更大,具有更多功能;它包含了主要的 ADO 對象,而且可能在大多數(shù)情況下使用。第二種是只支持記錄集的 ADODB 類型庫的一個"輕量"子集。如果只想操作記錄集的話,就可以選擇使用該類型庫。
三、ADO 2.0 對象模型
ADO 2.0 對象模型由八個對象組成的,它們中的大多數(shù)在功能上和 RDO 對象相似,只不過具有更強的功能性而已。需要花一些時間在 Object Browser (F2) 中瀏覽對象模型,以便于熟悉各種不同屬性、方法、事件、集合等等所在的位置。
注意 所有后面帶有星號 (*) 的對象都是同時應用于 ADO Recordset 類型庫 (ADOR) 的對象。
· Command 對象 包含關于某個命令,例如查詢字符串、參數(shù)定義等的信息。Command 對象在功能上和 RDO 的 rdoQuery 對象是相似的。
· Connection 對象 包含關于某個數(shù)據(jù)提供程序的信息。Connection 對象在功能上和 RDO 的 rdoConnection 對象是相似的,并且包含了關于結(jié)構(gòu)描述的信息。它還包含某些 RDOEnvironment 對象的功能,例如 transaction 控件。
· Error 對象 包含數(shù)據(jù)提供程序出錯時的擴展信息。Error 對象在功能上和 RDO 的 rdoError 對象是相似的。
· Field 對象* 包含記錄集中數(shù)據(jù)的某單個列的信息。Field 對象在功能上和 RDO 的 rdoColumn 對象是相似的。
· Parameter 對象 包含參數(shù)化的 Command 對象的某單個參數(shù)的信息。該 Command 對象有一個包含其所有 Parameter 對象的 Parameters 集合。Parameter 對象在功能上和 RDO 的 rdoParameter 對象是相似的。
· Property 對象* 包含某個 ADO 對象的提供程序定義的特征。沒有任何等同于該對象的 RDO,但 DAO 有一個相似的對象。ADO 對象可以具有兩種屬性:
· Built-In 屬性:ADO 的"本地"屬性。也就是說,任何使用熟悉的 MyObject.Property 語法的新對象都可以立即使用的 ADO 中的屬性。Built-in 屬性并不在某個對象的 Properties 集合中以 Property 對象的形式出現(xiàn),因此盡管您可以修改它們的值,您卻不能修改它們的特性或?qū)⑺鼈儎h除。
· Dynamic 屬性:ADO 的非本地屬性,它們是由下一級數(shù)據(jù)提供程序定義的。它們出現(xiàn)在合適的 ADO 對象的 Properties 集合中。
例如,一個數(shù)據(jù)提供程序特有的屬性可能指明某個 Recordset 對象是支持事務還是支持更新。這些附加的屬性在 Recordset 的 Properties 集合中以 Property 對象的形式出現(xiàn)。Dynamic 屬性只能用 MyObject.Properties(0) 或 MyObject.Properties("Name") 語法通過集合來引用。不同的數(shù)據(jù)提供程序可能提供一個或多個特殊的屬性,來處理提供程序特有的操作。
· Recordset 對象* Recordset 對象包含某個查詢返回的記錄,以及那些記錄中的游標。Recordset 對象在功能上和 RDO 的 rdoResultset 對象相似。您可以在不用顯式地打開 Connection 對象的情況下,打開一個 Recordset(例如,執(zhí)行一個查詢)。不過,如果您選擇創(chuàng)建一個 Connection 對象,您就可以在同一個連接上打開多個 Recordset 對象。