遠程數據對象提供了一系列的對象,用來滿足遠程數據庫訪問的特殊要求。在ODBC API和驅動程序管理器之上,RDO實現了很薄的一個代碼層,用來連接、創建結果集和游標,並且使用盡可以少的工作站資源執行復雜的過程。如果代碼創建了ODBCDirect Workspace對象,那麼RDO也被DAO訪問,這在上一節中已經介紹過了。
利用RDO,應用程序不需要使用本地的查詢處理程序即可訪問ODBC數據源。這意味著,在訪問遠程數據庫引擎時,可以獲得更好的性能與更大的靈活性。
通過使用RDO,可以創建簡單的無游標結果集或更復雜的游標;可以執行查詢並處理任意數量的結果集;可以執行包括數據操作或數據定義運算在內的動作查詢;可以限制返回或處理的數據行數;還可以在不妨礙執行查詢的情況下,監視遠程數據資源產生的所有信息和錯誤;RDO還支持同步、異步或事件驅動的異步處理,因此,即使在執行冗長的查詢或重新定位當前指針時,應用程序也不會被阻塞。
RDO對象和集合的屬性描述了數據庫部件的特征,也描述了用來操縱它們的方法。在此總體框架下,可以在對象和集合之間建立聯系,這些聯系表示了數據庫系統的邏輯結構。RDO的對象模型如圖所示:
除了rdoEngine對象外,每個對象都保存在一個相關的集合中。在首次訪問實初始化RDO時,RDO自動創建一個rdoEngine和缺省的rdoEnvironments(0)實例。
遠程數據對象編程模式與數據訪問對象(DAO)編程模式在很多方面類似。但它的重點集中在處理存儲過程及其結果集上,而不是僅用在ISAM編程模式的數據訪問檢索方法上。下面逐一介紹RDO對象模型中的各個對象。
1.RdoEngine對象
這個對象是RDO對象模型中最基本的對象。在應用程序的第一次訪問RDO時,自動創建rdoEngine對象。這個對象不能由用戶顯式地創建或聲明。RdoEngine對象和DAO的DBEngine對象類似。
2.RdoError對象
RdoError對象用於處理RDO所產生的所有的ODBC錯誤和消息,當錯誤發生時,這個對象自動被創建。RdoError對象和DAO的Error對象類似。
3.RdoEnvironment對象
RdoEnvironment對象為特定的用戶名定義了連接及事務作用域的一個邏輯集合。包括打開的和分配的(但未打開)連接,提供了並發事務的機制,並且為數據庫的數據操作語言(DML)提供了安全的上下文,在應用程序第一次訪問RDO時,自動創建了一個RdoEnvironment對象並把它加到RdoEnvironments集合中,用RdoEnvironment(0)來引用它。這個RdoEnvironment對象是缺省的對象,也可以在程序中顯式地創建RdoEnvironment對象,如果程序中沒有另外創建新的RdoEnvironment對象,應用程序使用RdoEnvironments(0)。
用rdoEngine的rdoCreateEnvironment方法來創建一個新的RdoEnvironment對象:
var=rdoEngine.RdoCreateEnvironment(Name,UserName,Password)
其中Name參數是RdoEnvironment對象的名字,UserName和Password參數分別是連接ODBC數據源的用戶名和密碼。它們是RdoEnvironment對象的屬性。
RdoEnvironment對象和DAO的Workspace對象類似。
4.RdoConnection對象
RdoConnection對象表示遠程數據源和該數據源上特定的數據庫之間打開的一個連接,或者是一個已分配但仍未連接的對象,該對象可用於隨後建立的一個連接。
可以用RdoEnvironment對象的OpenConnection方法來創建一個RdoConnection對象並建立一個連接。
Connection=rdoEnvironment.OpenConnection(dsname[,prompt[,readonly[,connect[options]]]])
RdoConnection對象和DAO的Connection對象類似,因此,上面這個方法的參數含義和前面介紹的一樣。
例如,下面的語句展示了應用程序和數據源WorkDB建立一個連接,連接時提示用戶輸入用戶名和密碼:
以上講的都是有DSN的連接,用RDO還可以創建沒有DSN的連接。創建沒有DSN的連接可以簡化客戶應用程序的設置和安裝、加快連接速度、提高安全性。創建沒有DSN的連接時,必須把OpenConnection的dsName參數設置為空串,而且在Connect串中,DSN參數必須在SERVER和DRIVER參數之後。例如下面的語句創建一個沒有DSN的連接:
RdoConnection對象和dao的Database類似。
5.RdoTable對象
RdoTable對象表示一個基本表或SQL視圖的存儲定義。使用這個對象可以管理數據庫的結構。當已經和數據源建立了連接之後,數據源中的每個基本表或SQL視圖都成為一個RdoTable對象而加入到RdoTables集合中。添加表、刪除表或修改表的結構就是對RdoTable對象的操作,如下面代碼列出了數據源中的所有表的名字:
6.RdoResultset對象
RdoResultset對象表示運行一個查詢所產生的數據行。這個對象是RDO編程中最常用的對象。當執行一次查詢時,查詢結果就放在結果集中。一個結果集可以包含數據庫中一個或多個表中的字段。根據游標類型的不同,可以有4種不同類型的RdoResultset對象:
(1)記錄只能向前移動的結果集(Forward Only)。在這種結果集中,每一行數據都能訪問到,但是記錄移動只能使用MoveNext方法來從前往後移動。
(2)靜態類型的結果集(Static-Type)。它可以用來查找數據或產生報表的記錄的一個靜態拷貝。如果數據源能夠修改,那麼靜態結果集也能被修改。
(3)鍵集(Keyset-Type)類型的結果集。這種結果集可以包含可修改的行,在這種結果集中移動是不受限制的。這種結果集可以動態地添加、修改和刪除記錄。它的成員是固定的。
(4)動態類型的結果集(Dynamic-Type).這種結果集可以包含可修改的行,可以動態地添加、修改和刪除記錄,而且,它的成員是不固定的。
可以用rdoQuery對象或rdoConnection對象的OpenResultset方法來創建一個RdoResultset對象。
在創建了RdoResultset之後,就可以訪問其中的數據了。在處理結果集時,需要注意以下幾點:
(1)如果該結果集以游標的形式創建,必需盡快將結果置入結果集,因為游標所取得的數據行和頁可能被遠程數據庫引擎鎖定。直到定位到最後一行時該結果集才算完成置入。
(2)在很多情況下,無游標的結果集更為有效。RdoResultset對象的功能以滿足需求為宜,不要具有多余的特性。例如,如果並不需要使用游標修改數據,就不要請求允許更新的結果集。如果僅僅要置入到一個列表框中,可以任意滾動的游標也是不必要的。
(3)考慮使用無游標的結果集和動作查詢來執行更新。在很多情況下,這種方法能夠提高性能。盡管實現起來更復雜一些,在不能直接訪問基本數據時,可以采用這種方法。
(4)盡可能地使用異步操作和事件過程,以避免應用程序被鎖死,至少能夠減少這種可能性。也可以異步處理Move方法,例如使用MoveLast,防止在置入到結果集時被鎖死。
(5)復雜的結果集處理創建幾個小的結果集,這常常會使速度更快,而且可以更好地管理系統資源。
(6)盡可能從存儲過程產生結果集,因為這樣可以提高服務器、網絡和工作站的效率,並使應用程序的開發更為簡單。
(7)從連接上斷開已有的,以客戶端的批處理游標的形式創建的RdoResultset對象。可以繼續使用Edit或AddNew方法修改數據。當准備將所作的修改傳回數據庫時,可以將其ActiveConnection對象設置為一個打開的rdoConnection對象,從而將RdoResultset關聯到一個打開的連接上。
RdoResultset對象和DAO的Recordset對象類似。
7.RdoQuery對象
RdoQuery對象是一個查詢SQL定義,可以包括0個或多個參數。可以用rdoConnection對象的CreateQuery方法來創建一個新查詢,如:
8.Rdocolumn對象
Rdocolumn對象表示具有公共數據類型和公共屬性的一系列數據。這個對象是rdoTable、rdoQuery、rdoResultset對象的子對象。可以使用該對象的"Value"屬性來訪問某一列的值,也可以使用該對象的"Type"屬性或"Size"屬性來修改數據庫中表的結構。
Rdocolumn對象和DAO的Field對象相似。
9.RdoParameter對象
RdoParameter對象對象表示與rdoQuery對象關連的一個參數。查詢參數可以是輸入、輸出或輸入輸出參數。這個對象在進行帶參數查詢時自動創建。可以用rdoParameter對象的"Direction"屬性來設置參數類型:輸入參數(rdParamReturn Value)。例如下面的代碼執行一個帶有4個參數的SQL語句。
10.RdoPrepareStatement對象
這個對象預先定義了一個查詢。它已經過時,只是為了保持與以前的RDO版本兼容才保留這個對象。在RDO2.0之後,應該使用rdoQuery對象。