簡介
遠程數據對象 RDO(RemoteDataObjects)是一個到 ODBC 的、面向對象的數據訪問接口,它同易於使用的 DAO style組合在一起,提供了一個接口,形式上展示出所有 ODBC 的底層功能和靈活性。儘管 RDO 在很好地訪問 Jet 或 ISAM 資料庫方面受到限制,而且它只能通過現存的 ODBC 驅動程式來訪問關係資料庫。但是,RDO 已被證明是許多 SQL Server、Oracle 以及其他大型關係資料庫開發者經常選用的最佳接口。RDO 提供了用來訪問存儲過程和複雜結果集的更多和更複雜的對象、屬性,以及方法。
RDO(Remote Data Objects)處理一組對象以完成遠程資料的存取,它是在ODBC API和驅動程式之上的一個可程式的薄層(thin code layer),用以建立資料結果集(result set)和游標,以及用最小的工作站資源執行複雜的程式。
注意RDO祇能在32位的作業系統上執行(如Windows95或NT)
主題
l RDO的特性 介紹RDO的重要特性
l 以RDO寫程式 介紹RDO對象模型
l 和Jet/DAO之間的比較 RDO的特性如何與DAO對應
l 初始化rdoEngine對象 rdoEngine對象的概觀與如何去設定它的屬性
l 建立rdoEnvironment對象 rdoEnvironment對象的概觀以及如何套用它的屬性來做數據存取
l 使用RDO來執行查詢 如何建立以及執行有參數的查詢
l 使用RDO來執行stored procedure 介紹如何與有特殊需求的store procedure一起運作
l 建立RDO游標 介紹如何建立RDO游標
l 使用RDO結果集 介紹如何使用從查詢傳回的資料以及參數
l 使用ODBC API函式 介紹RDO支持的ODBC handles
l 使用RemoteData控制項(control) 如何用RemoteData控制項處理數據
RDO的特性和客戶端/伺服端的設計目標
使用RDO時,程式可以直接存取ODBC的資料源而不需要本地端的查詢處理。這會在存取遠程的資料庫引擎時大大地提高效率和彈性。
使用RDO可以得到下列的好處。特別是在客戶端/伺服端架構
l 提高自遠程ODBC資料源存取資料的效率。
l 建立簡單而無游標的結果集,或是較為複雜的游標。
l 執行查詢以及同時運作多結果集:經由一個單一的查詢可以傳回多個結果集,這可以提高查詢處理器和系統資源的使用效率。例如可以使用一個查詢來提供多個顯示資料對象的資料(如data-driven的list box或查詢一起運作,可以正確的設定scroll bar和progress status bars。
l 以單一批次(batch)執行多個action查詢:在很多狀況下可能是以單一的SQL述句來執行多個新增(INSERT)、刪除(DELETE)和修改(UPDATE)的動作,這可以減少網路和遠程處理的負載,同時讓處理交易(transaction)更方便。
l 可以使用參數輸入stored procedure,以及傳回結果:從stored procedure輸出參數是從Oricle的stored procedure上獲得運算結果的唯一來源。這會在單一查詢以及許多管理的運作上有用。在很多狀況下,必須藉由stored procedure傳回的結果來判斷所執行的運作是否成功。RDO經由rdoParameter對象來處理這些輸入、輸出的參數。
l 限制處理以及傳回的記錄數:在某些狀況下,使用者所選的記錄數目可能超過實際運作的量,RDO可以設定經查詢傳回的記錄數目量。以這種方式可以預測回響時間,也更容易管理工作站和伺服器的資源。以同樣的機制可以限制修改查詢(data-modification query)所能影響記錄數的量。
l 利用伺服端游標:一些伺服端資料庫引擎也提供了游標的運作,在某些狀況下使用伺服端游標可以減輕網路負荷以及工作站的資源以提升效率。
l 監控遠程資料源所產生的訊息或錯誤但不妨礙正在執行的查詢。
l 執行異步查詢:能夠使用同步、異步事件驅動((event-driven)異步等處理,使程式不會在執行大量查詢時停滯。且不需要使用Polling機制。在異步查詢期間,Connection會一直保留著。
l 在初始設定的查詢截止時間到時,仍可繼續:當查詢的運作時間超過QueryTimeout屬性時,RDO允許繼續另一個查詢等待時間,而不直接停止查詢。
l 提供改良的多形(polymorphism)和“free-standing”的對象產生方式:RDO支持以DIM宣告且產生對象的方式,這種free-standing的對象可以被連結到其它的對象以執行運作。例如,可以獨立的產生rdoQuery和rdoConnection對象,而後聯合在一起運作。
l 提供分離的結果集:RDO允許產生靜態的讀寫游標而後中斷與遠方伺服器的連結。在rdoResultset對象中的資料仍可存取,一但以另一個rdoConnection對象再連結上遠程伺服機時,可以以BatchUpdate方法以完成這種離線(offline)的改變。
l 產生和管理開放式的批次更新:當ODBC游標程式庫提供開放式更新時,它是以一筆接著一筆的方式而非批次更新。這種做法需要較多的網路和伺服器的頻寬。RDO提供新的客戶端批次(Client Batch)游標,將一群被新增,修改和刪除的記錄集合起來。這種方式祇需要與伺服端連結一次,因此可以提升效率
l 讓Stored Procedures使用更容易:RDO允許將可輸入參數的查詢和stored procedure當成rdoConnection對象的方法。可以像使用VB函式傳入參數的方式一樣傳入參數而不需要rdoParameter對象。
l 提供之下的ODBC handles:當需要更直接,更有彈性的資料存取時,RDO提供直接存取ODBC環境(environment),connection和statement 等handles。
l 減少記憶體使用
以RDO寫作程式【2】
RDO對象和集合提供了寫作程式和維護遠程ODBC資料的的架構。對象和集合有描述資料庫特性的屬性和運算元據庫的方法。使用這種包含子對象的架構可以建構出對象與對象或對象與集合等等的關係,而這些關係表現了資料庫系統的邏輯結構。
除了rdoEngine對象外,其餘所有的對象都是由相關的集合在維護。當RDO在第一次存取而被初始化時,會自動產生rdoEngine對象以及內含的rdoEnvironments(0)對象。
RDO的程式寫作結構與DAO相似,但更注重在stored procedure的操作和傳回的資料集,相對的對ISAM資料的存取則較不重視。
下表為各對象的簡介
RDO對象 描述 rdoEngine 最基礎的對象,當第一次存取RDO對象時會自動產生。 rdoError 處理ODBC錯誤以及RDO所產生的訊息。也是自動產生的。 rdoEnvironment 對不同使用者定義邏輯上的connections和transaction的範圍,包含被開啟的或未開啟但擁有的connections,提供仿真transaction的機制,提供一個security context來執行data manipulation language(DML)。rdoEnvironment(0)會自動產生。 rdoConnection 代表一個連到遠程資料來源的開啟的connection,或是一個擁有但未開啟的對象,該對象可以在稍後開啟。 rdoTable 代表一個儲存著的基本資料表(base table)的定義或是一個view rdoResultset 代表執行一個查詢後所傳回的記錄 rdoColumn 代表擁有一般的資料型態以及屬性的一個數據域位 rdoQuery 一個可以擁有參數的SQL查詢 rdoParameter 代表輸出入的參數,關聯於rdoQuery對象
RDO對象 | 描述 |
rdoEngine | 最基礎的對象,當第一次存取RDO對象時會自動產生。 |
rdoError | 處理ODBC錯誤以及RDO所產生的訊息。也是自動產生的。 |
rdoEnvironment | 對不同使用者定義邏輯上的connections和transaction的範圍,包含被開啟的或未開啟但擁有的connections,提供仿真transaction的機制,提供一個security context來執行data manipulation language(DML)。rdoEnvironment(0)會自動產生。 |
rdoConnection | 代表一個連到遠程資料來源的開啟的connection,或是一個擁有但未開啟的對象,該對象可以在稍後開啟。 |
rdoTable | 代表一個儲存著的基本資料表(base table)的定義或是一個view |
rdoResultset | 代表執行一個查詢後所傳回的記錄 |
rdoColumn | 代表擁有一般的資料型態以及屬性的一個數據域位 |
rdoQuery | 一個可以擁有參數的SQL查詢 |
rdoParameter | 代表輸出入的參數,關聯於rdoQuery對象 |
注意:要支持分散式交易(distributed transaction)需要搭配SQL Server6.5版以及Distributed Transction Coordinator。
注意:RDO 1.0版提供的rdoPreparedStatement對象和rdoPreparedStatements集合,在RDO 2.0版仍然支持,但是是為了向前兼容,所以在RDO 2.0版後最好改用rdoQuery對象和rdoQueries集合。
產生遠程資料對象
RDO對象可以經由父對象產生或經由Dim述句。如果是經由Dim as New述句產生的RDO對象不會被加入到相關的集合中。下表列出如何產生主要的RDO對象
1.1產生遠程資料對象
RDO對象 | 產生方式 |
rdoEngine | 自動產生 |
rdoEnvironment | 第一個instance自動產生 rdoEngine.rdoCreateEnvironment |
rdoConnection | rdoEnvironment(x).OpenConnection(也可以用RemoteData控制項產生) Dim MyCn as New rdoConnection |
rdoQuery | rdoConnections(x).CreateQuery Dim MyQry as New rdoQuery |
rdoResultset | rdoQuery(x).OpenResultset rdoConnection(x).OpenResultset |
rdoParameter | 會為有參數的查詢自動產生 |
rdoTable | 當被參照時自動產生 |
rdoError | 當ODBC錯誤發生或有訊息時自動產生 |
RDO與Jet/DAO的比較
雖然RDO與DAO大致相似,但RDO是專門操作關係型資料庫的對象,且沒有自己的查詢處理(processor),它完全靠資料來源處理查詢並產生結果集 以下是RDO與DAO/Jet 的比較表 RDO對象 相對的DAO/Jet對象 rdoEngine DBEngine DBEngeine rdoError Error Error rdoEnvironment Workspace Workspace rdoConnection Database Connection rdoTable TableDef 不支持 不支持 索引 不支持 rdoResultset Recordset Recordset 不支持 Table-type 不支持 Keyset-type Dynaset-type Dynaset-type Static-type(r/w) Snapshot-type(r/o) Snapshot-type(r/o) Dynamic-type 不支持 Dynamic-type Forward-only-type Forward-only-type Forward-only-type (cursorless) 不支持 (cursorless) rdoColumn Field Field rdoQuery QueryDef QueryDef rdoParameter Parameter Parameter 不支持 Relation 不支持 不支持 Group 不支持 不支持 User 不支持 一些DAO的對象、方法、和屬性是設計來操作ISAM架構下的Jet資料庫。例如可以利用索引(Index)對象和Seek方法來處理ISAM的索引以及找尋記錄。但是因為RDO所使用的後端資料庫處理索引的方式完全不同,所以RDO並不需要去支持這些索引的運作。 DAO也支持建造和修改資料庫架構(schema),參照的完整性以及安全上的維護。這些對RDO來說都是後端資料庫伺服器在維護的,所以本身並不提供相關的對象或方法。 但仍然可以利用RDO的make-table查詢;以標準的SQL述句來執行動作查詢(action queries)以產生、修改或刪除資料庫和資料表。同時也可以以複雜的stored procedures還處理資料庫的架構和執行為或的工作,這些是DAO做不到的。
RDO對象 | 相對的DAO/Jet對象 |
|
rdoEngine | DBEngine | DBEngeine |
rdoError | Error | Error |
rdoEnvironment | Workspace | Workspace |
rdoConnection | Database | Connection |
rdoTable | TableDef | 不支持 |
不支持 | 索引 | 不支持 |
rdoResultset | Recordset | Recordset |
不支持 | Table-type | 不支持 |
Keyset-type | Dynaset-type | Dynaset-type |
Static-type(r/w) | Snapshot-type(r/o) | Snapshot-type(r/o) |
Dynamic-type | 不支持 | Dynamic-type |
Forward-only-type | Forward-only-type | Forward-only-type |
(cursorless) | 不支持 | (cursorless) |
rdoColumn | Field | Field |
rdoQuery | QueryDef | QueryDef |
rdoParameter | Parameter | Parameter |
不支持 | Relation | 不支持 |
不支持 | Group | 不支持 |
不支持 | User | 不支持 |
2.1RDO的集合管理
RDO集合 | 說明 |
rdoErrors | 內含所有RDO一次運作後所產生的rdoError對象。 |
rdoEnvironments | 內含rdoEngien之下,所有運作中(active)的rdoEnvironment對象,rdoEnvironments(0)會被自動產生。 |
rdoConnections | 內含所有在rdoEnvironment對象下開啟的rdoConnection對象,或是以Add方法加入的rdoConnection對象。 |
rdoTables | 內含所有在資料庫中預存的rdoTable對象。 |
rdoResultsets | 內含所有在rdoConnection中開啟的rdoResultset對象。 |
rdoColumns | 內含所有在rdoResultset或rdoTable對象中的rdoColumn對象。 |
rdoQueries | 內含所有以rdoConnection對象的CreateQuery函式而自動加入的,或以Add函式加入。 |
rdoParameters | 內含所有經由解析成功的SQL述句所產生的rdoParameter對象。 |
初始化rdoEngine對象
rdoEngine對象是所有RDO對象的最上層對象。它不能被重複產生,以及使用集合來包含。它可以讓好幾個應用程式共享,但會為每一個參與共享的應用程式產生私有資料區,而不會讓應用程式彼此之間互相干擾。
3.1初始化rdoEngine的內定值
屬性 | 定義 | 內定值 |
rdoDefaultCursorDriver | 游標程式庫(ODBC、客戶端批次、伺服端游標,或是沒有) | rdUseIfNeeded(伺服端游標) |
rdoDefaultPassword | 使用者密碼 | “”(空字元串) |
rdoDefaultUser | 使用者帳號 | “”(空字元串) |
rdoDefaultErrorThreshold | 發生多嚴重的錯誤才停止 | -1(不致能disabled) |
rdoDefaultLoginTimeout | 建立connection等多久沒回響,才放棄 | 15秒 |
做啥。 例如執行了一個統計的查詢後,這個訊息會經由rdoErrors集合傳回,而應用程式可以經由InfoMessage事件的觸發而知道。
3.2處理RDO的錯誤和訊息
產生rdoEnvironment對象
在大部分的狀況下並不需要產生額外的rdoEnvironment對象,內定的rdoEnvironments(0)應該夠用。但若應用程式需要更多的交易處理,或不同的帳號密碼環境,那就需要以rdoCreateEnvironment方法給予不同的使用者名稱、密碼來產生另外一個rdoEnvironment對象。這時要給予一個唯一的rdoEnvironment名稱,若與已經產生的相同,則會有可捕捉的錯誤。 內定的rdoEnvironments(0)的名稱為”Default_Environment”,使用者名稱及密碼都是空字元串。 若提供了唯一的名子,新產生的rdoEnvironment對象會自動加入rdoEnvironments集合。反之,若以空字元串當name參數的值,則新產生的對象不會加入。 快取(cached)登入信息 若在使用OpenConnection方法時,沒有在connect參數設定使用者帳號密碼,或是使用RemoteData控制項,但未在Connect內指定,則RDO會用rdoEnvrionment的帳號密碼建立連結。如下例,會用使用者帳號(Fred)和密碼(Blond)在rdoEnvironment對象En內建立連結 Dim En As rdoEnvironment Set En = rdoCreateEnvironment(“”,”Fred”,”Blond”)
4.1使用rdoEnvironment對象管理交易(Transaction)
注意:交易模型並不支持巢狀交易(nested transaction),所以不能在前一個BeginTrans還未與CommitTrans或RollbackTrans成對之前再使用一個BeginTrans方法。但若ODBC的資料源本身如SQL Server支持巢狀交易,則可以透過SQL述句,叫伺服端進行巢狀交易。 當使用ODBC交易時,一個開啟的連結並不會影響另一個連結,即使這兩個連結是連到同一個資料庫的同一個資料表。 捕捉rdoEnvironment交易事件 當rdoEnvironment完成一筆交易後會引發一個事件,可以利用這個事件來管理其它的交易。
4.2在rdoEnvironment對象管理Connections
密碼保護的環境。在這個環境下可以開啟多條連結與管理多個ODBC交易。 l l 使用OpenConnection方法在rdoEnvironment之內建立一個以上的連結 l l 在rdoEnvironment內使用BeginTrans,CommitTrans和RollbackTrans方法來管理ODBC交易。 l l 使用多個rdoEnvironment對象來建立多個、同時、獨立和重疊的交易。 l l 使用Dim X As New rdoConnection來產生一個獨立(stand-alone)rdoConnection對象,接著使用Add方法加入到rdoEnvironment對象內的rdoConnections集合。 l l 使用Remove方法將特定的rdoConneciton對象從他的父集合rdoConnections中移除。 l l 使用Close方法來結束環境和連結注意:rdoConnection對象不一定要屬於某個rdoEnvironment,它可以獨立產生。
建立RDO連結
在參照一個遠程資料庫內的資料之前,要先建立一條連結到資料源。這個資料源可以是遠程的資料庫伺服器,像MS SQL Server或Oracle,或其它支持適合的ODBC驅動程式的資料庫。 RDO建立連結有好幾種方法,與DAO不同的是,它並不為應用程式管理這些連結;僅僅收集要傳給SQLDriverConnect函式的參數,和使用SQLDisconnect函式來關掉連結。RDO並不快取這些資料以分享給使用相同DSN來建立連結的後來者。當使用RDO的Close方法來關掉連結時,它立刻就會被關掉。 可以以下的方法開啟連結 l l 使用RemoteData控制項自己的Connection屬性來建立連結對象rdoConnection l l 宣告一個rdoConnection對象,再以rdoEnvironment對象的OpenConnection方法開啟後賦予 l l 用Dim 變數名 As New語法產生一個獨立的rdoConnction,設定它的屬性後再以EstablishConneciton方法建立連結 l l 無論在獨立的rdoConnection或是使用過Close方法的rdoConnection都可以用EstablishConnection方法建立連結 在不同的情況下,可以選擇不同的方法。例如要對一些遠程資料庫完成象,再透過rdoQuery對象的ActiveConnection屬性將rdoConnection對象設定(Assign)給這些rdoQuery。在大部分狀況下,RemoteData控制項建立連結較為簡單。 以上的這些方法都是要與資料源如SQL Server,或Oracle;建立一個實體的連結(link)。要建立這個連結需要提供資料源的網路位置、驅動程式型態以及一些用來確認使用者身份的選擇性參數。 一但建立了連結,可以用它來 l l 使用OpenResult方法來執行一個查詢以傳回一或多個結果集。 l l 使用Execute方法以執行一個動作查詢(action query) l l 產生一個rdoQuery對象,好接著執行參數查詢或預存程式。 l l 定義執行一個以上預存程式的查詢來當成rdoConnection的方法。 l l 利用rdoResultset對象的ActiveConnection屬性連結rdoConnection對象 l l 使用Add方法將rdoConnection加到rdoConnections集合 l l 使用Remove方法將rdoConnection從rdoConnections集合移除
5.1提供RDO的連結字元串(ConnectionStrings)
ODBC在線上字元串參數 | 參數定義 |
DSN= | 註冊ODBC資料來源名稱(Data Source Name DSN),如果用了驅動程式參數,則DSN就不要用。 |
UID= | 在伺服端建立的使用者帳號,以SQL Server來說就是登入的帳號 |
PWD= | 對應登入帳號的密碼。 |
DATABASE= | 需要的內定資料庫(選項)。 |
SERVER= | 資料來源伺服器的網路計算機名稱,若作業系統為MS Windows NT,且資料庫伺服器在本機,則網路計算機名稱可用(local)。 |
DRIVER= | 資料來源的伺服器驅動程式名稱,以MS SQL Server為例,這裡用的是{SQL Server}。若使用了DRIVER參數,就不需要使用DSN。 |
APP= | 應用程式的名稱(選項)。 |
WSID= | 工作站ID,通常是應用程式所在工作站的網路名稱。(選項)。 |
LANGUAGE= | SQL Server所使用的國家語言。 |
注意:
選項 | 內定行為 |
Network Address | 以伺服器網路名稱代替,所以不需要。 |
Network Protocol | 若是MS SQL Server,內定是Names Pipes。 |
OEMTOANSI switch | 內定是“Off”。 |
使用Trusted Connection Option | 內定是“Off”。 |
為Prepared Statement產生預存程式 | 內定是“Off”。 |
安全漏洞。可以改成應用程式直接以某幾種的帳號密碼登入。若要搭配NT網路系統的DOMAIN安全管理,則上述兩個方法的連結字元串內的UID和PWD要保持空白。寫法如下 Conn$=”DSN=MyRemote;UID=;PWD=;” 設定內定的資料庫 若rdoConnection對象在建立之初,未設定DATABASE參數,則內定使用的資料庫可能是註冊的DSN內定義的資料庫;或是伺服端系統管理員定義的資料庫。但內定的資料庫可以藉由執行Transaction SQL的“USE予以更改。範例如下 cn.Execute “USE Pubs” 傳遞連結字元串給RDO或RemoteData控制項 可以以下列方式傳遞連結字元串給RDO或RemoteData控制項 l l 執行OpenDatabase方法時,設定Connect參數。 l l 設定RemoteData控制項的Connect屬性。 l l 當rdoConnection使用EstablishConnection方法時,設定Connect屬性 若使用RemoteData控制項,則有一些屬性都與連結有關,但如果Connect屬性內有設,其它相關的屬性也有設定的下,Connect內的屬性會蓋過其它的屬性。
5.2使用已經註冊好的DSN
sa;PWD=;")
5.3產生不用DSN的RDO連結
5.4設定rdoConnection選項
rdoConnection屬性 | 內定值 | 設定 |
LoginTimeout | 15 | 在放棄建立連結前要等多少秒 |
CursorDriver | rdUseIfNeeded | 使用該rdoConnection對象的查詢將會用的游標形式 |
Connect | “” | 用來產生連結的ODBC參數—連結字元串 |
Name | “” | 連結時用的ODBC DSN |
5.5使用rdoConnection對象的事件(Event)
rdoConnection事件 | 何時觸發 |
BeforeConnect | 在呼叫ODBC SQLDriverConnect函式之前 |
Connect | 在建立連結運作完成後—不一定成功或失敗 |
Disconnect | 在連結被斷掉時(disconnect) |
QueryComplete | 在異步(asychronous)查詢結束時 |
QueryTimeout | 在查詢所使用的時間超過rdoConneciton對象的QueryTimeout屬性。 |
WillExecute | 在RDO準備執行一個查詢時。 |
時間間隔用完或查詢結束。若輸入True,則直接停掉該執行中的查詢。注意:當查詢查詢被激活時,QueryTimeout屬性就已經傳給ODBC驅動程式,所以若之後才改變這項屬性將對已經被產生的查詢沒有作用。 使用WillExecute事件處理 這個事件會在執行任何查詢前先發生,而不管是action或row-returning查詢。可以藉由捕捉這個事件做執行查詢前的最後修正工作項查詢而RDO會產生可捕捉的錯誤。這個事件可以用來過濾某些查詢是否可以執行。 程式範例如下 Option Explicit Dim WithEvents cn As rdoConnection Dim rs As rdoResultset Dim SQL As String Dim col As rdoColumn Public Qd As rdoQuery Dim dTime As Date Private Sub cn_Connect(ByVal ErrorOccurred As Boolean) If Not ErrorOccurred Then MsgBox "連結建立完成" Else Dim er As rdoError Debug.Print Err, Error$ For Each er In rdoErrors Debug.Print er.Description, er.Number Next End If End Sub Private Sub cn_QueryComplete(ByVal Query As RDO.rdoQuery, ByVal ErrorOccurred As Boolean) If Not ErrorOccurred Then MsgBox Str(Second(Now - dTime)) Debug.Print Qd(0) Else Dim er As rdoError Debug.Print Err, Error$ For Each er In rdoErrors Debug.Print er.Description, er.Number Next End If End Sub Private Sub cn_QueryTimeout( _ ByVal Query As RDO.rdoQuery, Cancel As Boolean) Dim ans As Integer ans = MsgBox("Query Timed out... Press Retry to continue waiting", _ vbRetryCancel + vbCritical, "Query Took Too Long") If ans = vbRetry Then Cancel = False Else Cancel = True End If End Sub Private Sub RunQuery_Click() On Error GoTo RunQueryEH Qd.QueryTimeout = 5 Set rs = Qd.OpenResultset(rdOpenKeyset, _ rdConcurReadOnly) Exit Sub RunQueryEH: Dim er As rdoError Debug.Print Err, Error$ For Each er In rdoErrors Debug.Print er.Description, er.Number Next rdoErrors.Clear Resume Next End Sub Private Sub cn_WillExecute(ByVal Query As RDO.rdoQuery, Cancel As Boolean) dTime = Now End Sub Private Sub Form_Load() Set cn = New rdoConnection With cn .Connect = "uid=sa;pwd=;database=Pubs;dsn=Public;" .CursorDriver = rdUseClientBatch .EstablishConnection Prompt:=rdDriverNoPrompt, ReadOnly:=True, Options:=rdAsyncEnable .QueryTimeout = 5 End With Set Qd = cn.CreateQuery("LongQuery", "") With Qd .SQL = "{?=call pubs.dbo.VeryLongProcedure}" .rdoParameters(0).Direction = rdParamReturnValue End With End Sub
5.6異步地開啟連結
5.7使用獨立的(stand-alone)rdoConnection對象
5.8使用rdoConnection對象
資料庫結構(schema),或執行管理的動作(administrative function) l l 執行預存程式來管理結果集、輸出的參數或return values l l 使用rdoConnection的Close方法以停止到資料源的連結,同時釋放所使用的資源。
5.9與RDO資料源連結失敗
5.10使用rdoTable對象
5.11關掉不需要的RDO連結
使用RDO來送出查詢
通常應用程式需要利用查詢來完成對遠程資料庫資料、使用者許可權或資料庫伺服程式運作的管理。而查詢可分為以下兩部分 l l 送出一個內含SQL述句描述所需結果集的查詢,或參照一個預存程式 l l 處理結果記錄,參數和傳回值(預存程式回傳的部分) 在送出一個查詢前,需要問以下的問題以確認查詢的目的與效率 l l 應用程式是否需要瀏覽資料記錄?若需要瀏覽,則是雙向的還是祇向前瀏覽? l l 是否需要更新資料?如果需要,是否可以運作查詢直接更改?使用者是否需要許可權來修改? l l 有多少使用者會在同時,運作同樣的資料?可否控制這些同時執行的應用程式?這些應用程式是否共享資料? l l 查詢將會傳回多少筆資料?應用程式端的系統是否有能力存放這些記錄?網路使否在傳這些記錄時有頻寬的瓶頸? l l 記錄是以何種格式傳回—書籤還是靜態資料? l l 查詢是否要傳參數? l l 這個查詢在應用程式運作時會常常被執行,還是僅有一兩次? 管理RDO查詢 當開啟一條連結時,可以在其上執行許多查詢,可以參考下述原則使用不同形式的查詢 l l 若查詢僅僅使用一次,可以用rdoConnection對象的OpenResultset或Execute方法來產生rdoResultset對象,還是直接執行動作查詢。這兩種選項最後都會經由執行ODBC API的SQLExecDirect函式完成查詢,所以可以在使用OpenResultset或Execute方法時,直接在Options參數輸入rdExecDirect以直接指定SQLExecDirect函式。 l l 若執行的查詢可能會使用一次以上同時要輸入參數,則可以CreateQuery方法產生rdoQuery對象。該對象允許多次使用,且在使用時輸入不同的參數。一但使用rdoQuery對象,則可以透過這個對象的OpenResultset或Execute方法來產生rdoResultset對象,或是直接執行動作查詢。若要改變輸入的參數,則可以經由改變rdoParameter對象辦到。這種做法會經由ODBC API的SQLPrepare和SQLExecute函式。
6.1產生rdoResultset對象
6.2使用OpenResultset方法
注意:
6.3編寫SQL述句