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