遠端資料物件提供了一系列的對象,用來滿足遠端資料庫訪問的特殊要求。在ODBC API和驅動程式管理器之上,RDO實現了很薄的一個代碼層,用來串連、建立結果集和遊標,並且使用盡可以少的工作站資源執行複雜的過程。如果代碼建立了ODBCDirect Workspace對象,那麼RDO也被DAO訪問,這在上一節中已經介紹過了。
利用RDO,應用程式不需要使用本地的查詢處理常式即可訪問ODBC資料來源。這意味著,在訪問遠端資料庫引擎時,可以獲得更好的效能與更大的靈活性。
通過使用RDO,可以建立簡單的無遊標結果集或更複雜的遊標;可以執行查詢並處理任意數量的結果集;可以執行包括資料操作或資料定義運算在內的巨集指令查詢;可以限制返回或處理的資料行數;還可以在不妨礙執行查詢的情況下,監視遠端資料資源產生的所有資訊和錯誤;RDO還支援同步、非同步或事件驅動的非同步處理,因此,即使在執行冗長的查詢或重新置放當前指標時,應用程式也不會被阻塞。
RDO對象和集合的屬性描述了資料庫組件的特徵,也描述了用來操縱它們的方法。在此總體架構下,可以在對象和集合之間建立聯絡,這些聯絡表示了資料庫系統的邏輯結構。RDO的物件模型如圖所示:
除了rdoEngine對象外,每個對象都儲存在一個相關的集合中。在首次訪問實初始化RDO時,RDO自動建立一個rdoEngine和預設的rdoEnvironments(0)執行個體。
遠端資料物件編程模式與Data Access Objects(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對象。