歡迎使用 ADO

Microsoft (R) ActiveX (R) Data Objects (ADO) 啟動您的用戶端應用程式來透過任何 OLE DB 提供者存取與操作在資料庫伺服器中的資料。

ADO 程式程式人員的相關資料

ADO 支援產生用戶端/伺服器與 Web-based 應用程式的主要功能。它的主要益處是易於使用、高速、低記憶體與磁碟空間需求。ADO 也支援 Remote Data Service (RDS)，因此您可以從伺服器將資訊移到用戶端應用程式或網頁，操作用戶端上的資料，並傳回更新資料到伺服器。

要學習更多關於 ADO 的資訊，請參閱 ADO 綜覽。請參閱 Microsoft 關於 ADO 版本說明的網頁在 http://www.microsoft.com/data/ado。

ADO Extensions for DDL and Security (ADOX) 程式人員參考手冊

ActiveX Data Objects Extensions for DDL and Security (ADOX) 可以擴展 ADO 的功能，使其納入建立、修改的物件，及刪除結構敘述的物件，如資料表與程序。並包含安全物件，以維護使用者與群組，並對物件發佈或廢止權限。

若要瞭解更多有關 ADOX 的資訊，請參閱 ADOX Overview。請參閱 Microsoft 網頁，網址為 http://www.microsoft.com/data/ado，取得 ADOX 的版本資訊。

ADO MD 程式人員參考的相關資料

ActiveX Data Objects (Multidimensional) (ADO MD) 延伸 ADO 來包括指定給多元空間資料的物件，並且讓您瀏覽多元空間架構、查詢一個 cube，然後擷取結果。

要學習更多關於 ADO MD 的資訊，請參閱 ADO MD 概觀。也請參閱 Microsoft 關於 ADO MD 版本說明的網頁在 http://www.microsoft.com/data/ado。


Microsoft ADO Programmer's Reference

Microsoft ADO 程式設計者參考手冊

Microsoft (R) ActiveX (R) Data Objects (ADO) 能夠讓您能夠撰寫應用程式，並透過任一 OLE DB 提供者來存取及處理資料庫伺服器的資料。其主要的優點為容易使用､處理迅速、較少的記憶體需求以及不需太多的硬碟空間。ADO 也支援機碼功能用於建立主從架構以及 Web 的相關應用程式。

ADO 也支援 Remote Data Service (RDS) 的功能，讓您能夠將伺服端的資料傳至用戶端應用程式或網頁中，經由用戶端處理後再將更新後的資料傳回伺服器，全部只需一個行程便能完成。前一版的 Microsoft Remote Data Service 1.5 已完全與 ADO 程式模組結合以便簡化用戶端資料的遠端處理。

有關 ADO 更多的資訊以及如何與 RDS 整合﹐請參閱 ADO 入門。


ADO 中有何新功能?

ADO 中有何新功能？

此版本中新增一些功能與其它文件。

新功能

Seek 與 Index

Seek 方法與 Index 屬性可以在 recordset 中快速找到以索引為基礎的資料列位置。

資料列更新與同步化

您可以對由 JOIN 作業所建立 Recordset 物件其資料列更新與同步化，自訂控制。七種新的動態屬性控制五種現有方法的行為。

其它文件

Microsoft OLE DB Persistence Provider

Microsoft OLE DB Persistence Provider 搭配 Recordset 物件的 Save 與 Open 方法，可以將 Recordset 儲存與回復到檔案。使用此版本，可以以 Extensible Markup Language (XML) 格式 (此規格表示可以定義可以透過 Internet 進行資料傳遞的使用者特定標記。) 儲存 Recordset。

Microsoft Data Shaping Service for OLE DB

支援 Data Shaping 的 Microsoft Data Shaping Service for OLE DB 現在可以：

  • ，recordset 重新呈像。若是支援此功能，Recordset 物件現在於連線期間，會使 Name 屬性保持存在的狀態。

  • 對之前呈像過 Recordset 上任何階層的資料欄進行總計，不僅限於主資料項的立即子資料項。

  • 參數化的 COMPUTE 指令可以有無限制數目在 PARAMETER 子句與參數引數間插入 COMPUTE 子句。

Microsoft OLE DB Remoting Provider

Microsoft OLE DB Remoting Provider 服務提供者成為標準的服務提供者並取得新的動態屬性以增加效能，更強大的使用者控制，與搭配 ADO 2.0 的反向能力。

Microsoft Cursor Service for OLE DB

Microsoft Cursor Service for OLE DB 服務元件補充資料提供者的資料指標支援功能。因此，使用者可以知道來自所有資料提供者的相對不變的功能。


ADO 入門

此章節包含一系列的說明主題，您可以依既定的順序閱讀。只要按一下每個說明主題結尾的連結就可以到下一個說明主題。下列是所包含的說明主題︰

  • 區域資料存取的解決方案

  • 基本 ADO 程式設計模式

  • ADO 程式設計模式詳細資料

  • ADO 程式設計模式使用物件

  • ADO 物件模式摘要

  • 遠端資料存取的解決方案

  • 基本 RDS 程式設計模式

  • RDS 程式設計模式詳細資料

  • RDS 程式設計模式使用物件

  • RDS 物件模式摘要

下一步 區域資料存取的解決方案。


區域資料存取的解決方案

主要議題

您要一個簡單、一致的應用程式設計介面 (API)，讓應用程式可以修改廣泛的資料來源或從其中存取。一個資料來源也許簡單如一個文字檔，複雜地如異質資料庫的叢集，或是一些剛發明的資料方式。然而，API 不必假定獲得存取與操作資料來源的方式。

雖然這些是您特定的需求， 典型的資料來源是支援 Open Database Connectivity (ODBC) 標準，並需要以 Structured Query Language (SQL) 指令來操作的關聯式資料庫。

Microsoft 對這問題所提供的一般解決方案是 OLE DB，Component Object Model (COM) 介面集合，對儲存在不同資訊來源的資料提供一致的存取。然而，OLE DB 應用程式介面是設計在廣泛的應用程式中提供最佳的功能表現；它並不符合簡單這方面的需求。

您需要一個 API 當做應用程式與 OLE DB 之間的橋樑。ActiveX (R) Data Objects (ADO) 就是這座橋樑。

解決方案

ADO 定義了一個程式設計模式—用來獲得存取與更新資料來源的一連串活動。程式設計模式簡述了整個 ADO 的功能表現。

程式設計模式提出一個物件模式—對應與滿足程式設計模式的物件集。物件擁有在資料上執行一些作業的方法，與表示資料一些屬性或控制一些物件方法行為的屬性。

關聯物件的是事件，它是一些已發生、將發生作業的通知。

下一步 Basic ADO 程式設計模式。


基本 ADO程式設計模式

ADO 提供您執行下列動作的方法︰

  1. 連接到資料來源。您可以選擇性確保對資料來源的全部變更成功與否。

  2. 指定一個指令以獲得對資料來源的存取，選擇性地使用不同的參數，或是選擇性地針對效能最佳化。

  3. 執行指令。

  4. 如果指令導致資料以表格中資料列的形式被傳回時，您可以在易於檢查、操作或變更的快取區儲存資料列。

  5. 如果適當的話，用從資料列快取區中的變更來更新資料來源。

  6. 提供偵測錯誤的一般方法 (通常以連線或執行指令結果的方式)。

通常，您可以使用在程式設計模式中的這些所有步驟。然而，值得一提的是 ADO 是非常有彈性的，讓您只要執行一部份模式就可以對工作產生很大的幫助。例如，您可以從檔案直接儲存資料到資料欄的快取區，然後只使用 ADO 資源來檢查資料。

下一步 _ ADO 程式設計模式詳細資料。


ADO 程式設計模式詳細資料

下列項目是 ADO 程式設計模式的主要元件︰

  • 連線

  • 指令

  • 參數

  • Recordset

  • 資料欄

  • 錯誤

  • 屬性

  • 集合物件

  • 事件

連線

從您的應用程式存取一個資料來源是透過一個連線，就是交換資料的環境。您的應用程式可以直接 (有時被稱為二層系統) 或是間接 (有時被稱為三層系統) 透過一個媒介，如 Microsoft (R) Internet Information Server 來獲得對資料來源的存取權。

物件模式使 Connection 物件的連線概念具體化。

交易界定一系列透過連線所發生資料存取作業的開始與結束。ADO 確保在交易中作業導致的資料來源變更全部成功發生，或是全無發生。

如果您取消交易或是它作業的其中之一失敗，最終結果將如同交易中的作業沒有發生過。資料來源就像交易前。

物件模式無法明確將交易的概念具體化，但以 Connection 物件方法來表現它。

ADO 從 OLE DB 提供程式存取資料與服務。Connection 物件被使用來指定一個特殊的提供程式與任何參數。例如，Remote Data Service (RDS) 可以明確地被啟動或是暗中以 Microsoft OLE DB Remoting 提供程式啟動。(請參閱 RDS 教學課程步驟 2 以獲得透過 OLE DB Remoting Provider 提供程式來啟動 RDS 的範例。)

指令

經由一個已建立連線發出的指令會以一些方式操作資料來源。指令通常會新增、刪除或更新資料來源內的資料、或是以表格中資料欄的形式擷取資料。

物件模式以 Command 物件將指令的概念具體化。Command 物件的存在提供 ADO 指令執行最佳化的機會。

參數

通常，指令需要不同的部份，或參數，可以在您發出指令前被變更。例如，您可以重複地發出相同的資料擷取指令，但您資料擷取的指定每一次都不同。

參數對執行指令時類似函數的特別有用。在這情況下您知道指令在做什麼，但不需要知道它如何運作。例如，您發出一個銀行轉帳指令從一個帳戶扣款，然後再存入另一個帳戶。您指定要被轉帳的金額當作一個參數。

物件模式以 Parameter 物件將參數的概念具體化。

Recordset

如果指令是傳回資料成為表格中資料列資訊的查詢 (也就是說，它是一個資料列回傳查詢)，然後那些資料列被置於區域儲存區中。

物件模式會將此儲存具體化成一個 Recordset 物件。然而，沒有物件會以 Recordset 的單一資料列來表示。

Recordset 是檢查與修改資料列中資料的主要方法。Recordset 物件允許您︰

  • 指定哪一資料列在檢查時可用。

  • 詳查資料列。

  • 指定資料列被詳查的順序。

  • 新增、變更或刪除資料列。

  • 使用變更的資料來更新資料來源。

  • 管理 Recordset 整個狀態。

資料欄

Recordset 的一個資料列包含一或多個資料欄。如果您想像 Recordset 為一個二維的方格，資料欄排列成資料行。每個資料欄 (資料行) 在其中有它的屬性，如名稱、資料類型與一個值。它就是包含從資料來源實際資料的這個值。

物件模式會將一個資料欄具體化成一個 Field 物件。

為了修改資料來源中的資料，您會修改 Recordset 資料列中 Field 物件的值。最後，對 Recordset 的變更會傳入資料來源。當做一個選項，在 Connection 物件上的交易管理方法可以保證變更全部成功或失敗。

錯誤

在應用程式中任何時間都有可能發生錯誤，通常結果是無法建立連線、執行指令或是無法在合適的狀態下在物件上執行作業 (例如，嘗試使用尚未被初始化的 Recordset 物件)。

物件模式會將一個錯誤具體化成一個 Error 物件。

任何已知的錯誤會製造一或多個 Error 物件。下一個發生的錯誤將會捨棄先前一組 Error 物件。

屬性

每個 ADO 物件會有一組說明與控制物件行為的唯一屬性。

總共有兩種屬性︰內建與動態。內建屬性是 ADO 物件的一部份，並且總是存在。動態物件是經由潛在的資料提供程式新增到 ADO 物件的 Properties 集合物件中，並且在提供程式被使用時才存在。

物件模式會將一個屬性具體化成一個 Property 物件。

集合物件

ADO 提供集合物件，為包含一種特殊類型的其他物件的物件種類。在集合物件中的物件可以經由集合方法來擷取，可以依名稱，當作文字字串，或依順序，當做整數。

ADO 提供四種集合物件︰

Connection 物件有 Errors 集合物件，包含資料來源中對單一失敗回應中建立的所有Error 物件。

  • Command 物件有 Parameters 集合物件，包含所有套用到 Command 物件的Parameter 物件。

  • Recordset 物件有 Fields 集合物件，包含所有定義 Recordset 物件資料欄的 Field 物件。

  • 此外，Connection、Command、Recordset 與 Field 物件全部都有一個 Properties 集合物件，包含套用於個別容納物件中的所有 Property 物件。

ADO 物件擁有讓您設定或擷取一般資料類型如 INTEGER、CHARACTER 或 BOOLEAN 值的屬性。然而，您可想像有一定屬性是非常有用的，就像傳回資料類型值的 "集合物件" 。集合物件有方法可以儲存和擷取適合集合物件的其他物件。

例如，您可以將 Recordset 物件程式擁有會傳回一個集合物件的 Properties 屬性。該集合物件有方法可以儲存和擷取說明 Recordset 屬性的 Property 物件。

事件

事件為將發生或已發生作業的通知。一般來說，您可以使用事件來有效安排包含幾種非同步作業的應用程式。

物件模式不明確地將事件具體化，但將它們當作對事件處理程程序的呼叫。

事件處理程式會在作業開始提供您檢視或修改作業參數的機會前呼叫，然後取消或允許讓作業完成。

事件處理程式在非同步作業一項作業完成後通知您。引入幾種已經被增強來選擇性非同步執行的作業。例如，一個以 Recordset.Open 開始的應用程式，當作業結束時會由一個執行完成事件通知。

  • 若需有關資訊的更多資訊，請參閱 ADO 事件模式與非同步作業。

下一步 ADAD 程式設計模式使用物件。


ADO 程式設計模式使用物件

ADO 的目的是為了能存取、編輯與更新資料來源，而且程式設計模式會將用來達成此目的的一連串活動具體化。ADO 為執行下列的每一活動提供類別與物件：

  • 建立連線到一個資料來源 (Connection)。選擇性地開始一項交易。

  • 選擇性地建立來表示一個 SQL 指令的物件 (Command)。

  • 選擇性地指定在 SQL指令中的欄、表格與值當作不同的參數 (Parameter)。

  • 執行指令 (Command、Connection 或 Recordset)。

  • 如果此指令是資料列傳回的，在快取區 (Recordset) 中儲存資料列。

  • 選擇性地建立快取區的檢視，讓您可以排序、過濾與瀏覽資料 (Recordset)。

  • 經由新增、刪除或是變更資料欄或資料列來編輯資料 (Recordset)。

  • 如果合宜的話，使用從快取區中的變更來更新資料來源 (Recordset)。

  • 如果交易已經使用，接受或拒絕在交易中的變更。結束交易 (Connection)。

下一步 ADO 物件模式摘要。


ADO 物件模式摘要

ADO 物件摘要

物件 | 說明
Connection | 啟動資料交換。
Command | 具體化一個 SQL 陳述式。
Parameter | 具體化一個 SQL 陳述式的參數。
Recordset | 啟動資料瀏覽與操作。
Field | 具體化一個 Recordset 物件的資料欄。
Error | 具體化在一個連線上的錯誤。
Property | 具體化一個 ADO 物件的特性。

ADO 集合物件摘要

集合物件 | 說明
Errors | 所有在對連線上單一失敗回應所建立的 Error 物件。
Parameters | 所有關聯於 Command 物件的 Parameter 物件。
Fields | 所有關聯於 Recordset 物件的 Field 物件。
Properties | 所有關聯於 Connection、Command、Recordset 或 Field 的 Property 物件。

ADO 事件處理器摘要

ConnectionEvents | 說明
BeginTransComplete, CommitTransComplete, RollbackTransComplete | [交易管理] — 在連線上已開始、認可或復原目前交易的通知。
WillConnect, ConnectComplete, Disconnect | [連線執行管理] — 目前在連線上將開始或已結束的通知。
WillExecute, ExecuteComplete | [指令執行管理] — 目前在連線上將開始或已結束指令執行的通知。
InfoMessage | [資訊] — 關於目前作業其他資訊的通知。

RecordsetEvents | 說明
FetchProgress, FetchComplete | [擷取狀態] — 資料擷取作業程序或擷取作業完成的通知。
WillChangeField, FieldChangeComplete | [資料欄變更管理] — 目前資料欄中值將變更或已變更的通知。
WillMove, MoveComplete, EndOfRecordset | [巡覽管理] — 目前 Recordset 中資料列位置將變更或已變更，或是已到達 Recordset 結尾的通知。
WillChangeRecord, RecordChangeComplete | [資料列變更管理] — 目前 Recordset 資料列中一些資料將變更或已變更的通知。
WillChangeRecordset, RecordsetChangeComplete | [Recordset 變更管理] — 目前 Recordset 中一些資料將變更或已變更的通知。

下一步 遠端資料存取的解決方案。


遠端存取的解決方案

主要議題

ADO 您的應用程式可以直接存取與修改資料來源 (有時稱為二層系統)。例如，如果連線是到包含您資料的資料來源，它就是在二層系統中的直接連線。

然而，您可能想要透過媒介如 Microsoft Internet Information Server (IIS) 來間接存取資料來源。這安排有時被稱為三層系統。IIS 是一種提供透過 Internet 或intranet 讓用戶端、應用程式來呼叫遠端、伺服器或程式的用戶端/伺服器系統。伺服器程式會存取資料來源與選擇性地處理需求的資料。

例如，您的 intranet Web 網頁包含以 Microsoft (R) Visual Basic (R) 寫成的應用程式，Scripting Edition (VBScript)，可以連接到 IIS。然後 IIS會連接到實際的資料來源，擷取資料再以一些方式處理，然後將處理過的資料傳回您的應用程式。

在這個範例中，您的應用程式從未直接連接到資料來源；但 IIS 連接了。並且 IIS 以 ADO 的方法存取資料。

注意 用戶端/伺服器應用程式並不需要被基於 Internet 或 intranet (也就是，Web-based)—它可以純粹只包含在區域網路上編譯的程式。典型的例子就是 Web-based 應用程式。

因為一些視覺控制項，例如方塊、核對方塊或清單，可能使用傳回的資訊，回傳的資訊必須易於被視覺控制項使用。

您要一個簡單的應用程式設計界面，可以支援三層系統，並且傳回資訊就如同它在二層系統被擷取一樣容易。Remote Data Service (RDS) 就是這個介面。

解決方案

RDS 定義一種程式設計模式—用來存取與更新資料來源的一連串動作—來透過媒介，例如 Internet Information Server 存取資料。程式設計模式摘要說明整個 RDS 的功能。

程式設計模式提出了一種物件模式—程式設計模式提出一個物件模式—對應與滿足程式設計模式的物件集。物件擁有在資料上執行一些作業的方法，與表示資料一些屬性或控制一些物件方法行為的屬性。

與物件關聯的是事件，它是一些已發生、將發生作業的通知。

下一步 基本 RDS 程式設計模式。


基本 RDS 程式設計模式

存在於下列環境的 RDS 位址應用程式：一個用戶端應用程式會指定將在伺服器上執行的程式與要用來傳回所需求資訊的參數。在伺服器上被呼叫的程式會存取指定的資料來源，擷取資訊，選擇性地處理資料，然後以簡單易於使用的形式，將結果的資訊傳回您用戶端的應用程式。

RDS 提供您執行下列一連串動作的方法：

  1. 在伺服器上指定要被呼叫的程式，然後取得從用戶端可以關聯它的方法。(此關聯有時被稱為 proxy。它代表遠端伺服器程式。用戶端應用程式將呼叫 proxy 就像它是一個用戶端程式，但實際呼叫遠端伺服器程式。)

  2. 呼叫伺服器程式。將參數傳給辨認資料來源與所發出指令的伺服器。(伺服器程式實際上使用ADO 來存取資料來源。ADO 與一個已提供的參數建立連線，然後發出指定在其他參數中的指令。)

  3. 伺服器程式會從資料來源獲得一個 Recordset 物件。Recordset 物件會在伺服器上選擇性地被處理。

  4. 伺服器程式會傳回最終的 Recordset 物件到用戶端應用程式。

  5. 在用戶端上，Recordset 物件會被放置在便於視覺控制項存取的表單中。

  6. 任何對 Recordset 物件的修改會被傳回伺服器程式，以便使用它們來更新資料來源。

此程式設計模式包含了一些相當便利的功能。如果您不需要一個複雜的伺服器程式來存取資料來源，而且如果您提供需求的連線與指令參數，RDS 將自動以簡單、預設的伺服器程式來擷取指定的資料。

然而，如果您需要更複雜的處理，您可以指定自己的伺服器程式。例如，因為自訂的伺服器程式有ADO 最強大完整的功能，它可以連接到幾種不同的資料來源，以一些複雜的方式結合它們的資料，然後傳回一個簡單、處理過的結果給用戶端應用程式。

最後，如果您有其他需求，ADO 支援自訂預設伺服器程式的行為。

下一步 RDS 程式設計詳細資料。


RDS 程式設計模式詳細資料

下列元件是 RDS 程式設計模式的主要部份：

  • RDS.DataSpace

  • RDSServer.DataFactory

  • RDS.DataControl

  • 事件

RDS.DataSpace

您的用戶端應用程式必須指定要呼叫的伺服器與伺服器應用程式。然後您的應用程式會收到一個對伺服器程式的引用項目，並且可以如同是伺服器程式本身來對待它。

RDS 物件模式會將使用此功能的 RDS.DataSpace 物件具體化。

伺服器程式是以程式識別項來指定，或叫 ProgID。伺服器使用 ProgID 與伺服器機器的登錄項目來獲得關於實際要啟始程式的資訊。

RDS 依位於遠端伺服器上的伺服器程式是透過 Internet 或 intranet、位於區域網路上的伺服器、或是完全不在伺服器上而以一個區域動態連結資料庫 (DLL) 代之，來在內部建立區別。此區別決定資訊如何在用戶端與伺服器之間交換，並對傳回您用戶端應用程式的引用項目建立明白的分辨記號。然而，從您的觀點，此區別沒有特殊的意義。所有您收到的只是一個可用的程式引用項目。

RDSServer.DataFactory

RDS 提供一個預設的伺服器程式可以執行對資料來源的 SQL 查詢與傳回 Recordset 物件，或採取 Recordset 物件與更新資料來源。

RDS 物件模式會將使用此功能的 RDSServer.DataFactory 物件具體化。

另外，此物件擁有建立您可用程式填入的空白 Recordset 物件，與其他轉換 Recordset 物件成為文字字串來建立網站的方法。

使用 ADO，您可以使用 DataFactory 處理程式與包含連線、指令與安全參數的自定檔案來覆寫 RDSServer.DataFactory 的標準連線與指令行為。

伺服器程式有時被稱為 business 物件。您可以寫下您自己可以執行複雜的資料存取的自訂 business 物件，驗證檢查等等。即使在寫作自訂的 business 物件時，您可以建立 RDSServer.DataFactory 物件的一個例子並使用一些它的方法來完成您自己的工作。

RDS.DataControl

RDS 提供結合 RDS.DataSpace 與 RDSServer.DataFactory 功能的方法，並且也讓視覺控制項可以容易使用從資料來源查詢傳回的 Recordset 物件。RDS 嘗試針對最普遍的情形，盡可能地自動存取伺服器上的資訊並顯示在視覺控制項中。

RDS 物件模式會將使用此功能的 RDS.DataControl 物件具體化。

RDS.DataControl 有兩種特性。一種是附屬於資料來源。如果您設定 RDS.DataControl 的指令與連線屬性，它將會自動使用 RDS.DataSpace 來建立對預設 RDSServer.DataFactory 物件的引用項目。接者 RDSServer.DataFactory 將使用連線屬性值來連接資料來源，然後傳回 Recordset 物件到 RDS.DataControl。

第二種是附屬於在一個視覺控制項中顯示傳回的 Recordset 資訊。您可以將 RDS.DataControl 關聯一個視覺控制項 (以一個稱為結合的程序) ，並存取關聯 Recordset 物件的資訊，在 Internet Explorer 的網頁上顯示查詢結果。每一個 RDS.DataControl 物件結合一個 Recordset 物件，表示單一查詢的結果，到一或多個視覺控制項 (例如，文字方塊、混合方塊、方塊控制項等等)。在每頁可能會有超過一個的 RDS.DataControl 物件。每個 RDS.DataControl 物件可以被連接到不同的資料來源並且包含不同的查詢結果。

RDS.DataControl 也有它自己瀏覽、排序與過濾關聯 Recordset 物件的方法。這些方法是類似的，但不同於在 ADO Recordset 物件上的方法。

事件

RDS 支援兩種它自己的事件，它們獨立於 ADO 事件模式。當 RDS.DataControl ReadyState 屬性變更時，onReadyStateChange 事件會被呼叫，然後當一個非同步作業完成、終結或遭遇錯誤時會通知您。當錯誤發生時，即使是錯誤發生在非同步作業中 onError 事件會被呼叫。

注意 Microsoft Internet Explorer 環境對 RDS 提供兩種額外的事件—onDataSetChanged (the Recordset 可以作用但仍在擷取資料列) 與 onDataSetComplete (Recordset 已經結束擷取資料列)。

下一步 RDS 程式設計使用物件。


RDS 程式設計模式使用物件

RDS 的目的是透過像 Internet Information Server 的媒介體來存取與更新資料來源。程式設計模式會指定一連串用來達成此目的的動作。物件模式會指定物件，此物件具有影響程式設計模式的方法與屬性。

RDS 提供執行下列一連串動作的方法：

  1. 指定在伺服器上要被呼叫的程式，並且取得從用戶端關連它的方法。(RDS.DataSpace)

  2. 呼叫伺服器程式。將參數傳給辨認資料來源與所發出指令的伺服器。(proxy 或 RDS.DataControl)

  3. 伺服器程式會從資料來源獲得一個 Recordset 物件，通常使用 ADO。Recordset 物件會在伺服器上選擇性地被處理。(RDSServer.DataFactory)

  4. 伺服器程式會傳回最終的 Recordset 物件到用戶端應用程式。(proxy)

  5. 在用戶端上，Recordset 物件會被放置在便於視覺控制項存取的表單中。 (視覺控制項與 RDS.DataControl)

  6. 對 Recordset 物件的變更會被傳回伺服器，以便使用來更新資料來源。(RDS.DataControl 或 RDSServer.DataFactory)

下一步 RDS 物件模式摘要。


RDS 物件模式摘要

物件 | 說明
RDS.DataSpace | 此物件只包含取得伺服器 proxy 的一種方法。proxy可以是預設或是自定的伺服器程式 (business 物件)。伺服器應用程式可以從 Internet、intranet 或區域網路，或是被區域的動態連結資料庫呼叫。
RDSServer.DataFactory | 此物件表示預設的伺服器程式。它會執行預設的RDS 資料擷取與與更新行為。
RDS.DataControl
  • 此物件可以自動呼叫 RDS.DataSpace 與 RDSServer.DataFactory 物件。

  • 使用此物件來呼叫預設的 RDS 資料擷取或更新行為。

  • 此物件也提供存取傳回 Recordset 物件的視覺控制方法。


ADO 的功能

底下的主題所描述的是 ADO與 RDS 中可以使用的各項功能。

  • 建立 Recordset 捷徑

  • Recordset Persistence

  • Find、Sort 以及 Filter 的索引支援

  • ADO for Windows Foundation Classes

  • ADO 事件模式和非同步作業

  • VC++ Extensions for ADO

  • 資料呈像

  • DataFactory 自訂


建立 Recordset 捷徑

ADO透過在 Recordset 的 Fields 集合中附加新的 Field 物件，提供產生Recordset的快速方法。稍後，您可以開啟 Recordset，並從任何來源（不一定要從資料庫）將資料插入其中。您也可以用程式的方式製造資料。

新的 Recordset 可以使用所有適用於任何 Recordset 的資料處理方法，您可以使用Recordset 將資料提供給視覺控制項、甚或更新真實的資料來源。


Recordset Persistence

使用recordset persistence的功能，您可以將 Recordset 資料與超資料存成一個檔案。稍後，您可以使用這個檔案重新建立 Recordset 物件。這個檔案可能被放在本機磁碟機、網路伺服器、或網站上的URL上。

除此之外，GetString 方法可以將 Recordset 物件轉換為，在欄與列上加入您所指定的分隔符號的形式。

細節

Microsoft OLE DB Persistence Provider支援以 Recordset 物件中的 Save 方法，將Recordset 物件儲存到檔案中。稍後，您可以用 Recordset 物件中的 Open 方法、或 Connection 物件中的 Execute 方法，將該檔案予以回存。

Recordset物件被轉換成可以儲存在檔案中的形式，Recordset 物件可以被儲存成專屬性的Advanced Data TableGram (ADTG) 格式、或開放式的 Extensible Markup Language (XML) 格式。

暫停的更改被儲存在該檔案中，因此，您可以發出一個傳回 Recordset 物件的查詢；對它進行編輯；將它與暫停的更改儲存起來；稍後，將 Recordset 回存；然後以儲存後的暫停更改將資料來源予以更新。

用法

儲存 Recordset:

Dim rs as New ADODB.Recordset
rs.Save "c:\yourFile.adtg", adPersistADTG

以 Recordset.Open 開啟 persisted 檔:

dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg", "Provider=MSPersist",,,adCmdFile

可選擇的，如果 Recordset 並未取得連線的話，您也可以接受所有的預設條件，並直接撰寫如下：

dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg"

以 Connection.Execute 開啟 persisted 檔:

dim conn as New ADODB.Connection
dim rs as New ADODB.Recordset
conn.Open "Provider=MSPersist"
set rs = conn.execute("c:\yourFile.adtg")

以 RDS.DataControl 開啟 persisted 檔:

在這個案例中，並未設定 Server 屬性。

Dim dc as New RDS.DataControl
dc.Connection = "Provider=MSPersist"
dc.SQL = "c:\yourFile.adtg"
dc.Refresh


Find、Sort 以及 Filter 的索引支援

對欄位執行索引的作業可以大幅提高 Recordset 物件 Find 方法、以及 Sort 與 Filter 屬性的執行效能。您可以透過設定動態的 Optimize 屬性，為某個 Field 物件建立內部的索引。當您將 CursorLocation 屬性設定為 adUseClient 時，這個動態屬性都會附加在 Field 物件 Properties 集合上。要記住的是，這個索引是存在於 ADO 內部的，您無法讀取它、也無發將它用在任何其它的目的上。

Sort 屬性決定 Recordset 資料列的排列順序；Filter 屬性決定哪些資料列可以讀取；而且 Find 方法可在 Recordset 的索引欄位中，快速找出特定的數值。


ADO for Windows Foundation Classes

您可以使用 ADO 程式撰寫介面、與Microsoft® Visual J++™ (Java 程式語言)讀取資料。

ADO for Windows Foundation Classes (ADO/WFC)支援所有標準的ADO方法，屬性，物件，以及事件。不過，需要把 VARIANT 當做一項參數、而且在類似 Microsoft® Visual Basic® 語言中表現卓越速度的運算，可能在 Visual J++ 的語言中顯示出較差的執行效能。基於這項原因，ADO/WFC 也對 Field 物件提供了加速的功能，這項 Field 物件所採用的是原始的Java資料型態、而不是 VARIANT 的資料型態。


ADO 事件模式與非同步作業

ADO 事件模式於作業開始或完成後，支援特定發出事件或通知的同步與非同步 ADO 作業。事件實際上就是對您於應用程式上所定義事件處理常式的呼叫。

在開始作業前所呼叫的事件處理常式可以讓您檢驗或修正作業參數，然後取消或允許其繼續執行。

在開始作業後所呼叫的事件處理常式在此刻 ADO 支援非同步作業時特別重要。例如，開始非同步 Recordset.Open 作業的應用程式在作業結束時，會由執行完成事件通知。

請參閱下列主題，取得更多有關 ADO 中事件的資訊：

  • 事件處理常式摘要

  • 事件類型

  • 事件參數

  • 事件處理常式如何搭配工作

  • 在 ADO/WFC 中的 ADO 事件

  • 程式語言建立 ADO 事件個體


ADO 事件處理常式摘要

事件共分為兩大家族：ConnectionEvent 家族是動作發生在 Connection 物件的事件，RecordsetEvent 家族則是動作發生在 Recordset 物件的事件。

  • ConnectionEvents — 在連結交易開始、認可或送回、執行 Command 及 Connection 開始或停止時，事件都會傳出。

  • RecordsetEvents — 當您在 Recordset 物件的資料列中巡覽、在 Recordset 物件的資料列中改變資料欄、改變 Recordset 的資料列或在 Recordset 中做任何的改變，事件都會傳出。

ADO 事件處理常式摘要

ConnectionEvent | 說明
BeginTransComplete, CommitTransComplete, RollbackTransComplete | 交易管理 — 告知目前在連結上的交易已經開始、認可或已送回。
WillConnect, ConnectComplete, Disconnect | 連結管理 — 告知目前的連結即將開始、已經開始或已經結束。
WillExecute, ExecuteComplete | 指令執行管理 — 告知目前在連結的指令即將開始，或已經結束。
InfoMessage | 資訊提供 — 告知尚有關於目前動作的額外資訊。

RecordsetEvent | 說明
FetchProgress, FetchComplete | 接收的狀態 — 告知資料取得動作的進度，或取得動作已經完成。
WillChangeField, FieldChangeComplete | 資料欄改變管理 — 告知目前的資料欄值即將或已經改變。
WillMove, MoveComplete , EndOfRecordset | 巡覽管理 — 告知在 Recordset 中目前資料列的位置即將改變，或已經到了 Recordset 的最末端。
WillChangeRecord, RecordChangeComplete | 資料列改變管理 — 告知在 Recordset 目前資料列中的某些內容即將或已經改變。
WillChangeRecordset, RecordsetChangeComplete | Recordset 改變管理 — 告知在目前 Recordset 中的某些內容即將或已經改變。


事件類型

Will 事件

事件處理常式會在動作開始前呼叫，提供您檢查或改變動作參數的機會，甚至決定取消動作或允許動作完成。這些事件處理程式型態的名稱為 WillEvent (Will 事件)。

Complete 事件

事件處理常式會在動作完成後呼叫，告知應用程式動作已經完成。這種事件處理常式也可以告知Will 事件處理常式已經取消擱置的動作。這些事件處理程式型態的名稱為 EventComplete (Complete 事件)。

Will 及 Complete 事件一般都是配對使用。

其他事件

其他事件處理常式—也就是指類型名稱並非 WillEvent 或 EventComplete 的事件—只有在動作完成之後才會呼叫。


事件參數

每個事件處理常式都具有控制事件處理常式的狀態參數。大多數的 Complete 事件具有錯誤參數，以報告事件動作是否成功，及物件參數以識別應用動作的 ADO 物件。

參數也傳遞至 Will 事件，在擱置動作中使用。這樣可以提供您檢驗參數的機會，並且決定動作是否應該完成。

某些事件處理常式有 理由參數，可以提供有關事件為何發生的其它資訊。

狀態參數

當呼叫事件處理常式，會設定狀態參數至下列資訊值之一：

值 | 說明
adStatusOK | 產生事件的動作成功完成。
adStatusErrorsOccurred | 產生事件的動作並未成功完成，或是 Will 事件取消動作。請檢查錯誤參數以獲得更多的細節。
adStatusCantDeny | Will 事件無法要求取消即將發生的動作。

在事件處理程式傳回前，請不要改變狀態參數，或將其設定為下列要求值之一：

值 | 說明
adStatusUnwantedEvent | 要求這個事件處理常式不要再收到更多的告知服務。
adStatusCancel | 要求取消即將要發生的動作。

當呼叫事件處理常式後，依照不同的事件類型，狀態參數會有下列值之一：

事件類型 | 值
Will | adStatusOK, adStatusCantDeny
Complete | adStatusOK, adStatusErrorsOccurred

當事件處理常式傳回時，依照不同的事件類型，狀態參數會有下列值之一：

事件類型 | 值
Will | adStatusOK, adStatusCancel, adStatusUnwantedEvent
Complete | adStatusOK, adStatusUnwantedEvent

錯誤參數

錯誤參數是 ADO Error 物件的引用項目，當狀態參數值等於 adStatusErrorsOccurred 時，其中包含動作為何失敗的詳細資料。

物件參數

物件參數是應用動作的 ADO 物件的引用項目。例如您可能同時開啟多個 Connection 物件，及一個 Disconnect 事件處理常式，如果任何一個連結關閉，其 Connection 物件所設定的參數，就會呼叫 Disconnect 事件處理器。

理由參數

理由參數 adReason，可提供事件為何發生的額外資訊。具有 adReason 參數的方法可能會被多次呼叫—雖然是為了同一個動作，但是每次都是不同的理由。

例如有關於插入、刪除或修改記錄的執行或復原，都會呼叫 WillChangeRecord 事件處理常式。使用 adReason 參數做為篩選器，只處理特定的事件。

您必須在 adStatus 參數中傳回 adStatusUnwantedEvent，以要求沒有 adReason 參數的事件處理常式停止接收事件告知服務。但是具有 adReason 參數的事件處理常式可能會收到多個告知服務，每個都有不同的理由。因此您必須對每個因為不同理由造成的告知服務傳回 adStatusUnwantedEvent。

舉例而言，假設您具有以 Microsoft (R) Visual Basic (R) 編碼的 WillChangeRecord 事件處理常式。若您不想收到更進一步的告知服務，只需要下列簡單的程式碼即可：

Set adStatus = adStatusUnwantedEvent

但是若您想要處理資料列將被刪除的事件，但要取消所有其他原因的告知，請使用下列的程式碼：

if (adReason = adRsnDelete)
' Process an event for this reason.
...
else
' Stop receiving events for any other reason.
Set adStatus = adStatusUnwantedEvent
...


事件處理常式如何搭配工作

不論實際上是否需要使用事件，ConnectionEvent 及 RecordsetEvent 兩個家族的事件處理常式都必須完成。您必須根據所使用的程式設計語言，來決定安裝工作的數量。像 Microsoft Visual Basic 已經完成所有的工作；其他像是 Microsoft (R) Visual C++ (R)，則需要您自己完成所有的工作。Microsoft (R) Visual J++ (TM) with ADO/WFC 則介於兩者之間，幫您完成許多工作。若需更多相關資訊，請參閱 ADO Event Instantiation by Language。

雖然自己完成事件處理常式會有較多的工作，但是您也可以做到一些像是 Visual Basic 程式語言不允許的事情。例如 Microsoft Visual C++ 有一個 RecordsetEvent 處理常式，就可以處理來自動作在多個 Recordset 物件的告知服務。

Will 及 Complete 事件處理常式可以成對或分開使用。

成對的事件處理常式

  • 下列說明敘述 Will 事件成功後的情形。

    Recordset 物件有成對的 WillChangeField 及 FieldChangeComplete 事件。當在應用程式中開始改變資料欄值，會呼叫 WillChangeField 事件處理常式。您傳回接受改變資料欄的指示。接著動作完成，FieldChangeComplete 事件告知應用程式動作已經完成結束。而事件處理常式的狀態參數也報告動作已成功完成。

  • 下列說明敘述 Will 事件取消動作時的情形。

    在相同的應用程式下，您改變了另一個資料欄，會呼叫 WillChangeField 事件處理常式。接著因為某些原因，您決定不接受資料欄的改變，所以傳回在狀態參數中的 adStatusCancel，動作因此而沒有完成。

    FieldChangeComplete 事件處理常式告訴您動作已經結束，事件處理器狀態參數設為 adStatusErrorsOccurred；錯誤參數引用 Error 物件；而 Error 物件的 Number 屬性設定為 ADO 或提供者的值，代表動作取消。

  • 同一個動作可以呼叫超過一個的 Will 及 Complete 事件處理常式。下列說明敘述多個 Will 事件成功時的情形。

    Recordset 物件有成對的 WillChangeField、FieldChangeComplete、WillChangeRecord 及 RecordChangeComplete 事件。您開始改變資料欄值；因此呼叫 WillChangeField 事件處理常式，您也傳回接受改變資料欄的指示。

    接著 WillChangeRecord 事件處理常式被呼叫，而您也再一次指示應該完成這項動作。

    注意 一般而言，屬於 ADO 物件特定情況的所有 Will 事件都將會被呼叫，但是呼叫並無一定的順序。

    當動作完成，FieldChangeComplete 及 RecordChangeComplete 事件都被呼叫。

  • 同一個動作可以呼叫不只一個 Will 及 Complete 事件處理常式，但是其中之一可能會取消擱置的動作。下列說明敘述多個 Will 事件中的最後一個事件取消動作時的情形。

    Recordset 有成對的 WillChangeField、FieldChangeComplete、WillChangeRecord 及 RecordChangeComplete 事件。開始改變資料欄值；WillChangeField 事件處理常式被呼叫，您也傳回接受改變資料欄的指示。

    接著 WillChangeRecord 事件處理常式被呼叫。或許您覺得單獨資料欄的改變並沒有關係，但是卻會對於整個記錄造成錯誤，所以您傳回 adStatusCancel 表示不接受資料欄的改變。但 WillChangeField 事件處理器已經允許動作。

    由於動作被 WillChangeRecord 事件處理常式取消，所以動作並未完成。以設定至 adStatusErrorsOccurred 的狀態參數呼叫 FieldChangeComplete 事件處理常式；錯誤參數則被適當的設定。

    接著 RecordChangeComplete 事件處理常式同樣也被設定至 adStatusErrorsOccurred 的狀態參數所呼叫。而與 Will 事件相符的 Complete 事件也被呼叫。

  • 同一個動作可以呼叫不只一個 Will 及 Complete 事件處理常式，但是其中之一可能會取消擱置的動作。下列說明敘述當並非多個 Will 事件中的最後一個事件取消動作時的情形。

    再一次，Recordset 有成對的 WillChangeField、FieldChangeComplete、WillChangeRecord 及 RecordChangeComplete 事件。您首先改變資料欄值，所以 WillChangeField 事件處理常式被呼叫，接著您傳回 adStatusCancel 表示不接受資料欄的改變，因此動作並未完成，而 FieldChangeComplete 事件告知您動作最後結束的狀態，並適切的設定錯誤參數。

    但是 WillChangeRecord (及接著的 RecordChangeComplete) 事件處理常式並未並呼叫，因為第一個 Will 事件取消的動作。一般而言，如果 Will 事件取消了動作，剩下的 Will 事件就不會被呼叫了。

未成對的事件處理常式

傳回 status 參數中的 adStatusUnwantedEvent 就可以關閉所有事件的事件告知服務。例如當第一個 Complete 事件處理常式被呼叫後，傳回 adStatusUnwantedEvent，未來您就將只收到 Will 事件。

當您想要查驗未來會在動作中使用的參數時，單獨的 Will 事件處理常式將非常有用。您可以修改這些動作參數或取消動作。

還有另一種情況：保持開啟 Complete 事件告知服務，而在第一個 Will 事件處理常式被呼叫時，傳回 adStatusUnwantedEvent。以後您只會收到 Complete 事件。

單獨的 Complete 事件處理常式對於管理非同步動作非常有用，每一個非同步動作都有一個適切的 Complete 事件。

例如填寫一個很大的 Recordset 物件時，都會耗費相當長的時間。如果適當地撰寫您的應用程式，您可以開始 Recordset.Open(...,adAsyncExecute) 動作，然後接著進行其它的處理，最後 ExecuteComplete 事件完成 Recordset 的填寫後，就會發出告知。

單一事件處理常式及多個物件

像 Microsoft Visual C++ 這種具有彈性的程式語言，可讓您由多個物件取得單一的事件處理常式。例如您可以由多個 Connection 物件取得一個 Disconnect 事件處理常式。如果任何一個連結結束，就會呼叫 Disconnect 事件處理常式。因為事件處理常式的 object 參數會設定出對應的 Connection 物件，所以您可以知道是哪一個物件造成此事件。

注意 此項技術不能在 Visual Basic 使用，因為在這個程式語言中一個事件只能有一個相關物件。

多個事件處理常式及單一動作

雖然用處較小，但是您仍然可以將一個 ADO 物件和其動作相連至多組的事件。例如您可以對每一個執行特定資料欄驗證編輯建立多個 WillChangeField 事件。如果資料欄即將改變，一個 Will 事件會驗證資料欄值的某些方面，然後另一個 Will 事件將驗證其它不同方面。

這個技術用處不大的原因，在於您可以輕鬆的執行單一事件處理常式，或呼叫事件處理常式所有的編輯。不過為了完整的介紹，仍在此處說明這種方式。


在 ADO/WFC 中的 ADO 事件

ADO for Windows Foundation Classes (ADO/WFC) 建立在 [ADO 事件模型] 之上，並呈現簡化的應用程式設計介面。

一般而言，ADO/WFC 截取 ADO 事件、將事件參數合併整理成單一事件類別，然後呼叫您的事件處理常式。

若要在 ADO/WFC 中使用 ADO 事件

  1. 定義您的事件處理常式方法來處理事件。例如，若要在 ConnectionEvent 家族中處理 ConnectComplete 事件，可能會用到如下的程式碼：
    public void onConnectComplete(Object sender,ConnectionEvent e)
{
System.out.println("onConnectComplete:" + e);
}
  2. 定義 handler 物件來代表您的事件處理常式方法。處理常式物件在事件類型為 ConnectionEvent 時，應為 ConnectEventHandler 的資料型態，在事件類型為 RecordsetEvent 時，則應為 RecordsetEventHandler 的資料型態。例如，請如下所示撰寫 ConnectComplete 事件處理常式的程式碼：
    ConnectionEventHandler handler =
new ConnectionEventHandler(this, "onConnectComplete");

    ConnectionEventHandler 建構子的第一個引數引用包含了在第二個引數中方法名稱的類別。

    Microsoft Visual J++ 編譯器也支援同等的語法：

    ConnectionEventHandler handler =
new ConnectionEventHandler(this.onConnectComplete);

    單一引數引用您要的類別 (也就是 this)，以及類別內的方法 (也就是 onConnectComplete)。

  3. 將您的事件處理常式加到指定處理特殊事件類型的處理常式清單中。請使用名稱為 addOn EventName(handler) 的方法。

  4. ADO/WFC 會在內部應用全部的 ADO 事件處理常式。因此，Connection 或 Recordset 作業所引起的事件會被 ADO/WFC 事件處理常式所擷取。

    ADO/WFC 事件處理常式將 ADO ConnectionEvent 參數傳至 ADO/WFC ConnectionEvent 類別中的一個個體，或將 ADO RecordsetEvent 參數傳至 ADO/WFC RecordsetEvent 類別中的個體。這些 ADO/WFC 類別合併整理 ADO 事件參數；也就是每個 ADO/WFC 類別包含在所有 ADO ConnectionEvent 或 RecordsetEvent 方法中，每個獨特參數的一個資料成員。

  5. ADO/WFC 接著以 ADO/WFC 事件物件來呼叫您的事件處理常式。例如，您的 onConnectComplete 處理常式會有如下的記號：
    public void onConnectComplete(Object sender,ConnectionEvent e)

第一個引數為傳送事件 (Connection 或 Recordset) 的物件類型，第二個引數為 ADO/WFC 事件物件 (ConnectionEvent 或 RecordsetEvent)。

您的事件處理常式的記號比 ADO 事件簡單。不過，您仍然需要熟悉了解 ADO 事件模型，才能了解有那些參數套用到事件以及如何回應。

  6.
從您的事件處理常式回到 ADO 事件的 ADO/WFC 處理常式。ADO/WFC 複製相關 ADO/WFC 事件資料成員回 ADO 事件參數，然後 ADO 事件處理常式會把它傳回。

    7.

  7.
完成處理程序後，請將您的處理常式從 ADO/WFC 事件處理常式清單中移除。請使用名稱為 removeOn EventName(handler) 的方法。
    8.


程式語言建立 ADO 事件個體

每種程式語言建立不同的 ADO 事件個體。下列所有範例會建立 ConnectComplete 事件處理常式。

Visual Basic

Dim WithEvent connEvent as Connection
Dim conn as New Connection
set connEvent = conn        'Turn on event support.
conn.Open(...)
...
set connEvent = Nothing    'Turn off event support.
...
Private Sub connEvent_ConnectComplete(ByVal err as ADODB.Error, adStatus as ADODB.EventStatus, ByVal pConnectionas ADODB.Connection)
'Check the error object only if adStatus equals adStatusErrorsOccurred.
...
End Sub

Visual C++

此為 VC++ 如何建立 ADO 事件的結構敘述。

建立衍生自 adoint.h 檔中 ConnectionEventsVt 與 RecordsetEventsVt 介面的類別。

class CConnEvent : public ConnectionEventsVt
{
    public:
    STDMETHODIMP InfoMessage(
                        ADOError *pError,
                        EventStatusEnum *adStatus,
                        _ADOConnection *pConnection);
...
}

class CRstEvent : public RecordsetEventsVt
{
       public:
               STDMETHODIMP WillChangeField(
                             LONG cFields,
                VARIANT Fields,
                EventStatusEnum *adStatus,
                             _ADORecordset *pRecordset);
...
}

在兩種類別中，應用每個事件處理常式方法。每種方法只要傳回 HRESULT of S_OK 即可。不過，當您宣佈事件處理常式可用時，處理常式即會經常被呼叫。若不要發生這種狀況，可在一開始的時候將 adStatus 設定為 adStatusUnwantedEvent，以要求不再進一步通知。

STDMETHODIMP CConnEvent::ConnectComplete(
                             ADOError *pError,
                             EventStatusEnum *adStatus,
                _ADOConnection *pConnection)
        {
        *adStatus = adStatusUnwantedEvent;
        return S_OK;
        }

事件類別繼承自 IUnknown，因此您必須也要應用 QueryInterface、AddRef，與 Release 方法，同時也應用類別建構子與解構子。選擇您最熟悉的 VC++ 工具，可簡化此部份的工作。

對 IConnectionPointContainer 與 IConnectionPoint 介面的 Recordset 與 Connection 物件上，發出 QueryInterface 以宣佈您的事件處理常式可用。然後為每種類別發出 IConnectionPoint::Advise。

例如，假設使用 Boolean 函數時，在成功通知 Recordset 物件時傳回 True，則代表您的事件處理常式可用。

HRESULT    hr;
DWORD        dwEvtClass;
IConnectionPointContainer    *pCPC = NULL;
IConnectionPoint                *pCP = NULL;
CRstEvent                        *pRStEvent = NULL;
...
_RecordsetPtr     pRs();
pRs.CreateInstance(__uuidof(Recordset));
pRStEvent = New CRstEvent();
if (pRStEvent == NULL) return FALSE;
...
hr = pRs->QueryInterface(IID_IConnectionPointContainer, &pCPC);
if (FAILED(hr)) return FALSE;
hr = pCPC->FindConnectionPoint(IID_ADORecordsetEvents, &pCP);
pCPC->Release();    // Always Release now, even before checking.
if (FAILED(hr)) return FALSE;
hr = pCP->Advise(pRstEvent, &dwEvtClass);    //Turn on event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...
return TRUE;
...

此時，啟動 RecordsetEvent 家族的事件，且在 Recordset 事件發生時呼叫您的方法。

稍後，若要使您的事件處理常式不可用，請再度連接，並發出 IConnectionPoint::UnAdvise 方法。

...
hr = pCP->UnAdvise(dwEvtClass);    //Turn off event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...

當然，您必須適當地釋放介面，並刪除類別物件。

Visual J++

import wfc.data.*;
public class MyClass
{
ConnectionEventHandler handler =
    new ConnectionEventHandler(this,"onConnectComplete");

public void onConnectComplete(Object sender,ConnectionEvent e)
{
    if (e.adStatus == AdoEnums.EventStatus.ERRORSOCCURRED)
        System.out.println("Connection failed");
    else
        System.out.println("Connection completed");
    return;
}

void main( void )
{
    Connection conn = new Connection();

    conn.addOnConnectComplete(handler);        // Turn on event support.
    conn.open("DSN=pubs");
    conn.close();
    conn.removeOnConnectComplete(handler);    // Turn off event support.
}
}

VBScript

VBScript 不支援事件。


ADO 的 VC++ 延伸功能

Visual C++ 程式設計師所面對最乏味的工作之一就是當配合 ADO 來擷取資料必須冗長地將以 VARIANT 資料類型傳回的資料轉換成 C++ 資料類型，然後儲存轉換過的資料在類別或結構。透過 VARIANT 資料類型擷取 C++ 資料的過程是令人厭煩的而且會降低效能。

ADO 提供一個支援擷取資料成為原始 C/C++ 資料類型的介面，而不需要透過一個 VARIANT。並提供前置處理指令讓所提供的介面更容易使用。

此結果是一種彈性、易於使用、並且有高效能的工具。

一個一般 C/C++ 用戶端作法是連結在 Recordset 中的記錄，到包含原始 C/C++ 類型的 C/C++ 結構或類別。當透過 VARIANT，這包括從 VARIANT 寫入轉換程式碼到 C/C++ 原始類型。ADO VC++ 延伸功能目標是在讓這作法對 VC++ 程式設計師而言更簡單。

請參閱下列主題，瞭解更多有關 ADO VC++ 的延伸功能。

  • 使用 ADO VC++ 延伸功能

  • VC++ 延伸功能前置資料詳細說明

  • 範例：ADO 不使用延伸功能

  • 範例：ADO 使用延伸功能


使用 ADO VC++ 延伸功能

定義連結項目

ADO VC++ 延伸功能會對應 Recordset 物件的資料欄到 C/C++ 變數。在資料欄與變數間對應的定義被稱為一個連結項目。針對數字、固定長度與可變長度的變數，前置處理指令巨集被提供來定義連結項目。

將您在 BEGIN_ADO_BINDING 與 END_ADO_BINDING 巨集間的連結項目加上括號。連結項目不可以用逗號或分號結尾。這些區隔字元會在巨集中指定。

為每個要被轉換成 C/C++ 變數資料欄指定一個連結項目。使用適當的 ADO_FIXED_LENGTH_BINDING_ENTRY、ADO_NUMERIC_BINDING_ENTRY 或 ADO_VARIABLE_LENGTH_BINDING_ENTRY 巨集。

在巨集的參數中，要被抽選的 Recordset 資料欄會依數字順序指定—0 表示第一個資料欄，1 表示第二個資料欄，依此類推。

C/C++ 變數會以一種資料類型宣告。如果變數是數字，您也可以指定精確度與小數位。如果變數是可變長度，像字串，您必須以位元數指定變數的最大值。Recordset 資料欄值會在必要時被強制成這種資料類型。

指定一個暫存的工作緩衝區，這會被用來將資料欄值從 VARIANT 轉換成 C/C++ 變數。緩衝區必須至少和 C/C++ 變數一樣大。

設定布林修正參數為 TRUE 以啟動 ADO 來更新連結資料欄，如果您只要檢視資料欄而不變更它，設為 FALSE。VC++ 延伸功能不會維護關於資料欄的狀態資訊，所以您必須指定是否 ADO 要變更資料欄的值 (例如，一個由資料來源維護的 autoincrement 資料欄值)。因此，這種資料欄修正參數必須被設為 FALSE。

狀態參數會告訴您從 Recordset 資料欄到 C 或 C++ 變數的轉換是否成功，與變數的內容是否有效。此參數最重要的兩個值是 adFldOK，表示轉換成功；與 adFldNull，表示資料欄是 NULL—它沒有可以轉換的值。

先檢查此參數以決定 C 或 C++ 變數是否有效。例如，若一個資料列具備有效的內容，狀態將是 adFldOK。如果您移至的資料欄是 NULL 的另一個資料列，狀態將是 adFldNull。然而，C 或 C++ 變數的內容是不變的—變數仍包含從先前資料列的資料欄值。

連結 Recordset 到變數

在您的應用程式中，呼叫 BindToRecordset 介面方法來關聯 (或連結) Recordset 資料欄到 C/C++ 變數。無論目前 Recordset 物件的資料列是否變更，您的 C/C++ 變數將自動被更新。

前置資料檔

將下列檔案包含在您的應用程式中以使用 VC++ 延伸功能:

  • #include <icrsint.h>

介面方法

IADORecordBinding 介面具有關聯 Recordset 資料欄與 C/C++ 變數、新增新資料列與執行更新的方法。所有的三種方法會對從 CADORecordBinding 衍生的類別採取一個指標，會定義在每一個資料欄與變數間的連結。

介面方法是：

  • BindToRecordset(&binding)

呼叫此方法來關連資料欄與變數。

  • AddNew(&binding)

呼叫此方法來間接呼叫 ADO AddNew 方法。

  • Update(&binding)

呼叫此方法來間接呼叫 ADO Update 方法。

前置處理指令巨集

  • BEGIN_ADO_BINDING(cls)

  • ADO_FIXED_LENGTH_BINDING_ENTRY(Ordinal, DataType, Buffer, Status, Modify)

  • ADO_NUMERIC_BINDING_ENTRY(Ordinal, DataType, Buffer, Precision, Scale,
    Status, Modify)

  • ADO_VARIABLE_LENGTH_BINDING_ENTRY(Ordinal, DataType, Buffer, Size,
    Status, Modify)

  • END_ADO_BINDING()

參數 | 說明
cls | 定義連結項目、緩衝區與 Recordset 物件的類別。
Ordinal | 依序的資料欄數字；0 表示第一個資料欄，1 表示第二個資料欄，依此類推。
DataType | 轉換資料欄將被儲存的變數資料類型。
Buffer | 使用來轉換資料欄成變數的緩衝區。
Status | 表示資料欄轉換的成功。
Modify | 布林旗標；如果為 TRUE，表示 ADO 可以更新關聯的資料欄。
Precision | 可以在數字變數中顯示的數字數目。
Scale | 位於數字變數中的小數數目。
Size | 可變長度變數，就像字串的位元數。

狀態參數值 | 說明
adFldOK | 傳回的非 Null 資料欄值。
adFldBadAccessor | 連結無效。
adFldCantConvertValue | 值無法轉換，因為符號不符合與資料溢位之外的理由。
adFldNull | 傳回一個 NULL。
adFldTruncated | 可變長度資料或數字被刪減。
adFldSignMismatch | 值已指定而變數資料類型未指定。
adFldDataOverFlow | 值比可以被儲存在變數資料類型中的大。
adFldCantCreate | 未知的欄位類型與資料欄已經開啟。
adFldUnavailable | 無法決定資料欄的值—例如，在一個新的、沒有預設值的未指定資料欄。
adFldPermissionDenied | 當更新時，沒有寫入資料的許可權。
adFldIntegrityViolation | 當更新時，資料欄值將破壞欄的完整性。
adFldSchemaViolation | 當更新時，資料欄值將破壞欄的架構描述。
adFldBadStatus | 當更新時，無效的狀態參數。
adFldDefault | 當更新時，預設值已被使用。


VC++ 延伸功能前置資料詳細說明

下列前置資料，icrsint.h，會詳述允許用戶端取得資料列到類別資料成員的介面。用戶端需要包含在它們類別中的連結項目以指定在 Recordset Field 物件與類別資料成員間的關聯。

#ifndef _ICRSINT_H_
#define _ICRSINT_H_

#include <olectl.h>
#include <stddef.h>

// forwards
class CADORecordBinding;

#define classoffset(base, derived) \
    ((DWORD)(static_cast<base*>((derived*)8))-8)

enum FieldStatusEnum
{
    adFldOK = 0,
    adFldBadAccessor = 1,
    adFldCantConvertValue = 2,
    adFldNull = 3,
    adFldTruncated = 4,
    adFldSignMismatch = 5,
    adFldDataOverFlow = 6,
    adFldCantCreate = 7,
    adFldUnavailable = 8,
    adFldPermissionDenied = 9,
    adFldIntegrityViolation = 10,
    adFldSchemaViolation = 11,
    adFldBadStatus = 12,
    adFldDefault = 13
};

typedef struct stADO_BINDING_ENTRY
{
    ULONG            ulOrdinal;
    WORD            wDataType;
    BYTE            bPrecision;
    BYTE            bScale;
    ULONG            ulSize;
    ULONG            ulOffSet;
    ULONG            ulIADOBindingEntriesOffSet;
    ULONG            ulFldStatusOffset;
    BOOL            fModify;
} ADO_BINDING_ENTRY;

#define BEGIN_ADO_BINDING(cls) public: \
    typedef cls ADORowClass; \
    const ADO_BINDING_ENTRY* STDMETHODCALLTYPE GetADOBindingEntries() { \
    static const ADO_BINDING_ENTRY rgADOBindingEntries[] = {

#define ADO_FIXED_LENGTH_BINDING_ENTRY(Ordinal, DataType, Buffer, \    Status, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    0, \
    offsetof(ADORowClass, Buffer), \
    classoffset(CADORecordBinding, ADORowClass), \
    offsetof(ADORowClass, Status), \
    Modify},

#define ADO_NUMERIC_BINDING_ENTRY(Ordinal, DataType, \
    Buffer, Precision, Scale, Status, Modify)\
    {Ordinal, \
    DataType, \
    Precision, \
    Scale, \
    0, \
    offsetof(ADORowClass, Buffer), \
    classoffset(CADORecordBinding, ADORowClass), \
    offsetof(ADORowClass, Status), \
    Modify},

#define ADO_VARIABLE_LENGTH_BINDING_ENTRY(Ordinal, DataType, \
    Buffer, Size, Status, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    classoffset(CADORecordBinding, ADORowClass), \
    offsetof(ADORowClass, Status), \
    Modify},

#define END_ADO_BINDING() {0, adEmpty, 0, 0, 0, 0, 0, adFldOK, FALSE}};\
    return rgADOBindingEntries;}

//
// Interface that the client 'record' class needs to support.
// The ADO Binding entries provide the implementation for this interface.
//
class CADORecordBinding
{
public:
    STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries)
    (VOID) PURE;
};

//
// Interface that allows a client to fetch a record of data into
// class data members.
//
DEFINE_GUID(IID_IADORecordBinding,
                0x00000544, 0, 0x10, 0x80,0,0,0xAA,0,0x6D,0x2E,0xA4);
DECLARE_INTERFACE_(IADORecordBinding, IUnknown)
{
public:
    STDMETHOD(BindToRecordset)(CADORecordBinding *pAdoRecordBinding)PURE;
    STDMETHOD(AddNew)(CADORecordBinding *pAdoRecordBinding) PURE;
    STDMETHOD(Update)(CADORecordBinding *pAdoRecordBinding) PURE;
};

#endif // !_ICRSINT_H_


範例：ADO 不使用延伸功能

此程式段顯示如何從資料欄中擷取值然後轉換成 C++ 變數。

#import "c:\Program Files\Common Files\System\ADO\msado15.dll"
    no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>

Class CEmployee
{
public:
    FetchEmployeeData();

    char m_szFirstName[30];
    char m_szLastName[30];
    int nAge;
};

CEmployee::FetchEmployeeData()
{
_ConnectionPtr    pCon();
_RecordsetPtr     pRs();
FieldPtr            pfldFirstName, pfldLastName, pfldAge;
_variant_t        vFirstName, vLastName, vAge;

pCon.CreateInstance(__uuidof(Connection));
pCon->Open("pubs", "sa", "");

pRs.CreateInstance(__uuidof(Recordset));
pRs->Open("select FirstName, LastName, Age from Employees", pCon,
    adOpenForwardOnly, adLockReadOnly, adCmdUnknown);

pfldFirstName = pRs->Fields->GetItem(0);
pfldLastName = pRs->Fields->GetItem(1);
pfldAge = pRs->Fields->GetItem(2);

while (VARIANT_FALSE == pRs->EndOfFile)
    {
    vFirstName.Clear();
    vLastName.Clear();
    vAge.Clear();

    vFirstName = pfldFirstName->Value;
    WideCharToMultiByte(CP_ACP, 0, vFirstName.bstrVal, -1,
        m_szFirstName, sizeof(m_szFirstName), NULL, NULL);

    vLastName = pfldLastName->Value;
    WideCharToMultiByte(CP_ACP, 0, vLastName.bstrVal, -1,
        m_szLastName, sizeof(m_szLastName), NULL, NULL);

    nAge = vAge.iVal;

    pRs->MoveNext();
    }
}


範例: ADO 使用延伸功能

此程式顯示如何從資料欄中擷取值然後轉換成 C++ 變數。包括在程式段中描述的功能，範例: ADO 不使用延伸功能。

#define INITGUID
#import "c:\Program Files\Common Files\System\ADO\msado15.dll"
    no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
#include "icrsint.h"

void dump_com_error(_com_error &e)
    {
printf("Error\n");
printf("\a\tCode = %08lx\n", e.Error());
printf("\a\tCode meaning = %s", e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\a\tSource = %s\n", (LPCSTR) bstrSource);
printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);
    }

class CCustomRs :
    public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
    ADO_VARIABLE_LENGTH_BINDING_ENTRY(1, adVarChar, m_szau_lname,
            sizeof(m_szau_lname), lau_lnameStatus, FALSE)
    ADO_VARIABLE_LENGTH_BINDING_ENTRY(2, adVarChar, m_szau_fname,
            sizeof(m_szau_fname), lau_fnameStatus, TRUE)
END_ADO_BINDING()

public:
    CHAR    m_szau_lname[41];
    ULONG    lau_lnameStatus;
    CHAR    m_szau_fname[41];
    ULONG    lau_fnameStatus;
};

VOID    main()
    {
    HRESULT hr;
    IADORecordBinding    *picRs = NULL;

    ::CoInitialize(NULL);

    try
        {
        _RecordsetPtr pRs.CreateInstance(__uuidof(Recordset));        CCustomRs rs;

        pRs->Open("select FirstName, LastName, Age from Employees",
            "dsn=pubs;uid=sa;pwd=;",
            adOpenStatic, adLockOptimistic, adCmdUnknown);

        if (FAILED(hr = pRs->QueryInterface(__uuidof(IADORecordBinding),
                (LPVOID*)&picRs)))
            _com_issue_error(hr);

        if (FAILED(hr = picRs->BindToRecordset(&rs)))
            _com_issue_error(hr);

        while (VARIANT_FALSE == pRs->EndOfFile)
            {
        // Process data in the CCustomRs C++ instance variables.

            printf("\a\tName = %s \t%s",
                (lau_fnameStatus == adFldOK ? m_szau_fname : "<NULL>"),
                (lau_lnameStatus == adFldOK ? m_szau_lname): "<NULL>"));

        // Change the current row of the Recordset.
        // Recordset data for the new current row will automatically be
        // extracted and placed in the CCustomRs C++ instance variables.

            pRs->MoveNext();
            }
        }
    catch (_com_error &e)
        {
        dump_com_error(e);
        }

    if (picRs)
        picRs->Release();

    CoUninitialize();
    };


Data Shaping

資料呈像

ADO 可以讓您回答問題，其它解決方法可以用 Recordset 表示。例如，假設您想要公司客戶的清單，而且您有一個資料庫包含一個叫做 Customer 的表格。請對表格輸入查詢指令，ADO 就會傳回 Recordset，其中每一個資料列代表一位客戶，而每一個資料列的資料欄會有一個資料類型包含客戶的名稱、地址、專屬客戶 ID 等等。

資料呈像可以讓您回答問題，其它解決方法可以用形成的 Recordset 表示。資料呈現會定義形成之Recordset 的資料行、由資料行代表之實體之間的關係以及使用資料產生 Recordset 的方式。

形成的 Recordset 資料行可以包含資料提供者 (例如 SQL Server) 的資料、其它 Recordset 的參照、計算 Recordset 單一資料列取得的值、在整個 Recordset 某一個資料行執行操作取得的值；或者它們可以是全新建構的空資料行。

當您取得資料行的值，但該資料行包含其它 Recordset 的參照時，ADO 會自動傳回由參照表示的實際 Recordset。包含其它 Recordset 的 Recordset 稱為階層式 Recordset 或階層式資料指標。

例如，假設您想要公司客戶所有的訂單清單。請對包含 Customer 和 Table 表格的資料庫輸入資料呈像指令。和前面的範例一樣，ADO 會傳回客戶記錄的 Recordset。不過，每一個資料列會有額外的資料行，可以參照包含該客戶訂單的 Recordset。

您可以強化此呈像來取得各州的總銷售額清單。 Customers 表格的地址資料行包含每一位客戶的州，另外 Order 表格的總數資料行則包含每一張訂單的總數。輸入不同的資料呈像指令後，ADO 就會傳回 Recordset，裏面的每一個資料列代表每一州，每一個資料列包含一個資料行來識別該州、該州所有訂單的總銷售額數量，以及 Recordset (列出該州所有的客戶) 的參照。請存取該客戶 Recordset，您就會和前一個範例一樣，發現每一個客戶資料列有一個 Recordset (包含該客戶的所有訂單) 參照。

Shape 指令語法可以讓您設計程式來建立形成的 Recordset。接下來您可以透過程式或者透過適當的視覺控制項來存取 Recordset 的元件。

請參閱以下主題，詳細了解資料呈像：

  • 資料呈像摘要

  • 資料呈像必要的提供者

  • Shape 指令概論

  • Shape Append 指令

  • Shape Compute 指令

  • 存取階層式 Recordset 的資料列

  • 正式的 Shape 語法


資料呈像摘要

ADO 2.0 提供資料呈像功能、階層式 recordset 以及 Shape 指令語法。

ADO 2.1 提供重新會呈像、grandchild 加總、參數化指令以及中間的 COMPUTE 指令。

資料呈像

資料呈像可以讓您定義形成的 Recordset 的資料行、由資料行代表形成之實體之間的關係以及使用資料產生 Recordset 的方式。

形成的 Recordset 資料行可以包含資料、形成的 Recordset 的參照、計算 Recordset 單一資料列取得的值、在整個 Recordset 某一個資料行執行操作取得的值；或者它們可以是全新建構的空資料行。

當您取得資料行的值，但該資料行包含其它 Recordset 的參照時，ADO 會自動傳回由參照表示的實際 Recordset。包含其它 Recordset 的 Recordset 稱為階層式 Recordset。

階層式 Recordsets 展現 parent-child 關係，其中 parent 是包含的 Recordset 而 child 則是被包含的 Recordset。Recordset 的參照實際是 child 子集合的參照，稱為 chapter。單一 parent 可以包含一個以上的 child Recordset。

ADO 2.0 也提供新的 Shape 指令語法，它可以讓您透過程式設計建立形成的 Recordset 物件。輸入 Shape 指令的方式和其它 ADO 指令文字類似。

Shape 命令語法讓您以兩種方式建立階層式 Recordset 物件。第一種是附加子 Recordset 到主 Recordset， parent 和 child 至少要有一個共用的資料行：parent 資料列的資料行的值與 child 所有資料列的資料行的值相同。

您可以巢套階層式 Recordset 物件到任何您需要的深度 (也就是說，產生子 Recordset 物件的子 Recordset 物件等等)。

您可以設計程式或透過適用的視覺控制項來存取形成的 Recordset 的 Recordset 元件。

Microsoft 提供一個替您產生 Shape 指令的視覺化工具 (請參閱 Visual Basic 說明主題，"資料環境設計師") 與另一顯示階層式資料指標的視覺化工具 (請參閱 Visual Basic 說明主題，"使用 Microsoft Hierarchical Flexgrid Control")。

重新呈像

由 Shape 指令子句建立的 Recordset 可以被指定為別名 (一般帶有 AS 關鍵字)。在 ADO 2.1 中，形成的 Recordset 的別名可以用完全不同的指令來參照。也就是說，您可以輸入的 Shape 指令來變更或重新呈像以前形成的 Recordset。要支援此功能，ADO 提供新的 Recordset 物件 Name 屬性。

您的限制是無法在附加資料行到現有的 Recordset、重新呈像參數化的 Recordset 或任何中間 COMPUTE 句子中的 Recordset，或者在目前形成的 Recordset 以外的 Recordset 執行加總作業。

Grandchild 加總

建立在 Shape 指令子句的 chapter 資料行可以是指令的 chapter-alias name (一般帶有 AS 關鍵字)。您可以使用完整名稱來識別包含資料行的 child，就可以識別形成的 Recordset 任何 chapter 的任何資料行。例如，若 parent chapter - chap1 包含 child chapter - chap2，而且有一個總數資料行 – amt，則完整名稱就會是 chap1.chap2.amt。完整的名稱可以用來當做下列加總函數的引數：SUM、AVG、MAX、MIN、COUNT、STDEV 或 ANY。

參數化的指令以及中間的 COMPUTE 指令

典形的參數化 Shape APPEND 指令有一個子句，可以使用查詢指令來建立 parent Recordset；另外有其它子句，使用參數化查詢指令來建立子 Recordset – 也就是說，包含參數輸入區 (問號 “?”) 的指令。產生的形成的 Recordset 有兩個層次，其中 parent 會佔用上層而 child 佔用下層。

建立 Recordset 的子句現在可以是巢狀式 Shape Compute 指令的任意數，其中最深的巢狀指令包含參數化查詢。產生的形成的 Recordset 有多個層次，其中 parent 佔用最上層，而 child 佔用最下層，而 Shape COMPTE 產生的任何 Recordset 則佔用中間的層次。

此功能的一般用途是用來呼叫 Shape COMPUTE 的加總函數和群組處理功能，以便利用 child Recordset 相關的分析資訊來建立中間的 Recordset。因此，因為這是參數化 Shape 指令，所以每次存取 parent 的某一個 chapter 資料行，就會取得新的 child Recordset。因為中間的層次是從 child 取得，所以它們也需要被重新計算。


資料呈像必要的提供者

資料呈像一般需要兩個提供者。服務提供者 - Data Shaping Service for OLE Db 提供資料呈像功能，而資料提供者 (例如 OLE DB Provider for SQL Server) 則提供資料列來產生形成的 Recordset。

服務提供者的名稱可以被指定為 Connection 物件 Provider 屬性的值，或者連接關鍵字 "Provider="。

資料提供者的名稱可以被指定為 "Data Provider" 動態屬性的值，Data Shaping Service for OLE DB 會將它新增至 Connection 物件 Properties 集合物件或連接字串關鍵字 "Data Provider="。

若未產生 Recordset，則不需任何資料提供者 (例如形成之 Recordset 的所有資料行是用 NEW 關鍵字建立的)。在這種情況下，請指定 "Data Provider=none"。

範例

Dim cnn As New ADODB.Connection
cnn.Provider = "MSDataShape"
cnn.Open "Data Provider=MSDASQL;DSN=vfox;uid=sa;pwd=vfox;database=pubs”


一般的 Shape 指令

資料呈像定義形成之 Recordset 的資料行、由資料行代表形成之實體之間的關係以及使用資料產生 Recordset 的方式。

形成的 Recordset 會由下列的資料行類型組成：

資料行類型 | 說明
資料 | 從 Recordset (透過查詢指令傳回) 到資料提供者、表格或先前形成之 Recordset 的欄位。
chapter | 其它 Recordset 的參數，稱為 chapter。Chapter 資料行可以定義 parent-child 關係，其中 parent 是包含 chapter 資料行的 Recordset，而 child 是 由 chapter 表示的 Recordset。
加總 | 資料行的值是透過在所有資料列或 child Recordset 所有資料列的資料行上執行加總函數後，得到的值。(請參閱下表的加總函數)。
計算式 | 資料行的值是透過在 Recordset 同一資料列的資料行計算 Visual Basic for Applications 運算式取得的。運算式是 CALC 函數的引數。(請參閱下表的計算式)。
新增 | 全新建構的空欄位，以後可以產生資料。資料行是用 NEW 關鍵字。(請參閱下表的 NEW 關鍵字)。

Shape 指令可以包含子句，用來指定來源資料提供者 (會傳回 Recordset 物件) 的查詢指令。查詢的語法是依基礎資料提供者而定。這通常是 Structured Query Language (SQL)，雖然 ADO 不需要使用任何特殊的查詢語言。

您可以使用一個 SQL JOIN 子句來關聯兩個表格; 然而，一個階層式 Recordset 將更有效率地表示資料。由 JOIN 重複資訊會重複從表格之一產生 Recordset 的每一個資料列。一個階層式 Recordset 對多個子 Recordset 物件只有一個主 Recordset。

Shape 指令可以只由 Recordset 物件發出。

Shape 指令可被巢套。也就是說， parent-command 或 child-command 它自己可以是另一個 Shape 指令。

若需關於巡覽階層式 Recordset 的資訊，請參閱在一個階層式 Recordset 存取資料列。

如需正確的 Shape 指令語法詳細資訊，請參閱正式的 Shape 語法。

加總函數、CALC 函數以及 NEW 關鍵字

資料呈像支援下列函數。chapter-alias 是指定到 chapter，它包含要計算的資料行。

chapter-alias 可以是完整名稱，由每一個 chapter 資料行後面加上含資料行名稱的 chapter 組成的，之間會用句點分開。例如，如果 parent chapter - chap1 包含 child chapter - chap2，它有一個總數資料行 – amt，則完整名稱為 chap1.chap2.amt。

加總函數 | 說明
SUM(chapter-alias.column-name) | 計算指定之資料行內所有值的總合。
AVG(chapter-alias.column-name) | 計算指定之資料行內所有值的平均值。
MAX(chapter-alias.column-name) | 計算指令之資料行內的最大值。
MIN(chapter-alias.column-name) | 計算指令之資料行內的最小值。
COUNT(chapter-alias[.column-name]) | 計算指定之別名或資料行內資料列的數目。
STDEV(chapter-alias.column-name) | 計算指定之資料行內的標準離差。
ANY(chapter-alias.column-name) | 資料行的值 (其中資料行的值和所有資料列的值相同)。

計算式 | 說明
CALC(expression) | 計算任意運算式，但計算包含 CALC 函數的Recordset 上的資料列。任何 Visual Basic for Applications (VBA) 函數或運算式皆可使用。

NEW 關鍵字 | 說明
NEW (field type [(width | scale [,precision])] | 新增指令之類型的空資料行到 Recordset。


Shape Append 指令

Shape APPEND 指令會指定一個子 Recordset 到在主 Recordset 中 Field 物件的 Value 屬性。

語法

SHAPE {parent-command} [[AS] parent-alias]

APPEND ({child-command} [AS] child-alias

RELATE parent-column TO child-column...) [[AS] chapter-alias] ...

組成說明

此指令的各部組成如下：

parent-command， child-command 下列其中一個。

  • 括號 ("{}") 內的查詢指令，可傳回 Recordset 物件。指令是輸入到來源資料提供者，它的語法是由提供者的需求決定皂。雖然 ADO 不需要任何特定的查詢語言，不過一般它是結構化查詢語言 (SQL)。括號 ("()") 是必要的關鍵字，它們會將 chapter 資料行附加到 parent – 它會參數查詢指令傳回的 Recordset。

  • 以前形成的 Recordset 名稱。

  • 其它的 Shape 指令。

  • TABLE 關鍵字，後面加上表格名稱。

parent-column 由 parent-command 傳回 Recordset 中的一個資料欄。

child-column 由 child-command 傳回 Recordset 中的一個資料欄。

... "parent-column TO child-column" 子句實際上是一個清單，其中每一個定義的關係會用逗點分開。

chapter-alias 別名，指向附加到 parent 的資料行。

parent-alias 別名，指向 parent Recordset。

child-alias 別名，指向 child Recordset。

... APPEND 關鍵字後面的子句實際上是一個清單，其中每一個子句是用逗點分開，而且會定義其它要附加到 parent 的資料行。

作業

輸入 parent-command，然後傳回 Recordset。接下來輸入 child-command，然後傳回 child Recordset。

例如，parent-command 可以傳回 Customer 表格中某公司的客戶 Recordset，而 child-command 會傳回 Order 表格中所有客戶的訂單 Recordset。

parent 和 child Recordset 物件必須要有通用的資料行，以便讓 parent 和 child 產生關聯。資料行是在 RELATE 子句內指定，parent-column 在先，然後是 child-column。資料行在相對的 Recordset 物件內的名稱可以不同，但是必須指向相同的資訊，才能指定有意義的關係。例如， Customers 和 Orders Recordsets 兩者可以有一個 customerID 欄位。

資料呈像會將 chapter 資料行附加到 parent Recordset。Chapter 資料行內的值是 child Recordset 的資料列參數，它滿足 RELATE 子句。也就是說，指定之 parent 資料列的 parent-column 的值和 chapter child 所有資料列內的 child-column 相同。

當您存取 chapter 資料行的參照時，ADO 會自動取得由參照表示的 Recordset。請注意雖然已經取得整個 child Recordset，但是 chapter 只表示資料列的子集合。

若附加的資料行沒有 chapter-alias，就會自動為它產生名稱。資料行的 Field 物件會被附加到 Recordset 物件的 Fields 集合物件，而且它的資料類型將會是 adChapter。

如需關於巡覽階層式 Recordset 的資訊，請參閱存取階層式 Recordset 的資料列。

參數化指令

若您正在處理大型的 child Recordset，特別是比 parent Recordset 還大的時候，只需要存取較少的 child chapter，然後就會發現使用參數化指令會更有效率。

非參數化指令會取得整個 parent 和 child Recordsets，然後附加 chapter 資料行到 parent，接下來指定參照給每一個 parent 資料列的相關 child charpter。

參數化指令會取得 parent Recordset，但是當存取 chapter 資料行的時候，只會取得 chapter Recordset。擷取策略的不同可以產生重大的效能優點。

例如，您可以指定下列：

"SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)"

主與子表格恰巧有一個共通的欄位名稱，cust_id。child-command 有一個預留位置的符號 (就是 "?")，到 RELATE 子句引用的地方 (就是 "...PARAMETER 0")。關聯是在預留位置符號所辨的明確 customer 表格 parent-column, cust_id，以識別的 orders 表格 child-column, cust_id, 由輸入保留區和 "PARAMETER 0" 指定。

注意 PARAMETER 子句只針對 Shape 指令語法而已。它和 ADO Parameter 物件或 Parameters 集合物件不相關。

當執行 Shape 指令時，發生下列事情：

  1. 執行 parent-command，然後從 customer 表格傳回 parent Recordset。

  2. chapter 資料行被附加到 Recordset。

  3. 當存取 parent 資料列的 chapter 資料行時，customer.cust_id 資料行的值會取代 orders.cust_id 的輸入保留區，然後執行 child-command 。

  4. 所有 orders 表格的資料列，其中會取得與 customer.cust_id 資料行值相同的 orders.cust_id 資料行值。

  5. 取得的 child 資料列參照 (也就是 child Recordset 的 chapter) 會放到 parent Recordset 目前資料列的 chapter 資料行。

  6. 存取其它資料列的 chapter 資料行時重複 3-5 的步驟。

中間的 Shape COMPUTE 指令

現在可以有效在不限數目的巢狀式 Shape COMPUTE 指令中嵌入參數化 Shape 指令的參數化指令。下列是範例：

SHAPE {select au_lname, state from authors} APPEND
((SHAPE
(SHAPE
{select * from authors where state = ?} rs
COMPUTE rs, ANY(rs.state) state, ANY(rs.au_lname) au_lname
BY au_id) rs2
COMPUTE rs2, ANY(rs2.state) BY au_lname)
RELATE state TO PARAMETER 0)


Shape Compute 指令

Shape COMPUTE 指令會產生 Recordset，它的資料行是由 child Recordset 的參數組成的；選用的資料行，它的內容是在 child Recordset 或以前形成之 Recordset 執行加總函數後的結果；任何 child Recordset 的資料行是列示在選用的 BY 子句。

語法

"SHAPE {child-command} [AS] child-alias

COMPUTE child-alias [ ,aggregate-command-field-list]

[BY grp-field-list]"

組件說明

此指令的組成有：

child-command 下列其中一個。

一個傳回 child Recordset object的查詢 within curly braces ("{}")指令。指令是發給傳回 Recordset 物件的基礎資料提供者。查詢的語法是依基礎資料提供者而定。這通常是 Structured Query Language (SQL)，雖然 ADO 不需要使用任何特殊的查詢語言。

  • 語言.

  • 以前形成之 Recordset 的名稱。

  • 其它的 Shape 指令。

  • TABLE 關鍵字，後面加上表格的名稱。

child-alias 別名，用來指向 child-comman 傳回的 Recordset。COMPUTE 子句的資料行清單需要 child-alias，可用來定義 parent 和 child Recordset 物件之間的關係。

aggregate-command-field-list 清單，可定義產生之 parent 內的資料行，它有一個在 child Recordset 執行加函數後產生的值。

grp-field-list 清單，在 parent 和 child Recordset 物件的資料行，指定資料列如何劃分到 child 的群組。

至於 grp-field-list 的每一個資料行方面，child 和 parent Recordset 物件會有相對的資料行。至於 parent Recordset 的每一個資料列方面，grp-field-list 資料行會有專屬的值，而 parent 資料列參數的 child Recordset 只包含 child 資料列，它的 grp-field-list 資料行的值和 parent 資料列相同。

若 COMPUTE 子句包含加總函數但不包含 BY 子句，則會有一個包含整個 child Recordset 加總值的 parent 資料列。若有一個 BY 子句，則就會有多個 parent 資料列，每一個會 child Recordset 的參照和加總值。

作業

child-command 會輸入到提供者，它會傳回 child Recordset。

COMPUTE 子句會指定 parent Recordset 的資料行，它可以是 child Recordset 的參數、一或多個加總、計算式或新資料行。若有一個 BY 子句，則它定義的資料行也會被附加到 parent Recordset。BY 子句會定義如何劃分 child Recordset 的資料列群組。

例如，假設您有一份表格、圖表，包含州、城市與人口資料欄 (人口圖表只是為了舉例使用)。

州 | 城市 | 人口
WA | Seattle | 700,000
OR | Medford | 200,000
OR | Portland | 600,000
CA | Los Angeles | 900,000
CA | San Diego | 400,000
WA | Tacoma | 500,000
OR | Corvallis | 300,000

現在請發出此 Shape 指令：

    rst.Open        "SHAPE  {select * from demographics} AS rs
                    COMPUTE SUM(rs.population), rs
                    BY state",
                    connection

此指令會用兩個層次開啟形成的 Recordset。Parent 層次是加總資料行 (SUM(rs.population)) 產生的 Recordset、參照 child Recordset (rs) 的資料行以及用於劃分 child Recordset (state) 群組的資料行。child 層次是查詢指令 (select * from demographics) 傳回的 Recordset。

子 Recordset 會詳列將被群組的資料列，但沒有依特殊的次序。也就是說，群組將不會以字母或數字排序。

追加的名稱會為附加的資料欄產生。

您現在可以巡覽已開啟的主 Recordset，然後存取詳列的子 Recordset 物件。請參閱在一個階層式 Recordset 中存取資料。

結果的主與子詳細 Recordsets

Parent

SUM (rs.Population) | rs | State
1,300,000 | 參照 child1 | CA
1,200,000 | 參照 child2 | WA
1,100,000 | 參照 child3 | OR

Child1

州 | 城市 | 人口
CA | Los Angeles | 900,000
CA | San Diego | 400,000

Child2

州 | 城市 | 人口
WA | Seattle | 700,000
WA | Tacoma | 500,000

Child3

州 | 城市 | 人口
OR | Medford | 200,000
OR | Portland | 600,000
OR | Corvallis | 300,000


在一個階層式 Recordset 存取資料列

下列範例顯示在階層式 Recordset 存取資料列所需的步驟：

  1. 從 authors 與 titleauthors 表格而來的 Recordset 物件會經由 author ID 關聯。

  2. 外部迴圈會顯示作者的姓與名、狀態與識別碼。

  3. 每個資料列附加的 Recordset 會從 Fields 集合物件被擷取然後指定到 rstTitleAuthor。

  4. 內部迴圈會在附加的 Recordset 中從每個資料列顯示四個資料欄。

(StayInSync 屬性是設定成 FALSE，方便示範用途 – 所以您可以在每個往外迴圈敘述中清楚看到 chapter 變更。不過，若步驟 3 的指定移到步驟 2 的第一行前面，因此只會執行指定一次，所以會更有效率。接下來將 StayInSync 屬性設定為 TRUE，任何時候 rst 移到新的資料列時， rstTitleAuthor 就會暗中自動變更到相對的 chapter)。

範例

Sub datashape()
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim rstTitleAuthor As New ADODB.Recordset

    cnn.Provider = "MSDataShape"
    cnn.Open     "Data Provider=MSDASQL;" & _
                    "DSN=vfox;uid=sa;pwd=vfox;database=pubs”
'STEP 1
    rst.StayInSync = FALSE
    rst.Open     "SHAPE  {select * from authors}
                    APPEND ({select * from titleauthor}
                    RELATE au_id TO au_id) AS chapTitleAuthor",
                    cnn
'STEP 2
    While Not rst.EOF
        Debug.Print     rst("au_fname"), rst("au_lname"),
                            rst("state"), rst("au_id")
'STEP 3
        Set rstTitleAuthor = rst("chapTitleAuthor").Value
'STEP 4
        While Not rstTitleAuthor.EOF
            Debug.Print rstTitleAuthor(0), rstTitleAuthor(1),
                                rstTitleAuthor(2), rstTitleAuthor(3)
            rstTitleAuthor.MoveNext
        Wend
        rst.MoveNext
    Wend
End Sub


正式 Shape 文法

正式 Shape 語法

這是建立任何 Shape 指令的正式語法。

  • 需求的語法詞彙是以角括號分隔的文字字串 ("<>")。

  • 選擇性的詞彙以方括號隔開 ("[ ]")。

  • 選擇以短斜線表示 ("|")。

  • 重複的選擇以一個省略符號表示 ("...")。

  • Alpha 表示照字母順序的字串。

  • Digit 表示數字的字串。

  • Unicode-digit 表示 unicode 數字的字串。

  • 所有的其他辭彙是實字。

辭彙 定義
<shape-command>

[<table-exp> [[AS] <alias>]][<shape-action>]

<table-exp>

{<native-sql-statement>} |
(<shape-command>) |
TABLE <quoted-name> |
<quoted-name>

<shape-action>

APPEND <aliased-field-list> |
COMPUTE <aliased-field-list>
    [BY <field-list> [[AS] <alias>]]
|

<aliased-field-list>

<aliased-field> [, <aliased-field...]

<aliased-field>

<field-exp> [[AS] <alias>]

<field-exp>

(<relation-exp>) |
<calculated-exp>

<relation_exp>

<table-exp> [[AS] <alias>]
    RELATE <relation-cond-list>

<relation-cond-list>

<relation-cond> [, <relation-cond>...]

<relation-cond>

<field-name> TO <child-ref>

<child-ref>

<field-name> |
PARAMETER <param-ref>

<param-ref>

<number>

<field-list>

<field-name [, <field-name>]

<calculated-exp>

SUM(<qualified-field-name>) |
AVG(<qualified-field-name>) |
MIN(<qualified-field-name>) |
MAX(<qualified-field-name>) |
COUNT(<alias> | <qualified-field-name>) |
STDEV(<qualified-field-name>) |
ANY(<qualified-field-name>) |
CALC(<expresion>)

<qualified-field-name>

<alias>.[<alias>...]<field-name>
<alias>

<quoted-name>

<field-name>

<quoted-name>

<quoted-name>

"<string>" |
'<string>' |
[<string>] |
<name>

<name>

alpha [ alpha | digit | _ | # ...]

<number>

digit [digit...]

<expression>
 由 Jet Expression service Visual Basic for Applications 運算式識別的運算式，它的運算元是同一資料列的其它非 CALC 資料行。


DataFactory 自訂

Remote Data Service 提供一個可在三層的用戶端/伺服器系統中輕鬆執行資料存取的方法。用戶端資料控制指定連結及指令字串參數，以在 Remote Data Service 執行查詢，或控制連結字串及 Recordset 物件參數以執行更新。

參數會傳送至實際在 Remote Data Service 執行資料存取操作的伺服器程式。RDS 提供的預設程式為 RDSServer.DataFactory 物件。RDSServer.DataFactory 物件會將查詢所產生的所有 Recordset 物件傳回至用戶端。

但是 RDSServer.DataFactory 限定於執行查詢及更新，而不能執行連結或指令字串上的驗證或處理。

使用 ADO 時，您可以指定 DataFactory 與另一個稱為處理常式的伺服器程式類型搭配工作。事件處理常式可以在用戶端連結及指令字串存取資料來源前，先加以修改。此外 Handler 可以強制存取管理用戶端讀寫資料來源的權力。

處理常式用於修改用戶端參數及存取權力的參數都在自訂檔案中指定。

閱讀下列主題，取得更多有關自訂 DataFactory 物件的資訊：

  • 了解自訂檔案

  • 區段的自訂檔案

  • 自訂檔案的 SQL 區段

  • 自訂檔案的 UserList 區段

  • 自訂檔案的 Logs 區段

  • 所需的用戶端設定

  • 撰寫自己的自訂處理常式


了解自訂檔案

自訂檔案各個區段的前置資料是由包含型態及參數的方括號 ([]) 組成。四個文字字串 connect、sql、userlist 或 logs 代表四種區段類型、參數可以為文字字串、預設、使用者定義識別項或 Null。

所以每個區段都以下列區段前置資料之一做為標記：

[ connect    default        ]
[ connect    identifier    ]
[ sql            default        ]
[ sql            identifier    ]
[ userlist    identifier    ]
[ logs                        ]

區段前置資料包括下列部份：

選項 | 說明
connect | 文字字串—修改連結字串的區段。
sql | 文字字串—修改指令字串的區段。
userlist | 文字字串—修改特定使用者存取權限的區段。
logs | 文字字串—指定記錄作業錯誤記錄檔的區段。
default | 文字字串—若未指定或找不到識別項則使用此區段。
identifier 符合連結或指令字串的字串。
  • 如果區段前置資料包含 connect，且在連結字串中發現識別項字串，則使用此區段。

  • 如果區段前置資料包含 sql，且在指令字串中發現識別項字串，則使用此區段。

  • 如果區段前置資料包含 userlist，且識別項字串與 connect 區段識別項相符，則使用此區段。

DataFactory 呼叫處理常式傳送用戶端參數，處理常式在符合某些適當區段前置資料的用戶端參數中搜尋整個字串，若發現符合的字串，該區段的內容就會應用至用戶端參數。

在下列情況下，會使用特別的區段：

  • 如果用戶端連結字串關鍵字 "Data Source=value" 的值項目符合 connect 區段識別項，則使用 connect 區段。

  • 如果用戶端指令字串包含符合 sql 區段識別項的字串，則使用 sql 區段。

  • 如果沒有相符的識別項，則會使用具有預設參數的 connect 或 sql 區段。

  • 如果 userlist 區段識別項符合 connect 區段識別項，則使用 userlist 區段。如果出現相符，userlist 區段的內容會應用至由 connect 區段管理的連結。

  • 如果連結中的字串或指令字串與 connect 或 sql 區段前置資料並不相符，且 connect 或 sql 區段前置資料並無預設參數，則用戶端字串不會經過修改而直接使用。

  • 只要作業中具有 DataFactory，則將會使用 logs 區段。


Connect 區段的自訂檔案

連結區段包括：

  • 取代用戶端字串的新連結字串。

  • 此連結允許的預設存取項目，可指定預設的讀寫作業。如果區段中沒有預設的存取輸入項目，則會忽略區段。

語法

取代連結字串項目的格式為：

Connect=connectionString

預設存取項目的格式為：

Access=accessRight

項目 | 說明
Connect | 文字字串—表示此為連結字串項目。
connectionString | 取代整個用戶端連結字串的字串。
Access | 文字字串—表示此為存取項目。
accessRight 存取權限為下列其中之一：
  • NoAccess—使用者不能存取資料來源。

  • ReadOnly—使用者可以讀取資料來源。

  • ReadWrite—使用者可以讀取或寫入資料來源。


自訂檔案的 SQL 區段

sql 區段：

  • 包括取代用戶端指令字串的新 SQL 字串。如果區段中沒有任何 SQL 字串，則忽略此區段。

新的 SQL 字串可能會被設定參數。也就是說在 sql 區段 SQL 字串中的參數 (以問號 '?' 標明的字元) 可以被用戶端指令字串的識別項中對應的引數 (括號內以逗號相隔的清單) 所取代。識別項及括號內的引數清單) 行為就像函數呼叫。

舉例而言，假設用戶端指令字串為 "CustomerByID(4)"，SQL 區段前置資料為 [SQL CustomerByID]，而新的 SQL 區段字串為 "SELECT * FROM Customers WHERE CustomerID = ?"。[Handler] 會產生 "SELECT * FROM Customers WHERE CustomerID = 4"，並使用該字串來查詢資料來源。

如果新的 SQL 陳述式並無字串 ("")，則忽略此區段。

如果新的 SQL 陳述式無效，則陳述式的執行將會失敗。用戶端參數有效的被忽略。您可以故意這樣做以 "關閉" 所有指定的用戶端 SQL 指令：

[SQL default]
SQL = " "

語法

取代 SQL 字串項目的格式為：

SQL=sqlString

項目 | 說明
SQL | 文字字串—表示此為 SQL 區段項目。
sqlString | 取代用戶端字串的 SQL 字串。


自訂檔案的 UserList 區段

此 userlist 區段附屬於具有相同區段識別項參數的 connect 區段。

此區段：

  • 包括使用者存取項目：可指定特定使用者的存取權限，並蓋過相符的 connect 區段中的預設存取項目。

語法

使用者存取項目的格式為：

userName=accessRights

項目 | 說明
userName | 使用此連結的人員的使用者名稱。以 IIS [服務管理員] 對話方塊設定有效的使用者名稱。
accessRights 存取權限為下列其中之一：
  • NoAccess—使用者不能存取資料來源。

  • ReadOnly—使用者可以讀取資料來源。

  • ReadWrite—使用者可以讀取或寫入資料來源。


自訂檔案 Logs 區段

自訂檔案的 Logs 區段

Logs 區段包括記錄檔案項目，可指定在 DataFactory 作業期間記錄所發生錯誤的檔案名稱。

語法

記錄檔案項目的格式為：

err=FileName

項目 | 說明
err | 文字字串—表示此為記錄檔案項目。
FileName | 完整路徑及檔案名稱。特有的檔案名稱為 c:\msdfmap.log。

記錄檔案中包括每個錯誤發生的使用者名稱、HRESVLT、每個錯誤發生的日期及時間。


所需的用戶端設定

指定下列設定以使用自訂的 DataFactory Handler。

  • 指定 Connection 物件的 Provider 屬性為 "Provider=MS Remote"，或指定 Connection 物件連結字串的 "Provider=" 關鍵字。

  • 設定 CursorLocation 屬性為 adUseClient。

  • 指定 Handler 的名稱，以在 RDS.DataControl 物件的 Handler 屬性，或 Recordset 物件連結字串的 "Handler=" 關鍵字中使用。(不能在 Connection 物件連結字串中設定 Handler。)

    RDS 在伺服器上提供預設的 Handler 稱為 MSDFMAP.Handler。(預設的自訂檔案稱為 MSDFMAP.INI。)

範例

假設下列區段在 MSDFMAP.INI 中，且資料來源名稱 AdvWroks 之前已經定義：

[connect CustomerDataBase]
Access=ReadWrite
Connect="DSN=AdvWorks"

[sql CustomerById]
SQL="SELECT * FROM Customers WHERE CustomerID = ?"

下列程式碼是以 Visual Basic 撰寫：

RDS.DataControl 版本

Dim dc as New RDS.DataControl
Set dc.Handler = "MSDFMAP.Handler"
Set dc.Server = "http://YourServer"
Set dc.Connect = "Data Source=CustomerDatabase"
Set dc.SQL = "CustomerById(4)"
dc.Refresh

Recordset 版本

Dim rs as New ADODB.Recordset
rs.CursorLocation = adUseClient

指定 Handler 屬性或關鍵字；Provider 屬性或關鍵字；和 CustomerById 及 CustomerDatabase 識別項。接著開啟 Recordset 物件。

rs.Open "CustomerById(4)", "Handler=MSDFMAP.Handler;" & _
"Provider=MS Remote;Data Source=CustomerDatabase;" & _
    "Remote Server=http://YourServer"


撰寫自己的自訂處理常式

如果您是一位想要有預設 RDS 支援，但在使用者要求及存取權限上握有較多控制的 IIS 伺服器管理員，您或許希望撰寫自己的處理常式。

MSDFMAP.處理常式使用 IDataFactoryHandler 介面。

IDataFactoryHandler 介面

此介面具有 GetRecordset 與 Reconnect 兩種方法，且兩種方法都需要將 CursorLocation 屬性設定為 adUseClient。

兩種方法都是拿取出現在 "Handler=" 關鍵字第一個逗號之後的引數。例如 "Handler=progid,arg1,arg2;" 將會傳送引述字串 "arg1,arg2"；而 "Handler=progid" 則傳送一個 Null 的引數。

GetRecordset 方法

此方法用於查詢資料來源，並以所提供的引數建立新的 Recordset 物件。Recordset 必須搭配 adLockBatchOptimistic 開啟，而且不能夠非同步開啟。

引數

conn 連結字串。

args 處理常式的引數。

query 進行查詢的指令文字。

ppRS Recordset 應該從何處傳回的指標。

重新連結方法

此方法用於更新資料來源。它會建立新的 Connection 物件，並附加所給予的 Recordset。

引數

conn 連結字串。

args 處理常式的引數。

pRS Recordset 物件。

msdfhdl.idl

IDataFactoryHandler 出現於 msdfhdl.idl 檔案中，此為其介面的定義。

[
    uuid(D80DE8B3-0001-11d1-91E6-00C04FBBBFB3),
  version(1.0)
]
library MSDFHDL
{
       importlib("stdole32.tlb");
    importlib("stdole2.tlb");

        // TLib : Microsoft ActiveX Data Objects 2.0 Library
        // {00000200-0000-0010-8000-00AA006D2EA4}
        #ifdef IMPLIB
    importlib("implib\\x86\\release\\ado\\msado15.dll");
    #else
    importlib("msado20.dll");
    #endif

    [
      odl,
      uuid(D80DE8B5-0001-11d1-91E6-00C04FBBBFB3),
      version(1.0)
    ]
    interface IDataFactoryHandler : IUnknown
        {
HRESULT _stdcall GetRecordset(
        [in] BSTR conn,
        [in] BSTR args,
        [in] BSTR query,
        [out, retval] _Recordset **ppRS);

// DataFactory will use the ActiveConnection property
// on the recordset after calling Reconnect.
    HRESULT _stdcall Reconnect(
        [in] BSTR conn,
        [in] BSTR args,
        [in] _Recordset *pRS);
        };
};


_ADO API 參考資訊

ADO 文件的此節包含每一ADO 物件、集合物件、方法、事件、與屬性的主題。若需詳細資訊，請搜尋索引中特定的主題或參考下列主題：

  • ADO 物件集合

  • ADO 物件集合

  • ADO 方法

  • ADO 事件

  • ADO 屬性


ADO 物件模式

每一 Connection、Command、Recordset 與 Field 物件也都有 Properties 集合物件。


ADO 物件

ADO 物件摘要

物件 | 說明
Command | 定義您想要對資料來源執行的特定指令。
Connection | 代表資料來源的開啟連接。
DataControl (RDS) | 將資料查詢 Recordset 連結到一或多個控制項 (例如，文字方塊、格線控制線或選擇方塊) 來顯示 Web 網頁上的 ADOR.Recordset 資料。
DataFactory (RDS Server) | 建立方法，提供用戶端應用程式指定資料的讀取權。
DataSpace (RDS) | 建立用戶端 proxy來自訂中間層上的 business 物件。
Error | 包含有關包括提供者單一作業的資料存取錯誤。
Field | 以一般資料類型代表資料欄位。
Parameter | 代表有關以參數化查詢或預存程序為基礎的 Command 物件其參數或引數。
Property | 代表由提供者所定義的 ADO 物件其動態特性。
RecordSet | 代表基礎表格或執行之指令的結果的整個記錄組。任何時候， Recordset 物件單指與目前記錄集裏面的單筆記錄。

這些物件間的關連以 ADO 物件模式 表示。

每個物件都被包含於其相關的物件集合。例如 Error 物件會被包含於 Errors 物件集合。若需更多資訊，請參閱 ADO 集合物件 o或特定的集合物件主題。


Command 物件 (ADO)

Command 物件

Command 物件是您希望對著資料來源執行的特定指令之定義。

備註

使用 Command 物件來查詢資料庫並傳回 Recordset 物件中的紀錄，執行批次操作，或操作資料庫的結構。依據提供者的功能，某些 Command 集合物件，方法，或屬性可能在參照時會產生錯誤。

利用 Command 物件的集合物件、方法與屬性，您可以：

  • 配合 CommandText 屬性，定義指令的可執行文字 (例如，SQL 敘述)。

  • 配合 Parameter 物件與 Parameters 集合物件，定義參數化查詢或預存程序引數。

  • 配合 Execute 方法於適當時，執行指令並傳回 Recordset 物件。

  • 配合 CommandType 屬性，指定指令的類型，於執行前取得最佳化的效能。

  • 配合 Prepared 屬性控制提供者，是否於執行前儲存指令的預存 (或編譯過) 版本。

  • 配合 CommandTimeout 屬性設定提供者，等候要執行指令的秒數。

  • 藉由設定其 ActiveConnection 屬性，使連結與 Command 物件相關。

  • 設定 Name 屬性，當作相關 Connection 物件上的方法來辨識 Command 物件。

  • 傳送 Command 物件至 Recordset 的 Source 屬性以取得資料。

    注意 若要執行查詢而不使用 Command 物件，傳送查詢字串到 Connection 物件的Execute 方法或到 Connection 物件或到 Recordset 物件的 Open 方法。然而，當您想要保留指令文字並重新執行、或使用查詢參數時，需要有 Command 物件。

若要建立與先前所定義 Connection 物件無關的 Command 物件，請設定其 ActiveConnection 屬性以使連線字串有效。ADO 仍會建立 Connection 物件，但其沒有指定該物件至物件變數。然而，您使用相同連線關聯多 Command 物件時，您應該明確地建立並開啟 Connection 物件；這會將 Connection 物件關聯到物件變數。如果您沒有數定 Command 物件的 ActiveConnection 屬性到此物件變數，就算您使用相同的連線字串，ADO 也會為每個 Command 物件建立新的 Connection 物件。

若要執行 Command，只要呼叫其位於相關 Connection 物件上的 Name 屬性即可。Command 必須將其 ActiveConnection 屬性設定至 Connection 物件。如果 Command 有參數，請將這些值當作引數傳送到方法。

如果在相同物件集合中執行兩或更多的 Command 物件，且其中之一的 Command 物件是有輸出參數的預存程序，則會發生錯誤。若要執行每一 Command 物件，請使用分開的集合物件或從集合物件中取消所有其他 Command 物件的連線。


Connection 物件 (ADO)

Connection 物件

Connection 物件代表資料來源的開啟連接。

備註

Connection 物件代表使用資料來源的唯一過程。在主從式資料庫系統的例子中，它可以相當於實際網路連線到伺服器。根據提供者所提供的功能，可能無法獲得 Connection 物件的某些集合物件、方法、或屬性。

使用 Connection 物件的集合物件、方法與屬性，您可以從事下列工作：

  • 配合 ConnectionString，ConnectionTimeout 與 Mode 屬性，在開始連線前，對連線進行組態。

  • 設定 CursorLocation 屬性來引發支援批次更新的伺服端資料指標提供者 (Client Cursor Provider)

  • 配合 DefaultDatabase 屬性設定連線的預設資料庫。

  • 配合 IsolationLevel 屬性，設定連線時所開啟交易的隔離層次。

  • 配合 Provider 屬性，指定 OLE DB 提供者。

  • 配合 Open 與 Close 方法，發佈與稍後中斷實際連線到資料來源。

  • 配合 Execute 方法執行連線的指令，並配合 CommandTimeout 屬性對執行進行組態。

  • 配合 BeginTrans、CommitTrans 與 RollbackTrans 方法，以及 Attributes 屬性，在連線時管理交易，若提供者支援的話，還包括巢狀交易。

  • 配合 Errors 集合物件，檢驗從資料來源傳回的錯誤訊息。

  • 搭配 Version 屬性，讀取所使用 ADO 的版本。

  • 配合 OpenSchema 方法，取得有關您資料庫的結構敘述資訊。

    注意 若要執行查詢而不使用 Command 物件，傳送查詢字串到 Connection 物件的Execute 方法或到 Connection 物件或到 Recordset 物件的 Open 方法。然而，當您想要保留指令文字並重新執行、或使用查詢參數時，需要有 Command 物件。

您可以建立與其它先前所定義物件無關的 Connection 物件。

注意 如果指令或預存的程序是 Connection 物件上的原始方法，您可以執行指令或預存的程序。

若要執行指令，請使用 Command 物件的 Name 屬性，給定指令名稱。設定 Command 物件的 ActiveConnection 屬性來連線。然後發佈其中指令名稱可以用來當作 Connection 物件上方法的敘述，其後接任意參數，若傳回任何列，則接 Recordset 物件。設定 Recordset 屬性來自訂造成的 recordset。例如：

Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
...
cnn.Open "..."
cmd.Name = "yourCommandName"
cmd.ActiveConnection = cnn
...
'Your command name, any parameters, and an optional Recordset.
cnn.yourCommandName "parameter", rst

若要執行預存的程序 (stored procedure)，則發佈其中預存程序用來當作 Connection 物件上方法的敘述，隨後接任意參數。ADO 將會盡最大能力猜測參數類型，例如：

Dim cnn As New ADODB.Connection
...
'Your stored procedure name and any parameters.
cnn.sp_yourStoredProcedureName "parameter"


DataControl 物件(RDS)

RDS.DataControl 物件連結資料查詢 Recordset 至一或多控制項 (例如，文字方塊、格線控制項、或組合方塊) 以顯示網頁上的 ADOR.Recordset 資料。

語法

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DataControl"

<PARAM NAME="Connect" VALUE="DSN=DSNName;UID=usr;PWD=pw;">

<PARAM NAME="Server" VALUE="http://awebsrvr">

<PARAM NAME="SQL" VALUE="QueryText">

</OBJECT>

備註

RDS.DataControl 物件的類別 ID 是 BD96C556-65A3-11D0-983A-00C04FC29E33。

對基本運作而言，您只需設定 RDS.DataControl 物件的 SQL、Connect 與 Server 屬性，其會自動呼叫預設的 business 物件，RDSServer.DataFactory。

RDS.DataControl 中的所有屬性都不是必要的，因為自訂的 business 物件可以取代它們的功能。

使用 RDS.DataControl 物件來連結單一查詢對一或多視覺化控制項的結果。例如，假設您撰寫要求如名稱、居住地、出生地、年紀、與客戶優先狀態等客戶資料的查詢程式碼。您可以使用單一 RDS.DataControl 物件，於三個分離的文字方塊顯示客戶的名稱、年紀與區域，於一個核取方塊顯示客戶優先狀態，以及在格點控制項中顯示所有資料。

使用不同的 RDS.DataControl 物件來連結多個查詢對不同視覺化控制項的結果。例如，假設您使用一個查詢來取得有關客戶的資訊，第二個查詢取得有關客戶購買產品的資訊。您想要在三個文字方塊與一個核選方塊中顯示第一個查詢的結果，在格點控制項中顯示第二個查詢的結果。若您使用預設的 business 物件 (RDSServer，DataFactory)，您需要做下列事項：

  • 新增兩個 RDS.DataControl 物件到您的網頁。

  • 撰寫兩個查詢，一個查詢是為了兩個 RDS.DataControl 物件的每一 SQL 屬性。一個 RDS.DataControl 物件將包含 SQL 查詢，要求客戶資料；第二個將包含要求客戶購買商品清單的查詢。

  • 在每個連結控制項的 OBJECT 附加文字，指定 DATAFLD 值來是設定您要顯示在每個視覺化控制項中資料的值。

您可以使用 OBJECT 附加文字來內嵌 RDS.DataControl 物件到單一網頁，其數目沒有限制。

當您在網頁上定義 RDS.DataControl 物件時，請使用非零的 Height 與 Width 值，如 1，避免包含額外空間。

Remote Data Service 用戶端組件已經當作 Internet Explorer 4.0 安裝程式的一部份納入；因此，您不需要在 RDS.DataControl 物件標示文字納入 CODEBASE 參數。

測試的控制項

下列表格列出與 RDS.DataControl 物件搭配經過測試，及關聯用戶端組件的可聯繫資料的控制項。其它控制項可能也可以搭配 Remote Data Service，但是未經測試。

控制項名稱 | 檔案名稱 | 類別 ID (CLSID)
SSDBGrid | SSDATB32.ocx (Sheridan) | AC05DC80-7DF1-11d0-839E-00A024A94B3A

使用 Internet Explorer 4.0，您可以使用 HTML 控制項與 ActiveX_ 控制項來連結到資料 (只有在它們標示成公寓模式控制項時)。

列出的控制項並未隨 Remote Data Service 而散佈，但是可以從購買 Microsoft(R) Visual Basic(R) 企業版獲得，或直接向 Sheridan Systems, Inc 購買。

重要事項 您不可以再次散佈當作 Remote Data Service 樣本一部份的 ActiveX 控制項。它們只提供當作樣本應用程式的一部份，且在任何狀況下，不能重新散佈。

Microsoft Visual Basic 使用者 只有在以網頁為基礎的應用程式會用到RDS.DataControl。Visual Basic 用戶端應用程式則不需要。


DataFactory 物件 (RDSServer)

此預設的伺服器端 business 物件提供對用戶端應用程式的指定資料供應讀寫存取權的方法。

備註

RDSServer.DataFactory 物件是設計來當作可以接受用戶端要求的伺服器端 Automation 物件。在 Internet 裝置中，其位於 Web 伺服器並且由 ADISAPI 組件起始設定。RDSServer.DataFactory 物件提供讀與寫存取權至特定的資料來源，但是不包含任何驗證資料或 business 規則邏輯。

如果您使用在 RDSServer.DataFactory 與 RDS.DataControl 物件中都可以使用的方法，依照預設，Remote Data Service 會使用 RDS.DataControl 版本。預設假設基本的程式化環境，其中 RDSServer.DataFactory 當做一般性的伺服器端business 物件。

若您想要 Web 應用程式處理指定作業的伺服器端處理，可以使用自訂的 business 物件來取代 RDSServer.DataFactory。

您可以建立呼叫 RDSServer.DataFactory 方法的伺服器端 business 物件，例如，Query 與 CreateRecordset。如果您要新增功能到您的 business 物件，這是非常有用的，但是還是善用現有的 Remote Data Service 技術。

RDSServer.DataFactory 物件的類別 ID 是 9381D8F5-0288-11D0-9501-00AA00B911A5。


DataSpace 物件 (RDS)

RDS.DataSpace 物件建立用戶端 Proxy 來自訂位於中間階層的 business 物件。

備註

Remote Data Service 需要 business 物件 Proxy，這樣用戶端組件可以與位於中間階層的 business 物件通訊。Proxy 使應用程式 recordset 資料跨處理與機器界線的封包、解除封包 與傳輸 (marshaling) 變得更加容易。

Remote Data Service 使用 RDS.DataSpace 物件的 CreateObject 方法來建立 business 物件 Proxy。當其中間階層 business 物件相對物的執行個體被建立時，business 物件 Proxy 會被動態建立。Remote Data Service 支援下列通訊協定： HTTP，HTTPS (HTTP Secure Sockets)，DCOM，以及內部 (用戶端組件與位於相同電腦的 business 物件)。

RDS.DataSpace 物件的類別 ID 是 BD96C556-65A3-11D0-983A-00C04FC29E36。


Error 物件

Error 物件包含有關牽涉提供者單一操作資料存取錯誤的詳細資訊。

備註

任何牽涉 ADO 物件的作業可以產生一或多個提供者錯誤。每個錯誤發生時，一或多個 Error 物件會被放置於 Connection 物件的 Errors 集合物件中。當另一個 ADO 作業產生錯誤時，Errors 集合物件會被清除，然後新的一組 Error 物件會被放置於 Errors 集合物件中。

注意 每一個 Error 物件代表特定的提供者錯誤，而非 ADO 錯誤。ADO 錯誤是於執行期間例外處理機制揭露的。例如，在 Microsoft Visual Basic，ADO 特定錯誤的發生會啟動 On Error 事件，並出現在 Err 物件。若需 ADO 錯誤的完整清單，請參閱 ADO 錯誤程式碼主題。

您可以讀取 Error 物件的屬性，取得有關每一錯誤。包括下列各項的特定詳細資訊：

  • Description 屬性，包含錯誤的文字。

  • Number 屬性，包含錯誤常數的長整數值。

  • Source 屬性，辨識導致錯誤的物件。當您於 Errors 集合物件中有多個 Error 物件跟隨要求資料來源時，這特別有用。

  • SQLState 與 NativeError 屬性，提供來自 SQL 資料來源的資訊。

當發生提供者錯誤時，會被放置於 Connection 物件的 Errors 集合物件之中。ADO 利用單一 ADO 作業支援多重錯誤的回傳，允許傳回特定提供者的錯誤資訊。若要在錯誤處理常式中取得此豐富的錯誤資訊，請使用您工作語言或環境功能的適當錯誤捕捉功能，然後使用巢狀迴圈來列舉 Errors 集合物件中每一 Error 物件的屬性。

Microsoft Visual Basic 與 VBScript 若無有效的 Connection 物件，您需要從 Err 物件擷取錯誤資訊。

就像提供者所做的，ADO 在進行有可能會產生新的提供者錯誤的呼叫前，會先清除 OLE Error Info 物件。然而，只有提供者產生新的錯誤，或 Clear 方法被呼叫時，Connection 物件上的 Errors 集合物件才被清除及閱讀。

一些屬性與方法會傳回出現為 Errors 集合物件中 Error 物件的警告，但不會終止程式的執行。在您呼叫 Recordset 物件上的 Resync，UpdateBatch，或 CancelBatch 方法，Connection 物件上的 Open 方法前，或設定 Recordset 物件上的 Filter 屬性前，請先呼叫 Errors 物件集合上的 Clear 方法，這樣您可以閱讀 Errors 集合物件的 Count 屬性，以測試傳回的警告。


Field 物件

Field 物件代表一般資料類型的資料欄。

備註

Recordset 物件有由 Field 物件所組合而成的 Fields 集合物件。每一 Field 物件對應Recordset 中的一欄。您使用 Field 物件的 Value 屬性來設定或傳回目前記錄的資料。依據提供者所揭露的功能，可能無法取得 Field 物件的一些集合物件、方法、或屬性。

利用 Field 物件的集合物件、方法 與屬性，您可以從事下列事項：

  • 搭配 Name 屬性，傳回欄位的名稱。

  • 搭配 Value 屬性，檢視或變更欄位中的資料。

  • 搭配 Type、Precision 與 NumericScale 屬性，傳回欄位的基本特性。

  • 搭配 DefinedSize 屬性，傳回欄位宣告的大小。

  • 搭配 ActualSize 屬性，傳回所給欄位中資料的實際大小。

  • 搭配 Attributes 屬性與 Properties 集合物件，決定支援所給欄位的功能類型。

  • 搭配 AppendChunk 與 GetChunk 方法，操作包含長二進位或長字元資料欄位的值。

  • 若提供者支援批次更新，搭配 OriginalValue 與 UnderlyingValue 屬性，在批次更新期間，解析欄位值的矛盾。

在開啟 Field 物件的 Recordset 前，所有的 metadata 屬性 (Name、Type、DefinedSize、Precision 與 NumericScale) 都可以獲得。對動態建構的套表，在當時設定它們是非常有用的。


Parameter 物件

Parameter 物件代表以參數化查詢或預存程序為基礎，與 Command 物件有關聯的參數或引數。

備註

許多提供者支援參數化的指令。這些指令已經定義過要執行的動作，但是用變數 (或參數) 可以變更指令的一些細節。例如，一個 SQL SELECT 敘述可以使用參數來定義 WHERE 子句的符合條件，且另一個可以定義 SORT BY 子句的欄名。

Parameter 物件代表與參數化查詢有關的參數，或輸入/輸出引數與預存程序傳回的值。依據提供者所揭露的功能，可能無法取得 Parameter 物件的一些集合物件、方法、或屬性。

利用 Parameter 物件集合物件、方法與屬性，您可以：

  • 搭配 Name 屬性，設定或傳回參數的名稱。

  • 搭配 Value 屬性，設定或傳回參數的值。

  • 搭配 Attributes 與 Direction，Precision，NumericScale，Size，以及 Type 屬性，設定或傳回參數特性。

  • 搭配 AppendChunk 方法，傳遞長二進位或字元資料到參數。

若您知道預存程序或想呼叫的參數化查詢，其相關聯參數的名稱與屬性，您可以使用 CreateParameter 方法，搭配適當的屬性設定值，建立 Parameter 物件，並使用 Append 方法將其新增到 Parameters 集合物件。這能讓您不需呼叫 Parameters 集合物件上的 Refresh 方法，就可以設定並傳回參數值，從提供者 (潛在性的資源密集作業) 擷取參數資訊。


Property 物件

Property 物件代表由提供者所定義 ADO 物件的動態特性。

備註

ADO 物件有兩類型的屬性：內建與動態。

內建屬性是那些裝置於 ADO 中的屬性，對任何新的物件都立即可以獲得，使用 MyObject.Property 語法。在物件的 Properties 集合物件中，它們不當作 Property 物件出現，所以雖然您可以變更它們的值，但是無法修正其特性。

動態屬性是由所使用的資料提供者定義，且出現在適當 ADO 物件的 Properties 集合物件中。例如，如果 Recordset 物件支援交易或更新，則可以指出指定提供者的屬性。這些額外的資訊會出現當作 Property 物件於該 Recordset 物件的 Properties 集合物件。動態屬性只可以經由集合物件被參照，使用 MyObject.Properties(0) 或 MyObject.Properties("Name") 語法。

您無法刪除任何一種屬性。

動態 Property 物件有四個其擁有的內建屬性：

  • Name 屬性是辨識屬性的字串。

  • Type 屬性是指定屬性資料類型的整數。

  • Value 屬性是包含屬性設定的 variant。

  • Attributes 屬性是表示指定給提供者屬性特性的長整數。


Recordset 物件

Recordset 物件代表來自基本資料表記錄的整個集合或執行指令的結果。在任何時候，Recordset 物件只與集合內當作目前記錄的單一紀錄有關。

備註

您使用 Recordset 物件來從提供者操縱資料。當您使用 ADO 時，您幾乎完全使用 Recordset 物件來操縱資料。所有的 Recordset 物件都是使用紀錄 (列) 與欄位 (欄) 來建立。依據提供者所支援的功能，可能無法取得 Recordset 方法或屬性。

ADOR.Recordset 與 ADODB.Recordset 是您可以用來建立 Recordset 物件的 ProgIDs。產生的 Recordset 物件表現一模一樣，與 ProgID 無關。ADOR.Recordset 是與 Microsoft(R) Internet Explorer 一起安裝；ADODB.Recordset 是與 ADO 一起安裝。Recordset 物件的行為會被環境所影響 (也就是，用戶端，伺服器端，Internet Explorer，等等)。相異處在屬性、方法、與事件的 [說明] 主題中都有記載。

在 ADO 中有四種不同的指標類型：

  • 動態指標—讓您可以檢視其它使用者新增、變更與刪除的資料項，並且使所有在 Recordset 上的移動類型不需依靠書籤；若提供者支援它們，也可以使用書籤。

  • 索引鍵集指標—除了其防止您看到其它使用者新增的紀錄，與防止您存取其它使用者刪除的紀錄之外，就像動態指標的一樣。仍然可以看見其它使用者變更的資料。它永遠支援書籤，因此容許所有 Recordset 上的有移動的類型。

  • 靜態指標—提供您一組資料的靜態複本，用來尋找資料或產生記錄；永遠支援書籤，因此容許所有 Recordset 上的有移動的類型。看不到其它使用者新增、變更與刪除的資料項。這是當您開啟用戶端 (ADOR) Recordset 物件時，唯一可以使用的指標類型。

  • 順向資料指標—除了只允許您向前捲動記錄外，就像靜態指標一樣。在您只需要在 Recordset 上單向傳遞時，此指標可以加強效能。

開啟 Recordset 前先設定 CursorType 屬性，選擇指標屬性，或搭配 Open 方法傳遞 CursorType 引數。某些提供者不支援所有的指標類型。請檢查提供者的文件說明。若您不指定指標類型，依照預設，ADO 會開啟順向資料指標。

如果已經對 adUseClient 設定 CursorLocation 屬性，以開啟 Recordset，則在傳回的 Recordset 物件中無法取得 Field 物件上的 UnderlyingValue 屬性。當搭配某些提供者使用時 (就像 OLE DB 的 Microsoft ODBC Provider 搭配 Microsoft SQL Server)，您可以搭配 Open 方法，遞送連線字串，建立與先前定義 Connection 物件不同的 Recordset 物件。ADO 仍會建立 Connection 物件，但是不會指定物件變數給該物件。然而，如果您在相同連線上開啟多個 Recordset 物件，您應該明確地建立與開啟 Connection 物件；這樣會指定一個物件變數給 Connection 物件。如果開啟您的 Recordset 物件時，不使用此物件變數，就算您傳遞相同的連線字串，ADO 也會對每個新的 Recordset 建立新的 Connection 物件。

您需要多少，就可以建立多少所需的 Recordset 物件。

當您開啟 Recordset 時，目前的指標記錄會位於第一筆紀錄 (如果有的話)，且 BOF 與 EOF 屬性設定為 False。若是沒有任何紀錄，則 BOF 與 EOF 屬性設定值為 True。

假設提供者支援相關的功能，您可以使用 MoveFirst、MoveLast、MoveNext 與 MovePrevious 方法，以及 Move 方法，與 AbsolutePosition、AbsolutePage 及 Filter 屬性，重新放置目前的紀錄。順向 Recordset 物件只支援 MoveNext 方法。當您使用 Move 方法參觀每筆記錄 (或列舉 Recordset) 時，您可以使用 BOF 與 EOF 屬性來看看是否移動超越 Recordset 的開端或結尾。

Recordset 物件可以支援更新的兩種類型：立即與批次。立即更新時，一旦您呼叫 Update 方法，所有對資料的變更會立即寫到現在使用的資料來源。您也可以搭配 AddNew 與 Update 方法，當作參數遞送數值陣列，同時更新一筆記錄中的多處欄位。

如果提供者支援批次更新，您可以將提供者快取變更區設定超過一筆記錄，然後搭配 UpdateBatch 方法，在單一呼叫時將它們傳送到資料庫。這也可以套用到搭配 AddNew、Update 與 Delete 方法。在您呼叫UpdateBatch 方法後，您可以使用 Status 屬性來檢查任何衝突的資料，以便解決。

注意 若要不使用 Command 物件而執行查詢，請傳遞查詢字串至 Recordset 物件的 Open 方法。然而，當您想要保存指令文件並將其再次執行，或使用查詢參數時，Command 物件是必備的。 parameters.


ADO 集合物件

ADO 集合摘要

集合物件 | 說明
Errors | 包含於回應包括提供者的單一錯誤時，所建立的所有 Error 集合物件。
Fields | 包含 Recordset 物件的所有 Field 物件。
Parameters | 包含 Command 的所有 Parameter 物件。
Properties | 包含物件特定實例的所有 Property 物件。


Errors 集合物件 (ADO)

Error 集合物件

包含因提供者單一失敗而產生的所有 Error 物件。

備註

任何與 ADO 物件有關的動作都可能產生一個或多個的提供者錯誤。每當錯誤發生，一個或多個 Error 物件就會置於 Connection 物件的 Errors 集合物件中。當另一個 ADO 動作產生錯誤時，會先清除 Errors 集合物件，再把新的 Error 物件組置入 Errors 集合物件中。

每一個 Error 物件代表一個特定的提供者錯誤，而非 ADO 錯誤。ADO 錯誤容易因執行階段的例外處理機制而產生。例如在 Microsoft Visual Basic 中，ADO 特定錯誤的產生會觸發 On Error 事件，並出現在 Err 物件中。

未產生錯誤的 ADO 動作對於 Errors 集合物件並不會產生效果。請手動使用 Clear 方法清除 Errors 集合物件。

Errors 集合物件中的 Error 物件組描述所有因單一陳述式所產生的錯誤。Errors 集合物件列舉出特定的錯誤，讓您更精確判定錯誤原因及來源，以進行錯誤處理程序並採取適當的步驟進行修正。

部份屬性及方法會傳回與 Error 物件出現於 Errors 集合物件時一樣的警告，但是不會停止應用程式的執行。在您呼叫 Resync、UpdateBatch，或在 Recordset 物件呼叫 CancelBatch 方法、Connection 物件呼叫 Open 方法，或在 Recordset 物件上設定 Filter 屬性，及在 Errors 集合物件呼叫 Clear 方法時，可以讀取 Errors 集合物件的 Count 屬性，以測試傳回的警告。

注意 若需更多關於單一 ADO 動作可能產生多重錯誤的詳細說明，請參閱 Error 物件主題。


Fields 集合物件 (ADO)

Fields 集合物件

包含Recordset 物件的 Field 物件。

備註

Recordset 物件具有由 Field 物件所組成的 Fields 集合物件，每個 Field 物件對應 Recordset 中的一個資料行。只要在 Fields 集合物件呼叫 Refresh 方法，不需開啟 Recordset 就可以閱讀 Fields 集合物件。

注意 若需更多關於如何使用 Field 物件的詳細說明，請參閱 Field 物件主題。


Parameters 集合物件 (ADO)

Parameters 集合物件

包含 Command 物件所有的 Parameter 物件。

備註

Command 物件具有由 Parameter 物件所組成的 Parameters 集合物件。

在 Command 物件的 Parameters 集合物件中使用 Refresh 方法，可以取得提供者用於預存程序的參數資訊，或 Command 物件所指定的參數查詢。某些提供者並不支援預存程序呼叫或參數的查詢；當使用類似的提供者時，若在 Parameters 集合物件呼叫 Refresh 方法，將會傳回錯誤。

若您尚未定義自己的 Parameter 物件，並在呼叫 Refresh 方法前存取 Parameters 集合物件，ADO 將會自動呼叫方法，並產生集合物件。

若您知道所要呼叫的預存程序或參數查詢的相關參數屬性，您可以將對於提供者的呼叫減到最少以改善效能。以 CreateParameter 方法可以新增具有適當屬性設定的 Parameter 物件，並利用 Append 方法將它們加入 Parameters 集合物件。這樣可以提供您設定並傳回參數數值，而不需要呼叫提供者來取得參數資訊。若您要寫入未提供參數資訊的提供者，必須手動加入使用這種方法的 Parameters 集合物件，以使用全部的參數。若有需要，可以使用 Delete 方法，從 Parameters 集合物件移除 Parameter 物件。


Properties 集合物件 (ADO)

Properties 集合物件

包含特定物件實例的所有 Property 物件。

備註

某些 ADO 物件具有由 Property 物件所組成的 Properties 集合物件。每個 Property 物件對應 ADO 物件特定於提供者的一種特性。

注意 若需更多關於如何使用 Property 物件的詳細說明，請參閱 Property Object 主題。


ADO 方法

ADO 方法摘要

方法 | 說明
AddNew | 建立可更新之 Recordset 物件的新記錄。
Append | 將物件附加到集合物件。若集合物件為 Fields，就會在附加到集合物件之前先建立新的 Field 物件。
AppendChunk | 附加資料到大量文字或二進位資料 Field 或 Parameter 物件。
BeginTrans, CommitTrans, and RollbackTrans | 依照下列使用 Connection 物件管理交易處理： BeginTrans – 開始新交易。 CommitTrans – 儲存任何變更並結束目前的交易。它也會開始新交易。 RollbackTrans – 取消任何變更並結束目前的交易。它也會開始新交易。.
Cancel | 取消暫停非同步的 Execute 或 Open 方法呼叫的執行。
Cancel (RDS) | 取消目前執行中的非同步執行或取得。
CancelBatch | 取消暫停的批次更新。
CancelUpdate | 在呼叫 Update 方法之前先消對目前記錄或新記錄所做的變更。
CancelUpdate (RDS) | 捨棄與指定之 Recordset 相關的所有暫停變更，如此可恢復上次 Refresh 方法呼叫前的值。
Clear | 刪除集合物件內所有的物件。
Clone | 從現有的 Recordset 物件建立重複的 Recordset 物件。視情況指定該重複的物件為唯讀。
Close | 複製開啟的物件以及任何相依的物件。
CompareBookmarks | 比較兩個書籤以及傳回相關值的指示。
ConvertToString | 將 Recordset 轉換成代表 recordset 資料的 MIME 字串。
CreateObject (RDS) | 為目標 bussiness 物件建立 proxy 以及傳回它的指標。
CreateParameter | 使用指定屬性建立新的 Parameter 物件。
CreateRecordset (RDS) | 建立空的，中斷的 Recordset。
Delete (ADO Parameters Collection) | 刪除 Parameters 集合物件內的物件。
Delete (ADO Fields Collection) | 刪除Fields 集合物件內的物件。
Delete (ADO Recordset) | 刪除目前的記錄或記錄群組。
Execute (ADO Command) | 執行指定查詢、SQL 陳述式或在 CommandText 屬性指定的儲存程序。
Execute (ADO Connection) | 執行指定的查詢、SQL 陳述式、儲存的程序或提供者特定文字。
Find | 搜尋 Recordset 內符合指定條件的記錄。
GetChunk | 傳回大量文字或二進位資料 Field 物件所有或部份的內容。
GetRows | 將 Recordset 物件的多筆記錄放到陣列。
GetString | 將 Recordset 當成字串傳回。
Item | 依名稱或序數傳回集合物件特定的成員。
Move | 移動 Recordset 物件目前記錄的位置。
MoveFirst, MoveLast, MoveNext, and MovePrevious | 移到指定之 Recordset 物件內的第一、最後、下一個或上一個記錄，然後變成目前的記錄。
MoveFirst, MoveLast, MoveNext, MovePrevious (RDS) | 移到顯示之 Recordset 的第一、最後、下一個或上一個記錄。
NextRecordset | 透過連續的指令，清除目前的 Recordset 物件以及傳回下一個 Recordset。
Open (ADO Connection) | 開啟資料庫來源連接。
Open (ADO Recordset) | 開啟資料指標。
OpenSchema | 從提供者取得資料庫結構敘述資訊。
Query (RDS) | 使用有效的 SQL 查詢字串來傳回 Recordset。
Refresh | 更新集合物件內的物件，反映可以從提供者使用和特定的物件。
Refresh (RDS) | 重新查詢指定在 Connect 屬性內的 ODBC 資料來源，然後更新查詢結果。
Requery | 重新在物件所在之處執行查詢，更新 Recordset 物件內的資料。
Reset (RDS) | 依照排序或 filter 屬性，執行排序或過濾用戶端的 Recordset 。
Resync | 從來源資料庫重新整理目前的 Recordset 物件內的記錄。
Save (ADO Recordset) | 將 Recordset 儲存 (保留) 到檔案。
Seek | 搜尋 Recordset 的索引，快速尋找符合指定值的資料列，然後變更資料列目前的位置。
SubmitChanges (RDS) | 將暫停的近端快取可更新式 Recordset 變更傳送到指定在 Connect 屬性內的 ODBC 資料夾來源。
Supports | 判斷指定的 Recordset 物件是否支援特定的功能。
Update | 儲存將您對目前的 Recordset 物件記錄所作的變更。
UpdateBatch | 將所有暫停批定更新寫入磁碟。


AddNew 方法 (ADO)

AddNew 方法

為一個可更新的 Recordset 物件。

語法

recordset.AddNew FieldList, Values

參數

FieldList 選擇性參數。新資料錄中資料欄的單一名稱､名稱陣列，或其相關位置。

Values 選擇性參數。新資料錄中資料欄的單一值或資料欄值的陣列。如果 Fields 是一個陣列，Values 必須是一個擁有相同成員數目的陣列，否則將發生錯誤。在每一個陣列中，資料欄名稱的順序必須與資料欄值的順序相同。

附註

使用 AddNew 方法建立並初始化一個新的資料錄。Supports 方法與 adAddNew 並用，可以確認您是否可以將資料錄新增至目前的 Recordset 物件中。

在您呼叫 AddNew 方法後，新資料錄將變為目前資料錄，並在呼叫 Update 方法後仍維持為目前資料錄。如果 Recordset 物件未支援書籤功能，當移至其他資料錄後，您可能無法存取新的資料錄。根據資料指標類別，可能需要呼叫 Requery 方法來存取新的資料錄。

如果您在編輯目前資料錄或加入新資料錄時呼叫 AddNew，ADO 將會呼叫 Update 方法將進行的任何變更儲存起來，然後才產生新的資料錄。

AddNew 方法的動作將依據 Recordset 物件更新模式的不同，以及是否傳遞 Fields 與 Values 引數，而有所差異。

在立即更新模式中 (當您呼叫 Update 方法，提供者會將變更寫入來源資料庫中)，呼叫 AddNew 方法而不提供引數會將 EditMode 屬性設為 adEditAdd。提供者會在本機上記錄任何資料欄的變更。此時請呼叫 Update 方法，將新的資料錄傳送至資料庫中，並將 EditMode 屬性重設為 adEditNone。如果您加入 Fields 與 Values 參數，ADO 會立即將新資料錄傳至資料庫中 (不需要呼叫 Update)；而 EditMode 屬性值將不會改變 (adEditNone)。

在批次更新模式中，(只有在您呼叫 UpdateBatch 方法時，提供者才會資料錄多筆的變更，並將它們寫入來源資料庫中)，呼叫 AddNew 方法而不提供引數，會將 EditMode 屬性設為 adEditAdd。提供者會在本機上記錄任何資料欄的變更。此時請呼叫 Update 方法，將新資料錄加入目前的 Recordset 中，並將 EditMode 屬性重設為 adEditNone，但在您呼叫 UpdateBatch 方法之前，提供者不會將這些變更傳至來源資料庫中。如果您加入 Fields 與 Values 參數，ADO 會將新資料錄送至提供者處，並儲存在快取記憶體中；此時您必須呼叫 UpdateBatch 方法以便將新資料錄傳至來源資料庫中。


Append 方法 (ADO)

Append 方法

將物件附加至集合物件中。如果集合物件為 Fields，在將它附加至集合物件之前，會產生一個新的 Field 物件。

語法

collection.Append object

fields.Append Name, Type, DefinedSize, Attrib

參數

collection 一個集合物件。

fields 一個 Fields 集合物件。

object 一個表示要附加物件的物件變數。

Name 一個 String。新 Field 物件的名稱，不需要與 fields 中任何其他物件的名稱相同。

Type 一個 DataTypeEnum，其預設值為 adEmpty。新資料欄的資料型態。

DefinedSize 選擇性參數。一個 Long。新資料欄的預設字元或位元組數。此參數的預設值將由 Type 決定。Type 的預設值為 adEmpty，而 DefinedSize 的預設值則並未指定。

Attrib 選擇性參數。一個 FieldAttributeEnum，其預設值為 adFldDefault。指定新資料欄的屬性。如果未指定此值，該資料欄將包含由 Type 中指定的屬性。

參數

對一個集合物件使用 Append 方法，可以將一個物件新增至該集合物件中。此方法僅適用於 Command 物件的 Parameters 集合物件。您必須先設定 Parameter 物件的 Type 屬性，才能將該物件附加至 Parameters 集合物件中。如果您選取了一個可變長度的資料型態，也必須同時將 Size 屬性設為大於零的值。

您可以自行定義參數，此種作法可以減少對提供者的呼叫次數，因此在使用儲存程序或參數查詢時可以增進系統效能。然而，您必須瞭解與呼叫的儲存程序或參數查詢相關的參數屬性。請使用 CreateParameter 方法建立 Parameter 物件，以及相關的屬性設定，並使用 Append 方法將這些物件加入 Parameters 集合物件中。此種作法能夠讓您設定並傳回參數，而不需要呼叫提供者以取得參數資訊。如果您正寫入一個不提供參數資訊的提供者，您必須使用此方法以手動方式取得 Parameters 集合物件，以便使用這些參數。

資料欄

若您未在呼叫 fields.Append 方法之前設定 CursorLocation 屬性， 則在使用 Open 方法開啟Recordset 時自動將 CursorLocation 設定成 adUseClientBatch。

對一個開啟的 Recordset，或是一個設定 ActiveConnection 屬性的 Recordset 呼叫 fields.Append 方法，將產生執行期錯誤。您只能將未開啟以及尚未連接到資料來源的欄位附加到 Recordset。一般這些是您使用 CreateRecordset 方法或者明確指定新 Recordset 物件到物件變數而建立的新 Recordset 物件。


AppendChunk 方法 (ADO)

AppendChunk 方法

將資料附加至一個具有大量文字或二進位資料的 Field 或 Parameter 物件。

語法

object.AppendChunk Data

參數

object 一個 Field 或 Parameter 物件。

Data 一個包含您想要附加至物件中的資料的 Variant。

附註

對 Field 或 Parameter 物件使用 AppendChunk 方法可以為該物件加入大量的二進位或字元資料。但在實際情況中，由於記憶體的限制，使用 AppendChunk 方法僅能進行部份資料的運算，而非全部。

資料欄

如果 Field 物件的 Attributes 屬性中的 adFldLong 位元設為 true，您可以對該資料欄使用 AppendChunk 方法。

對 Field 物件的首次 AppendChunk 呼叫會將資料寫入該資料欄中，並覆蓋任何現有的資料。後續的 AppendChunk 呼叫則將附加至現有的資料之後。如果您在目前資料錄中將資料附加至某個資料欄中，然後設定或讀取另一資料欄的值，ADO 將會假設您正在進行首次資料欄的附加動作。如果您再次對首次資料欄呼叫 AppendChunk 方法，ADO 會將此呼叫解譯為一次新的 AppendChunk 運算，同時覆寫現有的資料。存取首次 Recordset 物件複本以外的 Recordset 物件中的資料欄，將不會影響 AppendChunk 的動作。

如果對 Field 物件進行 AppendChunk 呼叫時沒有現有的資料錄，將會發生錯誤。

參數

如果 Parameter 物件的 Attributes 屬性中的 adFldLong 位元設為 true，您可以對該參數使用 AppendChunk 方法。

對 Parameter 物件的首次 AppendChunk 呼叫，會將資料寫入該參數中，並覆蓋任何現有的資料。後續的 AppendChunk 呼叫則將附加至現有的資料之後。傳遞 null 值的 AppendChunk 呼叫將不使用任何的參數資料。


BeginTrans、CommitTrans 及 RollbackTrans 方法 (ADO)

BeginTrans、CommitTrans 及 RollbackTrans 方法

以下的交易方法管理 Connection 物件中的交易處理程序：

  • BeginTrans 開始一次新的交易。

  • CommitTrans 儲存任何變更並終止目前的交易。此方法亦可能開始一次新的交易。

  • RollbackTrans 在目前交易過程中取消任何的變更並終止交易。此方法亦可能開始一次新的交易。

語法

level = object.BeginTrans()

object.BeginTrans

object.CommitTrans

object.RollbackTrans

傳回值

BeginTrans 可以以函數的形式呼叫，此函數會傳會一個型態為 Long 的變數，表示交易的等級。

參數

object 一個 Connection 物件。

連接

當您想要一次儲存或消除對來源資料一連串的變更，請對 Connection 物件使用這些方法。舉例來說，要進行不同帳號間的轉帳，您必須從一個帳號內減去若干金額，然後將這些金額加至另一個帳號中。如果其中一個動作失敗了，帳號內的餘額將產生錯誤。在同一次開放交易中進行這兩個變更的動作，將可以確保交易的結果不是兩個帳號的變更都正確，便是都錯誤。

註解 並非所有的提供者皆支援交易處理。您可以檢視提供者定義的屬性 "Transaction DDL" 是否出現在 Connection 物件的 Properties 集合物件中，若有，表示提供者支援交易的處理。如果提供者未支援交易處理，呼叫以上的方法將產生錯誤。

當您呼叫 BeginTrans 方法，提供者將不再立刻認可您進行的任何變更，而是等到您呼叫 CommitTrans 或 RollbackTrans 終止交易後才進行認可。

對於支援巢狀交易的提供者，在同一次開放交易內呼叫 BeginTrans 方法，將會開啟一段新的、巢狀的交易。其傳回值表示巢狀的層次：傳回 "1" 表示您開啟了一段最高層的交易 (這表示，此交易不在其他交易之內)，傳回 "2" 表示您開啟了一段第二層的交易 (一個位於最高層交易內的交易)，依此類推。呼叫 CommitTrans 或 RollbackTrans 僅會影響最近開啟的交易；您必須在解析任何較高層交易之前複製或復原目前的交易。

呼叫 CommitTrans 方法可以儲存單次開放交易內的變更，並終止交易。呼叫 RollbackTrans 方法可以復原在單次開放交易內的任何變更，並終止交易。若在未開啟交易時呼叫上述方法之一將會產生錯誤。

根據 Connection 物件的 Attributes 屬性，呼叫 CommitTrans 或 RollbackTrans 方法可以自動開啟一段新的交易。如果 Attributes 屬性被設為 adXactCommitRetaining，提供者將在 CommitTrans 呼叫後自動開啟一段新的交易。如果 Attributes 屬性被設為 adXactAbortRetaining，提供者將在 RollbackTrans 呼叫後自動開啟一段新的交易。

Remote Data Service

BeginTrans、CommitTrans 與 RollbackTrans 方法無法在用戶端的 Connection 物件上使用。


Cancel 方法 (ADO)

Cancel 方法

取消將要執行的、非同步的 Execute 或 Open 方法呼叫。

語法

object.Cancel

附註

使用 Cancel 方法可以結束一個非同步的 Execute 或 Open 方法呼叫的執行 (這表示，此方法必須配合AsyncConnect、adAsyncExecute 或 adAsyncFetch選項)。如果在您想要結束的方法中並未使用 AsyncExecute，Cancel 將會傳回一個執行期錯誤。

下表顯示當您對特定型態的物件使用 Cancel 方法時，何種工作會被結束。

如果物件是 | 對此方法的最後一次非同步呼叫會被終止
Command | Execute
Connection | Execute 或 Open
Recordset | Open


Cancel 方法 (RDS)

取消目前正在執行的非同步指令或指令預取。

語法

RDS.DataControl.Cancel

附註

當您呼叫 Cancel，ReadyState 將自動設為 adcReadyStateLoaded，同時 Recordset 將不包含任何資料錄。


CancelBatch 方法 (ADO)

CancelBatch 方法

取消將要執行的批次更新。

語法

recordset.CancelBatch AffectRecords

參數

AffectRecords 選擇性參數。一個決定多少資料錄將受到 CancelBatch 方法影響的AffectEnum 值。此值可以是下列其中一個常數：

常數 | 說明
adAffectCurrent | 僅取消目前資料錄之被擱置的更新。
adAffectGroup | 取消符合目前 Filter 屬性設定的資料錄之被擱置的更新。在使用此選項之前，您必須將 Filter 屬性設為事先定義的有效常數值之一。
adAffectAll | 預設值。取消 Recordset 中所有資料錄之被擱置的更新，包括目前 Filter 屬性設定所隱藏的資料錄在內。

附註

在批次更新模式中，使用 CancelBatch 方法可以取消資料錄集合物件內任何被擱置的更新。如果資料錄集合物件處於立即更新模式，呼叫 CancelBatch 而不使用 adAffectCurrent 選項將產生錯誤。

如果呼叫 CancelBatch 時，您正在編輯目前的資料錄或加入新的資料錄，ADO 將先呼叫 CancelUpdate 方法取消任何暫存的變更；然後，取消資料錄集合物件內所有暫存的變更。

目前的資料錄在呼叫 CancelBatch 後可能變得無法決定，這種情形尤其容易發生在您正在加入新的資料錄時。為了避免此情形，請在 CancelBatch 呼叫後謹慎地將目前資料錄位置設為一個資料錄集合物件內已知的位置。例如，呼叫 MoveFirst 方法。

如果由於與來源資料衝突 (例如，一筆資料錄已被其他使用者刪除) 而造成取消被擱置的更新的動作失敗，提供者將傳回警告至 Errors 集合物件，但不會終止程式的執行。僅在所有要求的資料錄均發生衝突時，才會產生執行期錯誤。使用 Filter 屬性 (adFilterAffectedRecords) 和 Status 屬性可以找出發生衝突的資料錄。


CancelUpdate 方法 (ADO)

CancelUpdate 方法

在呼叫 Update 方法前取消任何對目前資料錄或新資料錄所作的變更。

語法

recordset.CancelUpdate

附註

使用 CancelUpdate 方法可以取消任何對目前資料錄所作的變更，或刪除新增的資料錄。您無法在呼叫 Update 方法之後復原對目前資料錄或新資料錄的變更，除非這些變更是可以用 RollbackTrans 方法復原的部分交易，或是可以用 CancelBatch 方法取消的部分批次更新。

如果您在呼叫 CancelUpdate 方法時加入一筆新的資料錄，在 AddNew 呼叫之前處理的資料錄，將再次變為目前資料錄。

如果您並未對目前資料錄進行變更或加入新的資料錄，呼叫 CancelUpdate 方法將產生錯誤。


CancelUpdate 方法 (RDS)

取消所有與指定的 Recordset 物件相關的暫存變更，資料錄內容將回到最後一次 Refresh 方法呼叫之後的值。

語法

DataControl.CancelUpdate

參數

DataControl 一個代表 RDS.DataControl 物件的物件變數。

附註

「用戶端資料指標引擎」將會保留原始值與變更值的資料。當您呼叫 CancelUpdate，變更值的快取區將重設為不包含任何資訊，同時資料連結控制項將更新為原始值。


Clear 方法 (ADO)

Clear 方法

移除集合物件中所有的物件。

語法

Errors.Clear

附註

對 Errors 集合物件使用 Clear 方法，可以將所有現有的 Error 物件從集合物件中移除。當錯誤發生，ADO 會自動清除 Errors 集合物件，並根據新的錯誤填入 Error 物件。

某些屬性與方法傳回的警告，會以 Error 物件的形式出現在 Error 集合物件中，但不會中斷程式的執行。在您對 Recordset 物件呼叫 Resync、UpdateBatch 或 CancelBatch 方法，或對 Connection 物件呼叫 Open 方法，或在 Recordset 物件中設定 Filter 屬性之前，請先對 Errors 集合物件呼叫 Clear 方法，如此您才能夠讀取 Errors 集合物件的 Count 屬性，以測試傳回的警告。


Clone 方法 (ADO)

Clone 方法

從現有的 Recordset 物件建立一份複製的 Recordset 物件。同時您可以選擇性地將這份複製資料錄集合物件指定為唯讀。

語法

Set rstDuplicate = rstOriginal.Clone (LockType)

傳回值

傳回一個 Recordset 物件參考。

參數

rstDuplicate 一個標明您建立的 Recordset 物件複本的物件變數。

rstOriginal 一個標明您想要複製的 Recordset 物件的物件變數。

LockType 選擇性參數。一個指定為原有 Recordset 鎖定型態或唯讀 Recordset 的 LockTypeEnum 值。

常數 | 說明
adLockUnspecified | 預設值。建立的複本與原有資料錄集合物件，具有相同的鎖定型態。
adLockReadOnly | 複本建立為唯讀。

附註

使用 Clone 方法可以建立多份的 Recordset 物件複本，尤其當您想要在一個指定的 Recordset 中維持一份以上的目前資料錄，此方法十分有用。使用 Clone 方法會比以原有的定義建立，並開啟一份新的 Recordset 物件更有效率。

新建立的複本的目前資料錄，將被設為第一筆資料錄。

對單一 Recordset 物件所進行的變更，可以在所有其複本中看到，不論資料指標的型態為何。然而，當您在原有 Recordset 中執行 Requery 時，複本將不再與原有資料錄集合物件保持一致。

關閉原有的 Recordset 並不會關閉其複本；關閉複本亦不會關閉原有的資料錄集合物件，或關閉該資料錄集合物件的其他複本。

您僅能複製支援書籤功能的 Recordset 物件。書籤值是可互換的；這表示，一個 Recordset 物件中的書籤參照，在它的複本中會指向相同的資料錄。


Close 方法 (ADO)

Close 方法

關閉一個開啟的物件，以及任何相關的物件。

語法

object.Close

附註

使用複製方法可以關閉 Connection 物件或 Recordset 物件，以釋放任何相關的系統資源。關閉一個物件並不會將它從記憶體中移除；您可以調整該物件的優先權設定，並在稍後重新開啟這個物件。若要完整的從記憶體中刪除物件，請將物件變數設為 Nothing。

連接

使用 Close 方法可以關閉 Connection 物件，同時也關閉與此連線有關的現用 Recordset 物件。一個與 Connection 物件有關，而您正在關閉的 Command 物件，將保留著，但不再與 Connection 物件發生關連；這表示，該物件的 ActiveConnection 屬性將設為 Nothing。此外，Command 物件的 Parameters 集合物件將被清除提供者定義的參數。

稍後您可以呼叫 Open 方法，重新建立對相同或其他資料源的連線。當 Connection 物件關閉時，呼叫任何需要與資料源連線的方法將產生錯誤。

若連線過程中開啟了 Recordset 物件，當關閉 Connection 物件時，系統會復原任何對 Recordset 物件進行的變更。在交易進行中直接關閉 Connection 物件 (呼叫 Close 方法) 將產生錯誤。如果 Connection 物件在交易進行過程中失效，ADO 會自動復原該次交易。

Recordset

使用 Close 方法關閉 Recordset 物件，將會釋放與此物件有關的資料，及任何透過此特定 Recordset 物件的唯一存取。稍後您可以呼叫 Open 方法，以相同或修改過的屬性重新開啟 Recordset。當 Recordset 物件關閉時，呼叫任何需要作用中資料指標的方法將發生錯誤。

立即更新模式中，如果呼叫 Close 方法時正在進行編輯，將發生錯誤；請在呼叫 Close 方法先呼叫 Update 或 CancelUpdate 方法。如果您在批次更新過程中關閉 Recordset 物件，所有在上次 UpdateBatch 呼叫之後更新的資料將會遺失。

如果您用 Clone 方法建立某個開啟中 Recordset 物件的複本，關閉原有資料錄集合物件或某個複本將不會影響其他複本的運作。


CompareBookmarks 方法 (ADO)

CompareBookmarks 方法

比較兩個書籤，並傳回其相關值的指示。

語法

result = recordset.CompareBookmarks(Bookmark1, Bookmark2) As CompareEnum

傳回值

傳回一個以書籤形式表示的兩筆資料錄相關資料列位置。下列為可能的傳回值。

常數 | 說明
adCompareLessThan | 第一個書籤出現在第二個之前。
AdCompareEqual | 書籤位置相同。
AdCompareGreaterThan | 第一個書籤出現在第二個之後。
AdCompareNotEqual | 書籤位置不同且沒有次序。
AdCompareNotComparable | 書籤無法比較。

參數

Bookmark1 第一列的書籤。

Bookmark2 第二列的書籤。

附註

書籤必須用於相同的 Recordset 物件，或一個 Recordset 物件與其複本中。您無法確實比較不同 Recordset 物件中的書籤，即使這些書籤是來自相同的資料源或指令。您也無法比較不支援比較功能的提供者內的 Recordset 物件中的書籤。

書籤表示 Recordset 物件中特定的一列。您可以使用目前資料列的 Bookmark 屬性獲得該資料列的書籤。

一個無效或格式錯誤的書籤將導致錯誤。


ConvertToString 方法 (RDS)

將 Recordset 轉換為表示資料錄集合物件資料的 MIME 字串。

語法

DataFactory.ConvertToString(Recordset)

參數

DataFactory 一個表示 RDSServer.DataFactory 物件的物件變數。

Recordset 一個表示 Recordset 物件的物件變數。

附註

對 .asp 檔案使用 ConvertToString，可以將 Recordset 嵌入伺服器上產生的 HTML 頁，並將它傳輸到用戶端電腦。

ConvertToString 首先將 Recordset 載入至「資料指標服務」資料表中，然後產生 MIME 格式的字串。

在用戶端，Remote Data Service 可以將 MIME 字串轉換回功能完整的 Recordset。對於每列少於 1024 個位元組，總數小於 400 列的資料，此方法可以運作得相當好。您不應該對字串格式的 BLOB 資料以及 HTTP 上大量的結果集使用此方法。與由 Remote Data Service 定義與使用的傳輸線最佳化資料表格式相較，上述的資料格式對字串未進行壓縮，所以在 HTTP 上傳輸這些大量的資料集將會耗去可觀的時間。

註解 如果您正在使用 Active Server Pages 將產生的 MIME 字串嵌入用戶端的 HTML 頁，請注意 VBScript version 2.0 之前的版本將有字串大小 32K 的限制。如果超過字串容量的限制，將傳回 "Out of string space" 的錯誤。在使用 MIME 與 .asp 檔案進行嵌入時，請儘可能地所小查詢範圍。要修正前述的錯誤，請至 http://www.microsoft.com/vbscript 下載最新版的 VBScript。


CreateObject 方法 (RDS)

建立目標 business 物件的 proxy，並傳回指向此 proxy 的指標。與 business 物件連線時，proxy 會包裝資料，並將資料排列 至伺服端的 stub，以便透過網際網路送出要求指令及資料。內部的控制元件物件不需使用 proxy，所以此方法僅提供指向該物件的指標。

語法

Remote Data Service 支援下列的傳輸協定：HTTP、HTTPS (HTTP over Secure Socket Layer)、DCOM，與內部協定。

通訊協定 | 語法
HTTP | Set object = DataSpace.CreateObject("ProgId", "http://awebsrvr")
HTTPS | Set object = DataSpace.CreateObject("ProgId", "https://awebsrvr")
DCOM | Set object = DataSpace.CreateObject("ProgId", "machinename")
In-process | Set object = DataSpace.CreateObject("ProgId", "")

參數

Object 一個表示 ProgID 指定型態物件的物件變數。

DataSpace 一個表示用來建立新物件執行個體的 RDS.DataSpace 物件的物件變數。

ProgID 一個標示執行應用程式 business 規則 的 business 物件 物件名稱的 String。

awebsrvr or machinename 一個表示建立伺服器 business 物件執行個體的 Internet Information Server (IIS) Web 伺服器 URL 的 String。

附註

HTTP protocol 為標準的 Web 傳輸協定；HTTPS 是一個加密 Web 傳輸協定。不使用 HTTP 架構區域網路時可以使用 DCOM protocol。內部協定是一套動態連結程式庫 (DLL)；不使用網路。


CreateParameter 方法 (ADO)

CreateParameter 方法

以特定屬性建立一個新的 Parameter 物件。

語法

Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)

傳回值

傳回一個 Parameter 物件。

參數

Name 選擇性參數。一個表示 Parameter 物件名稱的 String。

Type 選擇性參數。一個指定 Parameter 物件型態的 Long 值。請參閱 Type 屬性以獲得有效的設定值。

Direction 選擇性參數。一個指定 Parameter 物件型態的 Long 值。請參閱Direction 屬性以獲得有效的設定值。

Size 選擇性參數。一個以字元或位元組為單位，指定參數值最大長度的 Long 值。

Value 選擇性參數。一個指定 Parameter 物件值的 Variant。

附註

使用 CreateParameter 方法可以使用指定的名稱、型態、方向、大小與設定值，建立一個新的 Parameter 物件。您在引數中傳入的設定值，將被寫至對應的 Parameter 屬性。

此方法並不會自動將 Parameter 物件附加至 Command 物件的 Parameters 集合物件中。此種方式允許您設定額外的屬性值，ADO 會在您將 Parameter 物件附加至集合物件中時，讓這些屬性設定生效。

如果您在 Type 引數中指定一個可變長度的資料型態，您必須在將 Parameter 物件附加至集合物件之前，傳入 Size 引數，或設定 Parameter 物件的 Size 屬性，否則將產生錯誤。


CreateRecordset 方法 (RDS)

建立一個空的、未連線的 Recordset。

語法

object.CreateRecordset(ColumnInfos)

參數

Object 一個表示 RDSServer.DataFactory 或 RDS.DataControl 物件的物件變數。

ColumnsInfos 一個定義 Recordset 中每一資料行建立方式的 Variant 陣列。每一資料行的定義包含一個具有四個所需屬性的陣列。

特性 | 說明
Name | 資料行行首的名稱。
Type | 代表資料型態的整數。
Size | 代表字元寬度的整數，忽略資料型態。
Nullability | 布林值。

行陣列的集合物件接著會組合成一個定義 Recordset 的陣列。

附註

伺服端的 business 物件可以由非 OLE DB 資料提供者處取得產生的 ADODB.Recordset 及資料，例如包含系統容量資訊的作業系統檔案。

下表列出 RDSServer.DataFactory 物件的 CreateRecordset 方法所支援的資料型態。表格中所列出的數值，則是用來定義資料欄的參考值。

每一種資料型態可以是固定長度或是可變長度。固定長度的資料型態應將大小設為 -1，因為資料的大小必須事前定義。可變長度的資料型態則允許範圍自 1 到 32767 的資料大小。

某些可變長度的資料型態可能會被強迫取代為 Substitution 行所標注的資料型態。在 Recordset 建立並填入之前，您將不會看到這樣的取代動作。其後您可以在必要時檢視實際的資料型態。

長度 | 常數 | 號碼 | 替代
固定長度 | adTinyInt | 16 |
固定長度 | adSmallInt | 2 |
固定長度 | adInteger | 3 |
固定長度 | adBigInt | 20 |
固定長度 | adUnsignedTinyInt | 17 |
固定長度 | adUnsignedSmallInt | 18 |
固定長度 | adUnsignedInt | 19 |
固定長度 | adUnsignedBigInt | 21 |
固定長度 | adSingle | 4 |
固定長度 | adDouble | 5 |
固定長度 | adCurrency | 6 |
固定長度 | adDecimal | 14 |
固定長度 | adNumeric | 131 |
固定長度 | adBoolean | 11 |
固定長度 | adError | 10 |
固定長度 | adGuid | 72 |
固定長度 | adDate | 7 |
固定長度 | adDBDate | 133 |
固定長度 | adDBTime | 134 |
固定長度 | adDBTimestamp | 135 | 7
可變長度 | adBSTR | 8 | 130
可變長度 | adChar | 129 | 200
可變長度 | adVarChar | 200 |
可變長度 | adLongVarChar | 201 | 200
可變長度 | adWChar | 130 |
可變長度 | adVarWChar | 202 | 130
可變長度 | adLongVarWChar | 203 | 130
可變長度 | adBinary | 128 |
可變長度 | adVarBinary | 204 |
可變長度 | adLongVarBinary | 205 | 204


Delete 方法 (ADO 參數集合物件)

從 Parameters 集合物件中刪除一個物件。

語法

Parameters.Delete Index

參數

Index 代表您要刪除物件名稱的 String，或是物件在集合物件中的序數位置 (索引)。

附註

在集合物件中使用 Delete 方法可讓您移除集合物件中的其中一個物件。此方法只有在 Command 物件中的 Parameters 集合物件上時方可使用。您必須在呼叫 Delete 方法時，使用 Parameter 物件的 Name 屬性或其集合索引 - 因為物件變數並不是一個有效的引數。


Delete 方法 (ADO 資料欄集合物件)

從 Fields 集合物件中刪除一個物件。

語法

Fields.Delete Field

參數

Field 指定了要刪除 Field 物件的 Variant。此參數必須是 Field 物件的名稱；而不能是序數位置或是 Field 物件本身。

附註

在開啟的 Recordset 上呼叫 Fields.Delete 方法會造成執行期錯誤。


Delete 方法 (ADO Recordset)

刪除目前的資料錄或一組資料錄。

語法

recordset.Delete AffectRecords

參數

AffectRecords AffectEnum 的值決定了 Delete 方法將會影響的資料錄個數。

常數 | 說明
adAffectCurrent | 為預設值。僅刪除目前的資料錄。
adAffectGroup | 刪除滿足目前 Filter 屬性設定的資料錄。您必須將 Filter 屬性設定為有效內建常數中的其中一個，才能使用此選項。

附註

使用 Delete 方法會將 Recordset 物件中目前的資料錄或一組資料錄標記為刪除。如果 Recordset 物件不允許資料錄刪除的動作，就會發生錯誤。如果您是在立即更新模式下，則刪除的動作會立即在資料庫中發生。否則，資料錄會從快取中標記為刪除，並在您呼叫 UpdateBatch 方法時發生實際的刪除動作。(可使用 Filter 屬性來檢視已刪除的資料錄。)

從已刪除資料錄中取得資料欄會發生錯誤。在刪除目前的資料錄後，已刪除的資料錄在您將它搬移到另一個資料錄之前都會維持目前狀態。一旦您將資料錄從已刪除的資料錄移走，就無法再存取它了。

如果您在某次交易中執行巢狀刪除，可使用 RollbackTrans 方法來回復已刪除的資料錄。如果您是在批次更新模式下，則可使用 CancelBatch 方法來取消擱置的刪除動作或擱置群組的刪除動作。

如果因為與所需的資料發生衝突，而導致嘗試刪除資料錄失敗 (例如，資料錄已經被另一個使用者刪除了)，則提供者會將警告傳回給 Errors 集合物件，但不會中止程式的執行。只有在所有要求的資料錄都發生衝突時，才會發生執行期錯誤。


Execute 方法 (ADO 指令)

執行 CommandText 屬性中指定的查詢、SQL 陳述式，或預存程序。

語法

對於 row-returning Command：

Set recordset = command.Execute( RecordsAffected, Parameters, Options )

對於非 row-returning Command：

command.Execute RecordsAffected, Parameters, Options

傳回值

傳回 Recordset 物件參數。

參數

RecordsAffected 選擇性參數。提供者傳回動作所影響資料錄個數的 Long 變數。

Parameters 選擇性參數。以 SQL 陳述式傳遞參數值的 Variant 陣列。(在此引數中傳遞時，則不會傳回正確的值。)

Options 選擇性參數。表示提供者認定 Command 物件 CommandText 屬性之方式的 Long 值。可能是下列任何一種：

常數 | 說明
adCmdText | 表示提供者應將 CommandText 視為指令的文字定義，如 SQL 陳述式。
adCmdTable | 表示 ADO 應產生 SQL 查詢以從 CommandText 中已命名的資料表中傳回所有的資料列。
adCmdTableDirect | 表示提供者應從 CommandText 中已命名的資料表中傳回所有的資料列。
AdCmdStoredProc | 表示提供者應將 CommandText 視為預存程序。
AdCmdUnknown | 表示 CommandText 中的指令類型未知。
AdExecuteAsync | 表示指令應非同步執行。
adFetchAsync | 表示在 CacheSize 屬性中指定初始數量之後的剩餘資料列應非同步取得。

若需關於此清單中前四個常數更詳細的說明，請參閱 CommandType 屬性。

附註

在 Command 物件上使用 Execute 方法會執行該物件在 CommandText 屬性中所指定的查詢。如果 CommandText 屬性指定了一個 row-returning 查詢，則此執行動作所產生的任何結果都會儲存在一個新的 Recordset 物件中。如果該指令不是一個 row-returning 查詢，則提供者會傳回一個關閉的 Recordset 物件。如果不想要 Recordset 的話，有些應用程式語言可讓您忽略此傳回值。

除非您不管那些由 Execute 呼叫所傳遞的參數值，否則如果此查詢有參數，則會使用 Command 物件參數的目前值。您可以在呼叫 Execute 方法時，忽略某些參數的新值，而不管此參數的子集。您指定參數的順序與方法傳遞它們的順序是一樣的。例如，如果有四個 (或更多 個) 參數，而您只想傳遞第一及第四個參數的新值，則要傳遞 Array(var1,,,var4) 作為 Parameters 引數。

附註 當輸出參數以 Parameters 引數傳遞時，將不會傳回正確的值。

當此動作結束時，會發出 ExecuteComplete 事件。


Execute 方法 (ADO 連結)

執行指定的查詢、SQL 陳述式、預存程序，或提供者指定的文字。

語法

對於非 row-returning 指令字串：

connection.Execute CommandText, RecordsAffected, Options

對於 row-returning 指令字串：

Set recordset = connection.Execute (CommandText, RecordsAffected, Options)

傳回值

傳回 Recordset 物件參數。

參數

CommandText 包含了要執行的 SQL 陳述式、資料表名稱、預存程序，或提供者指定文字的 String。

RecordsAffected 選擇性參數。提供者傳回動作所影響資料錄個數的 Long 變數。

Options 選擇性參數。表示提供者認定 CommandText 引數之方式的 Long 值。可能是下列其中一個值：

常數 | 說明
adCmdText | 表示提供者應將 CommandText 視為指令的文字定義。
AdCmdTable | 表示 ADO 應產生 SQL 查詢以從 CommandText 中已命名的資料表中傳回所有的資料列。
adCmdTableDirect | 表示提供者應從 CommandText 中已命名的資料表中傳回所有的資料列。
adCmdTable | 表示提供者應將 CommandText 視為表格名稱。
adCmdStoredProc | 表示提供者應將 CommandText 視為預存程序。
adCmdUnknown | 表示 CommandText 引數中的指令類型未知。
adExecuteAsync | 表示指令應非同步執行。
adFetchAsync | 表示在 CacheSize 屬性中指定初始數量之後的剩餘資料列應非同步取得。

若需關於此清單中前四個常數更詳細的說明，請參閱 CommandType 屬性。

附註

在 Connection 物件上使用 Execute 方法會執行任何您在指定連結上的 CommandText 引數中所傳遞到方法中的查詢。如果 CommandText 引數指定了一個 row-returning 查詢，則任何執行動作所產生的結果都會儲存在一個新的 Recordset 物件中。如果指令不是一個 row-returning 查詢，則提供者會傳回一個關閉的 Recordset 物件。

傳回的 Recordset 物件永遠都是一個唯讀的、只能順向的資料指標。如果您需要的是一個更多功能的 Recordset 物件，請先以想要的屬性設定來建立 Recordset 物件，然後使用 Recordset 物件的 Open 方法來執行查詢，並傳回想要的資料指標類型。

CommandText 引數的內容是隨提供者而定的，且可以是標準的 SQL 語法或任何提供者支援的特殊指令格式。

當此動作結束時，會發出 ExecuteComplete 事件。


Find 方法 (ADO)

搜尋滿足特定準則之記錄的 Recordset。如果符合此準則，則 Recordset 位置會設定在找到的資料錄上；否則，該位置就會設定在 Recordset 的尾端。

語法

Find (criteria, SkipRows, searchDirection, start)

參數

criteria 包含了指定資料行名稱、比對運算子，及要在搜尋中使用值之陳述式的 String。

SkipRows 一個選擇性的 Long 值，預設值為零，其指定從目前資料列或 start 書籤到搜尋開端的距離。

searchDirection 一個選擇性 SearchDirectionEnum 值，其指定搜尋應從目前資料列開始，或是從下一個搜尋方向中可用的資料列開始。其值可能為 adSearchForward 或 adSearchBackward。搜尋動作會停止於 Recordset 的開頭或尾端，端視 searchDirection 的值而定。

start 一個選擇性的 Variant 書籤，用於作為搜尋的起始位置。

附註

criteria 中的「比對運算子」可以是 ">" (大於)、"<" (小於)、"=" (等於)，或 "like" (模式比對)。

criteria 中的 value 可以是字串、浮點數，或日期。字串值以單引號來界定 (例如，"state = 'WA'")。日期值以 "#" (井字號) 來界定 (例如，"start_date > #7/22/97#")。

如果「比對運算子」為 "like"，則字串 value 可能包含 "*" (任何字元出現一次或多次) 或 "_" (任何字元只出現一次)。(例如，"state like M_*" 則會比對出 Maine 及 Massachusetts。)


GetChunk 方法 (ADO)

傳回一大段文字或二進位資料 Field 物件的全部或部分內容。

語法

variable = field.GetChunk( Size )

傳回值

傳回一個 Variant。

參數

Size 與您要取得的字元數或位元組數相等的 Long 運算式。

附註

在 Field 物件上使用 GetChunk 方法取得其二進位或字元資料的全部或部分。在有系統記憶體限制的情況下，您可以使用 GetChunk 方法來使用部分的長數值，而不需要整體使用。

GetChunk 呼叫所傳回的資料會指定給 variable。如果 Size 大於其餘的資料，則 GetChunk 方法只會傳回其餘的資料，而不會以空白填滿 variable。如果資料欄是空的，則 GetChunk 方法會傳回 Null。

每一個伴隨發生的 GetChunk 呼叫會從上一個 GetChunk 呼叫結束的位置開始取得資料。然而，如果您是從某個資料欄取的資料，然後在目前的資料錄中設定或讀取另一個資料欄的值，則 ADO 會假設您已經從第一個資料欄中完成取的資料。如果您在第一個資料欄再次呼叫 GetChunk 方法，則 ADO 會將這個呼叫解譯為新的 GetChunk 動作，並從資料的起始位置開始讀取。存取與第一個 Recordset 物件不相關的其他 Recordset 物件中的資料欄，不會導致 GetChunk 動作的中止。

如果 Field 物件中 Attributes 屬性內的 adFldLong 位元設定為 True，則可以在此資料欄上使用 GetChunk 方法。

如果您在 Field 上使用 GetChunk 方法時，沒有目前的資料錄，則會發生 3021 錯誤 (沒有目前資料錄)。


GetRows 方法 (ADO)

從 Recordset 物件中取得多個資料錄，將其放入陣列中。

語法

array = recordset.GetRows( Rows, Start, Fields )

傳回值

傳回一個二維陣列。

參數

Rows 選擇性參數。表示要取得資料錄個數的 Long 運算式。預設值為 adGetRowsRest (-1)。

Start 選擇性參數。評定 GetRows 動作應該開始之資料錄書籤的 String 或 Variant。您也可以使用下列其中一個 BookmarkEnum 值。

常數 | 說明
adBookmarkCurrent | 由目前的資料錄開始。
adBookmarkFirst | 由第一筆資料錄開始。
adBookmarkLast | 由最後一筆資料錄開始。

Fields 選擇性參數。Variant 表示單一資料欄名稱或序數位置，或資料欄名稱陣列或序數位置號碼。ADO 只會傳回在這些資料欄中的資料。

附註

使用 GetRows 方法會從 Recordset 複製資料錄到一個二維陣列。第一個陣列索引指向資料欄，而第二個陣列索引則指向資料錄號碼。當 GetRows 方法傳回資料時，array 變數會自動地編成正確的陣列維數。

如果您沒有指定一個值給 Rows 引數，則 GetRows 方法會自動地取得 Recordset 物件中所有的資料錄。如果您要求的資料錄超過了可用的資料錄個數，則 GetRows 只會傳回可用資料錄的個數。

如果 Recordset 物件支援書籤，您便可以藉由傳遞記錄的 Bookmark 屬性值來指定 GetRows 方法要從何處開始取得資料。

如果您要限定 GetRows 呼叫所傳回的資料欄，可以在 Fields 引數中傳遞一個單一資料欄名稱/號碼，或一個資料欄名稱/號碼的陣列。

在呼叫 GetRows 之後，下一筆未讀取的資料錄就變成目前的資料錄，或是在已經沒有資料錄時，將 EOF 屬性設定為 True。


GetString 方法 (ADO Recordset)

將 Recordset 以字串型態傳回。

語法

Set Variant = recordset.GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)

傳回值

將 Recordset 以字串值的 Variant (BSTR) 傳回。

參數

StringFormat 指定 Recordset 應轉換成下列哪一種格式。

常數 | 說明
adClipString | 資料列由 RowDelimiter 來分隔，資料行由 ColumnDelimiter 來分隔，而 NULL 值則由 NullExpr 來分隔。這三個參數只有與 adClipString 一起使用使才有效。

NumRows 選擇性參數。Recordset 中要轉換的資料列數。如果沒有指定 NumRows，或是它大於資料集中的資料列總數，則資料集中的所有資料列都會被轉換。

ColumnDelimiter 選擇性參數。指定在資料行之間使用區隔符號，否則使用 TAB 字元。

RowDelimiter 選擇性參數。指定在資料列之間使用區隔符號，否則使用 CARRIAGE RETURN 字元。

NullExpr 選擇性參數。指定使用運算式來代替 NULL 值，否則使用空字串。

附註

資料列資料會儲存到字串中 (但不包含結構資料)。因此，無法使用此字串來重新開啟 Recordset。

此方法的作用與 RDO GetClipString 方法相同。


Item 方法 (ADO)

以名稱或序數號碼傳回集合物件中特定的成員。

語法

Set object = collection.Item ( Index )

傳回值

傳回一個物件參數。

參數

Index 認定集合物件中物件為名稱或序數號碼的 Variant。

附註

使用 Item 方法來傳回集合物件中特定的物件。如果此方法找不到集合物件中對應於 Index 引數的物件，則會發生錯誤。再者，有些集合物件不支援命名的物件；對於這些集合物件，您必須使用序數號碼引用。

Item 方法是所有集合物件的預設方法；因此，下列的語法格式可互相交換使用：

collection.Item (Index)

collection (Index)


Move 方法 (ADO)

移動 Recordset 物件中目前資料錄的位置。

語法

recordset.Move NumRecords, Start

參數

NumRecords 指定目前資料錄位置移動之資料錄數的有正負 Long 運算式。

Start 選擇性參數。認定為書籤的 String 或 Variant。您可使用下列其中一個 BookmarkEnum 值：

常數 | 說明
adBookmarkCurrent | 預設值。由目前資料錄開始。
AdBookmarkFirst | 由第一筆資料錄開始。
AdBookmarkLast | 由最後一筆資料錄開始。

附註

所有的 Recordset 物件皆支援 Move 方法。

如果 NumRecords 引數大於零，則目前的資料錄位置會往前移動 (往 Recordset 尾端的方向移動)。如果 NumRecords 小於零，則目前的資料錄位置會往回移動 (往 Recordset 開頭的方向移動)。

如果 Move 呼叫將目前的資料錄位置移到第一筆資料錄之前的一個點，則 ADO 會將目前資料錄的位置設定在 Recordset 中的第一筆資料錄之前 (BOF 為 True)。當 BOF 已經為 True 時，嘗試往回移動會產生錯誤。

如果 Move 呼叫將目前的資料錄位置移到最後一筆資料錄之後的一個點，則 ADO 會將目前資料錄的位置設定在 Recordset 中的最後一筆資料錄之後 (EOF 為 True)。當 EOF 已經為 True 時，嘗試往前移動會產生錯誤。

從空的 Recordset 物件中呼叫 Move 方法會產生錯誤。

如果您傳遞 Start 引數，則移動會相對於帶有書籤的資料錄 (假設 Recordset 物件支援書籤)。如果未指定，則移動會相對於目前的資料錄。

如果您是使用 CacheSize 屬性從提供者處近端快取資料錄，則傳遞NumRecords 引數 (將目前資料錄位置移出目前快取資料錄群組) 會強制 ADO 從目標資料錄中取得一組新的資料錄。CacheSize 屬性決定了新取得的群組的大小，且目標資料錄是第一筆取得的資料錄。

如果 Recordset 物件只能往前移動，只要目標是在目前的快取 Recordset 中，使用者仍可以傳遞小於零的 NumRecords 引數。如果 Move 呼叫將目前資料錄位置移到第一個快取資料錄之前，則會發生錯誤。因此，您可在只支援向前捲動的提供者上，使用支援完全捲動的資料錄快取。因為快取資料錄位於記憶體中，所以應該避免快取超過必要的資料錄。即使只能往前移動的 Recordset 物件也支援往回移動，但在任何只能往前移動的 Recordset 物件上呼叫 MovePrevious 方法仍會產生錯誤。


MoveFirst、MoveLast、MoveNext，及 MovePrevious 方法 (ADO)

在指定的 Recordset 物件中移到第一筆、最後一筆、下一筆，或上一筆資料錄，並將資料錄標記為目前的資料錄。

語法

recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

附註

使用 MoveFirst 方法將目前的資料錄位置移到 Recordset 中的第一筆資料錄。

使用 MoveLast 方法將目前的資料錄位置移到 Recordset 中的最後一筆資料錄。Recordset 物件必須支援書籤或資料指標往回移動；否則，此方法的呼叫會產生錯誤。

使用 MoveNext 方法將目前的資料錄位置往前移動一個資料錄 (往 Recordset 的底端移動)。如果目前的資料錄是最後一筆資料錄，且您呼叫 MoveNext 方法，則 ADO 會將目前的資料錄位置設定在 Recordset 中的最後一筆資料錄之後 (EOF 為 True)。當 EOF 屬性已經為 True 時，嘗試往前移動則會產生錯誤。

使用 MovePrevious 方法將目前的資料錄位置往回移動一個資料錄 (往 Recordset 的頂端移動)。Recordset 物件必須支援書籤或往回移動資料指標；否則，此方法呼叫會產生錯誤。如果目前的資料錄是第一筆資料錄，且您呼叫 MovePrevious 方法，則 ADO 會將目前的資料錄位置設定在 Recordset 中的第一筆資料錄之前 (BOF 為 True)。在 BOF 屬性已經為 True，則嘗試往回移動會發生錯誤。如果 Recordset 物件不支援書籤或往回移動資料指標，則 MovePrevious 方法會產生錯誤。

如果 Recordset 為只能往前移動，而您想要支援往前及往回捲動，可以使用 CacheSize 屬性來建立資料錄快取，這樣便可以透過 Move 方法來支援往回移動資料指標。因為快取的資料錄是位於記憶體中，所以應該避免快取超過所需的資料錄。您可以呼叫只能向前移動 Recordset 物件中的 MoveFirst 方法；這樣可能會造成提供者重新執行產生 Recordset 物件指令。


MoveFirst、MoveLast、MoveNext、MovePrevious 方法 (RDS)

移到顯示出來之 Recordset 中的第一筆、最後一筆、下一筆，或上一筆資料錄。

語法

DataControl.Recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

參數

DataControl 表示 RDS.DataControl 物件的物件變數。

附註

您可以使用 Move 方法以及 RDS.DataControl 物件來巡覽 Web 畫面上資料連結控制中的資料錄。例如，假設您藉由結合 RDS.DataControl 物件在方格中顯示出 Recordset，便可以包含「第一筆」、「最後一筆」、「下一筆」、「上一筆」按鈕，使用者可以按下這些按鈕來移動到顯示出來的 Recordset 中的第一筆、最後一筆、下一筆，或上一筆資料錄。您可以在個別的「第一筆」、「最後一筆」、「下一筆」、「上一筆」按鈕的 onClick 程序內呼叫 RDS.DataControl 物件中的 MoveFirst、MoveLast、MoveNext，及 MovePrevious 方法。通訊錄範例中顯示了完成此工作的方法。


NextRecordset 方法 (ADO)

藉由改善一數列的指令，來清除目前的 Recordset 物件並傳回下一個 Recordset。

語法

Set recordset2 = recordset1.NextRecordset( RecordsAffected )

傳回值

傳回 Recordset 物件。在語法模型中，recordset1 和 recordset2 可以是相同的 Recordset 物件，也可以使用個別的物件。

參數

RecordsAffected 選擇性參數。提供者傳回動作所影響資料錄個數的 Long 變數。

附註

使用 NextRecordset 方法來傳回複合指令陳述式或傳回多個結果的預存程序中的下一個指令的結果。如果您是依據一個複合式指令陳述式 (例如，"SELECT * FROM table1;SELECT * FROM table2")，在 Command 上使用 Execute 方法或在 Recordset 上使用 Open 方法來開啟 Recordset 物件，則 ADO 只會執行第一個指令並將結果傳回至 recordset。若要存取陳述式中伴隨發生指令的結果，請呼叫 NextRecordset 方法。

只要還有其他的結果，NextRecordset 方法就會繼續傳回 Recordset 物件。如果 row-returning 指令沒有傳回任何資料錄，則傳回的 Recordset 物件將為空白；此狀況只要檢查 BOF 及 EOF 的屬性是否皆為 True 即可得知。如果非 row-returning 的指令成功地執行了，則傳回的 Recordset 物件將被關閉，您可以在 Recordset 測試 State 屬性來檢查。當沒有其他的結果時，recordset 將會被設定為 Nothing。

如果在立即更新模式下進行編輯動作，則呼叫 NextRecordset 方法會產生錯誤；請先呼叫 Update 或 CancelUpdate 方法。

如果您要透過填滿 Parameters 集合物件或以原來的 Open 或 Execute 呼叫來傳遞陣列的方式，來傳遞參數給複合陳述式中的多個指令，則此參數在集合物件或陣列中的順序必須與其在指令數列中的個別指令順序相同。您必須在讀取輸出參數值之前，先完成讀取所有的結果。

當您呼叫 NextRecordset 方法時，ADO 只會執行陳述式中的下一個指令。如果您在執行完整個指令陳述式之前關閉了 Recordset 物件，ADO 就不會執行其餘的指令。

Remote Data Service 使用方法 NextRecordset 方法無法使用在用戶端的 Recordset 物件上。


Open 方法 (ADO 連接)

開啟對資料源的連接。

語法

connection.Open ConnectionString, UserID, Password, Options

參數

ConnectionString 選擇性參數。它是一個包含連接資訊的 String。有關有效設定值的詳細資訊，請參閱 ConnectionString 屬性。

UserID 選擇性參數。它是一個包含在建立連接時要用到的使用者名稱的 String。

Password 選擇性參數。它是一個包含在建立連接時要用到的密碼的 String。

Options 選擇性參數。它是一個 ConnectOptionEnum 值。決定此方法在建立同步化連線後或非同步化連線前傳回。可以是下列常數。

常數說明

adConnectUnspecified(預設值) 同步化建立連線。

adAsyncConnect非同步化建立連線。可以使用 ConnectComplete 值來確定何時可以連線。

備註

在 Connection 物件上使用 Open 方法，會建立對資料源的實體連接。這個方法成功後，連接就會發生作用，而您就可以針對它發出指令，並處理其結果。

使用選擇性的 ConnectionString 引數，即可指定一個包含一串 argument = value 且由分號隔開的陳述式的連接字串。ConnectionString 屬性會自動承繼用於 ConnectionString 引數的值。因此，您可以在開啟之前先設定 Connection 物件的 ConnectionString 屬性，或是在 Open 方法呼叫的期間，使用 ConnectionString 引數來設定或取代目前的連接參數。

您若以 ConnectionString 引數及選擇性的 UserID 和 Password 引數來傳遞使用者和密碼資訊，UserID 和 Password 引數將取代 ConnectionString 中指定的值。

當您已經結束 Connection 的動作時，可使用 Close 方法來釋放任何相關的系統資源。關閉物件的同時，並不會從記憶體中移除它；您可以改變其屬性設定值，稍後再用 Open 方法開啟。若要將物件完全地從記憶體中清除，可將物件變數設為 Nothing。

Remote Data Service 使用方法 當用在用戶端 Connection 物件時，在 Recordset 開啟於 Connection 物件之前，Open 方法其實並不會建立與伺服器的連接。


Open 方法 (ADO Recordset)

建立一個指標。

語法

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

參數

Source 選擇性參數。此 Variant 是為一個有效的 Command 物件變數名稱、SQL 陳述式、資料表名稱、已存的程序呼叫，或是一個保存的 Recordset 的檔名。

ActiveConnection 選擇性參數。不是 Variant 得到一個有效的 Connection 物件變數名稱，就是 String 包含 ConnectionString 參數。

CursorType 選擇性參數。此 CursorTypeEnum 值決定提供者在開啟 Recordset 時應使用的指標類型。其可以是下列其中一種常數 (有關這些設定值的定義，請參閱 CursorType 屬性)。

常數 | 說明
adOpenForwardOnly | (預設) 開啟一個順向資料指標。
AdOpenKeyset | 開啟一個索引鍵集 (keyset-type) 資料指標。
AdOpenDynamic | 開啟一個動態資料指標。
AdOpenStatic | 開啟一個靜態資料指標。

LockType 選擇性參數。此 LockTypeEnum 值決定提供者在開啟 Recordset 時應使用何種鎖定 (同時性)。其可以是下列其中一種常數 (有關進一步資訊，請參閱 LockType 屬性)。

常數 | 說明
adLockReadOnly | (預設) 唯讀，資料無法變更。
AdLockPessimistic | 悲觀性鎖定，以資料錄計 - 提供者會進行必要的動作以確保能順利編輯資料錄，其方法通常是在編輯時立即在資料源處鎖定資料錄。
AdLockOptimistic | 樂觀性鎖定，以資料錄計 - 提供者使用樂觀性鎖定，當您呼叫 Update 方法時，僅鎖定資料錄
AdLockBatchOptimistic | 樂觀性批次更新 - 此為批次更新模式所需，與即時更新模式相反。

Options 選擇性參數。一個 Long 值，表示提供者在 Source 引數代表 Command 物件以外的東西時應如何評估它，否則 Recordset 應從前次儲存的檔案還原。它可以是下列其中一種常數 (有關本清單前五個常數的詳細解說，請參閱 CommandType 屬性)。

常數 | 說明
adCmdText | 表示提供者會將 Source 評估為指令的文字定義。
AdCmdTable | 表示 ADO 會產生一個 SQL 查詢，從 Source 中指定的資料表傳回所有資料列。
AdCmdTableDirect | 表示提供者會從 Source 中指定的資料表傳回所有資料列。
AdCmdStoredProc | 表示提供者會將 Source 評估為一個預存程序。
AdCmdUnknown | 表示 Source 引數中未知的指令類型。
AdCmdFile | 表示保留的 (已儲存的) Recordset 會從 Source 中指定的檔案還原。
AdAsyncExecute | 表示 Source 作非同步執行。
AdAsyncFetch | 表示在 Initial Fetch Size 屬性中指定的初始數量被抓取後，剩下的資料列就會被非同步地抓取。如果所需的資料列未被抓取，則會凍傷主要的執行緒，直到取得所需的資料列。
AdAsyncFetchNonBlocking | 表示在抓取時，絕不凍結主執行緒。如果未抓取到所需的資料列，則目前的資料列會自動移到檔案的尾端。

備註

在 Recordset 物件上，利用 Open 方法開啟一個資料指標，這資料指標代表著從基本資料表、查詢結果或先前已儲存的 Recordset 資料錄。

利用選擇性的 Source 引數來指定使用下列一種資料源：Command 物件變數、 SQL 陳述式、已儲存的程序、資料表名稱或一個完整的檔案路徑名稱。如果 Source 是檔案路徑名稱，則可以是完整的路徑 ("c:\dir\file.rst")、相對的路徑 ("..\file.rst")、或 URL ("http://files/file.rst")。

ActiveConnection 引數對應於 ActiveConnection 屬性並且指定該由那一個連結來開啟 Recordset 物件。如果您傳遞一份連結定義給這個引數，ADO 便會使用指定的參數來開啟一個新的連結。您可以在開啟 Recordset 之後變更這個屬性值，以便傳送更新資料給另一個提供者，或者您可以設定這個屬性至 Nothing (在 Microsoft Visual Basic) 以中斷來自任何提供者的 Recordset。

至於其它引數直接對應到 Recordset 物件的屬性 (Source、CursorType 及 LockType)，其對應到屬性的引數關聯性陳述如下：

  • Recordset 物件開啟之前，該屬性為讀/寫狀態。

  • 該屬性設定被使用，除非執行 Open 方法時，您傳遞這些相對應的引數。如果您傳遞一個引數，它就會取代相對應的屬性設定，而且這個屬性會根據引數值作更新。

  • 在您開啟 Recordset 物件之後，這些屬性則變成唯讀。

    註解 因為 Recordset 物件的 Source 屬性被設定成一個有效的 Command 物件，即使 Recordset 物件未開啟，ActiveConnection 屬性是以唯讀狀態呈現。

如果您在 Source 引數中傳遞一個 Command 物件，並且傳遞 ActiveConnection 引數，便會產生一項錯誤。因為 Command 物件的 ActiveConnection 屬性必須已經設定成一個有效 Connection 物件或連結的字串。

如果您要在 Source 引數傳遞某些其它的 Command 物件，您可以使用 Options 引數來最佳化 Source 引數的運算結果。如果 Options 引數未被定義，執行效能可能會降低，因為 ADO 必須呼叫提供者以確定此引數為 SQL 陳述式、一個以存除的程序或一個資料表名稱。如果您知道您所使用的 Source 型態，請設定 Options 引數來告知 ADO 直接跳躍至相關的程式碼。如果Options 引數不符合 Source 型態，便會產生一項錯誤。

如果沒有連結與資料錄及相關聯，則 Options 引數的預設值是 adCmdFile。就保留的 Recordset 物件而言，這是一般的狀況。

如果資料源沒有資料錄傳回，提供者會將 BOF 及 EOF 屬性設定為 True，而且無法定義目前的資料錄位置。您仍然可以加入新的資料到這個空的 Recordset 物件，如果指標資料型態允許的話。

當您已經透過一個開啟的 Recordset 物件結束動作時，請使用 Close 方法來釋放任何相關的系統資源。關閉一個物件並不會移除它的記憶體；您可以變更它的屬性設定，並且可在稍後使用 Open 方法再度開啟它。若要完全刪除一個物件的記憶體，請設定物件的變數為 Nothing。

以不帶運算子方式呼叫 Open，並且在 ActiveConnection 屬性設定前，建立由附加資料欄所產生的 Recordset 一項實例到 Recordset Fields 集合物件。

如果您將 CursorLocation 屬性設為 adUseClient，則您可以使用兩種方式之一，非同步取回資料列。建議的方法是將 Options 設定為 adAsyncFetch。或者，您也可以在 Properties 集合中使用 Asynchronous Rowset Processing 動態屬性，但是如果您沒有對 adAsyncFetch 設定 Options 參數，則可能造成相關的取回事件遺失。

注意 只有經由 Open 方法的 Options 參數才支援 MSRemote 提供者。


OpenSchema 方法 (ADO)

從提供者取得資料庫結構描述資訊。

語法

Set recordset = connection.OpenSchema (QueryType, Criteria, SchemaID)

傳回值

傳回包含結構描述資訊的 Recordset 物件。Recordset 會以唯讀及靜態資料指標型式開啟。

參數

QueryType 執行結構描述查詢的型態，可以是下列所述的任何常數。

Criteria 選擇性。給每一個 QueryType 選項的查詢常數陣列如下所述。

QueryType 值 | Criteria 值
adSchemaAsserts | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaCatalogs | CATALOG_NAME
adSchemaCharacterSets | CHARACTER_SET_CATALOG CHARACTER_SET_SCHEMA CHARACTER_SET_NAME
adSchemaCheckConstraints | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaCollations | COLLATION_CATALOG COLLATION_SCHEMA COLLATION_NAME
adSchemaColumnDomainUsage | DOMAIN_CATALOG DOMAIN_SCHEMA DOMAIN_NAME COLUMN_NAME
adSchemaColumnPrivileges | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME GRANTOR GRANTEE
adSchemaColumns | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaConstraintColumnUsage | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaConstraintTableUsage | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaForeignKeys | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME FK_TABLE_CATALOG FK_TABLE_SCHEMA FK_TABLE_NAME
adSchemaIndexes | TABLE_CATALOG TABLE_SCHEMA INDEX_NAME TYPE TABLE_NAME
adSchemaKeyColumnUsage | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaPrimaryKeys | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME
adSchemaProcedureColumns | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME COLUMN_NAME
adSchemaProcedureParameters | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PARAMTER_NAME
adSchemaProcedures | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PROCEDURE_TYPE
adSchemaProviderSpecific | 請參見備註
adSchemaProviderTypes | DATA_TYPE BEST_MATCH
adSchemaReferentialConstraints | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaSchemata | CATALOG_NAME SCHEMA_NAME SCHEMA_OWNER
adSchemaSQLLanguages | <none>
adSchemaStatistics | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaTableConstraints | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE
adSchemaTablePrivileges | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME GRANTOR GRANTEE
adSchemaTables | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
adSchemaTranslations | TRANSLATION_CATALOG TRANSLATION_SCHEMA TRANSLATION_NAME
adSchemaUsagePrivileges | OBJECT_CATALOG OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE GRANTOR GRANTEE
adSchemaViewColumnUsage | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME
adSchemaViewTableUsage | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME
adSchemaViews | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME

SchemaID 針對「提供者 - 結構描述」查詢的 GUID 並非由 OLE DB 規格所定義。如果 QueryType 被設定為 adSchemaProviderSpecific 就需要使用這個參數，否則；就不需要。

備註

OpenSchema 方法回傳資料源資訊，如伺服器上的資料表以及在資料表中的資料行。

Criteria 引數為一個值的陣列，其值可以用來限定結構描述的結果。每一個結構描述查詢有各自的參數設定。真正的結構描述是由 IDBSchemaRowset 介面的 OLE DB 規格作定義。在 ADO 所支援的查詢常數已如上表所述。

如果提供者不用上表所列的查詢常數，來定義它自己的非標準結構描述查詢，常數adSchemaProviderSpecific 便用來作 QueryType 引數。當使用了這個常數， SchemaID 引數便需要傳遞結構描述查詢的 GUID 來執行。如果 QueryType 被設定為 adSchemaProviderSpecific 但又不提供 SchemaID，則會導致一項錯誤。

提供者並沒有被要求支援所有的 OLE DB 結構描述查詢。只有 adSchemaTables, adSchemaColumns 和 adSchemaProviderTypes 需要藉由 OLE DB 規格來作結構描述查詢。然而，提供者並沒有被要求支援，就上表所述的那些結構描述查詢的 Criteria 常數。

Remote Data Service 使用方法 在用戶端 Connection 物件上，OpenSchema 方法是不能使用的。

注意 在 Visual Basic，包含 Connection 物件上 OpenSchema 方法所傳回 Recordset 中有四位元組、無正負號整數的欄位無法與其他變數比較。若需更多有關 OLE DB 資料類型的資訊，請參見 Microsoft OLE DB Programmer's Reference 的第十章與附錄 A。


Query方法 (RDS)

利用一個有效的 SQL 查詢字串傳回 Recordset.

語法

Set Recordset = DataFactory.Query Connection, Query

慘數

Recordset 物件變數，代表一個 Recordset 物件。

DataFactory 物件變數，代表一個 RDSServer.DataFactory 物件。

Connection 為一 String，包含伺服器連結資訊。與 Connect 屬性相類似。

Query 為一 String，包含 SQL 查詢。

備註

查詢應使用 SQL 資料庫伺服器的用語。如果執行查詢產生錯誤，便會傳回查詢結果。Query 方法並不會執行任何在 Query 字串上的語法。


Refresh 方法

更新集合物件中的物件，以反應提供者提供的或特有的物件。

語法

collection.Refresh

備註

Refresh 方法視您呼叫來源的集合物件，來完成不同的工作。

參數

在 Command 物件的 Parameters 集合物件上使用 Refresh 方法，即可為 Command 物件中所指定已儲存的程序或參數化的查詢，取得提供者的參數資訊。對於不支援已儲存的程序呼叫或參數化的查詢的提供者，集合物件將是空的。

在呼叫 Refresh 方法之前，您應將 Command 物件的 ActiveConnection 屬性設定為一個有效的 Connection 物件，將 CommandText 屬性設為一個有效的指令，以及將 CommandType 屬性設為 adCmdStoredProc。

假使你在呼叫 Refresh 方法之前存取 Parameters 集合物件的話，ADO 將會自動呼叫方法，並為你閱讀集合物件。

註解 如果您使用 Refresh 方法，從提供者處取得參數資訊，而它又傳回一或多個變數長度資料類型 Parameter 物件的話，ADO 可能會依據參數的最大容量來為它們分配記憶體，而這麼做會在執行期間產生錯誤。為了避免錯誤，在呼叫 Execute 方法之前，您應該明確地為這些參數設定 Size 屬性。

資料欄

在 Fields 集合物件上使用 Refresh 方法，並沒有明顯的作用。若要從使用的資料庫結構中擷取變更的資料，您必須利用 Requery 方法，或者，如果 Recordset 物件不支援書籤，則使用 MoveFirst 方法。

屬性

在某些物件的 Properties 集合物件上利用 Refresh 方法，即可用提供者提供的動態屬性來組合集合物件。這些屬性提供了 ADO 內建屬性以外，且指定給提供者的功能的資訊。


Refresh 方法 (RDS)

要求指定於 Connect 屬性的 ODBC 資料源，及更新查詢結果。

語法

DataControl.Refresh

參數

DataControl 一個物件變數，其代表一個 RDS.DataControl 物件。

備註

在使用 Refresh 方法之前，您必須設定 Connect、Server 及 SQL 屬性。與 RDS.DataControl 物件有關聯的表單上所有資料連結控制項，將會傳送新的 Recordset。先前存在的任何 Recordset 物件會被釋出，而任何未儲存的變更會被捨棄。Refresh 方法會自動將第一個資料錄變成現有的資料錄。

當您在處理資料時，週期性地呼叫 Refresh 方法是一個不錯的方式、如果你擷取資料後，將它放在客戶端電腦上一陣子，這些資料可能會過時。而且您作的任何變更可能都會失效，因為有人可能已在資料錄上作變更，並在您之前將這些變更傳送出去。


Requery 方法 (ADO)

藉由重新執行物件所依據的查詢來更新 Recordset 物件中的資料。

語法

recordset.Requery Options

參數

Options 選擇性參數。一個 bitmask，代表會影響這個動作的選項。若此參數設為 adAsyncExecute，此動作將非同步執行，而 RecordsetChangeComplete 事件則會在它結束時發出。

備註

利用 Requery 方法，重新發出原始指令，並再次擷取資料，如此即可從資料源處重新整理 Recordset 物件的全部內容。呼叫此方法，相當於連續呼叫 Close 及 Open 方法。如果您正在編輯現用的資料錄，或正在增加一個新資料錄，便會發生錯誤。

開啟 Recordset 物件的同時，定義資料指標的原始狀態 (CursorType、LockType、MaxRecords 等等) 的屬性是唯讀的。因此，Requery 方法僅能重新整理現用的資料指標。若要變更任何資料指標屬性並查看其結果，您必須使用 Close 方法，如此，屬性才會再次變成可讀寫。然後再來變更屬性設定值，並呼叫 Open 方法來重新開啟資料指標。


Reset 方法 (RDS)

執行用戶端上以指定的分類及篩選屬性為依據的 Recordset 的分類及篩選條件。

語法

DataControl.Reset(value)

參數

DataControl 一個物件變數，其代表一個 RDS.DataControl 物件。

value 選擇性參數。一個 Boolean 值，如果您要在目前「篩選過的」資料列集上篩選，便為 True (預設)。如果您在原始資料列集上篩選，而刪除之前的篩選選項時，便為 False。

備註

SortColumn、SortDirection、FilterValue、FilterCriterion 及 FilterColumn 屬性，在用戶端快取上提供了分類及篩選功能。分類功能是以一資料行中的值來為資料錄排序。而篩選功能則可在整個 Recordset 保留在快取的同時，顯示一個以尋找準則為依據的資料錄子集。Reset 方法會執行準則，並用一個可以更新的 Recordset 來取代目前的 Recordset。

如果尚未傳送出去的原始資料有變更，Reset 方法就會失敗。首先，用 SubmitChanges 方法儲存一個可讀寫的 Recordset 中的任何變更，再用 Reset 方法來分類或篩選資料錄。

如果您要在資料列集上執行一種以上的篩選動作，即可搭配使用選擇性的 Boolean 引數及 Reset 方法。下列範例告訴您怎麼做：

ADC.SQL = "Select au_lname from authors"
ADC.Refresh        ' Get the new rowset.

ADC.FilterColumn = "au_lname"
ADC.FilterCriterion = "<"
ADC.FilterValue = "'M'"
ADC.Reset            ' Rowset now has all Last Names < "M".

ADC.FilterCriterion = ">"
ADC.FilterValue = "'F'"
' Passing True is not necessary, because it is the
' default filter on the current "filtered" rowset.
ADC.Reset(TRUE)        ' Rowset now has all Last
                        ' Names < "M" and > "F".

ADC.FilterCriterion = ">"
ADC.FilterValue = "'T'"
' Filter on the original rowset, throwing out the
' previous filter options.
ADC.Reset(FALSE)    ' Rowset now has all Last Names
                        ' > "T".


Resync 方法

從所使用的資料庫重新整理目前 Recordset 物件中的資料。

語法

recordset.Resync AffectRecords, ResyncValues

參數

AffectRecords 選擇性參數。一個 AffectEnum 值，其決定 Resync 方法將影響多少資料錄。它可以是下列其中一種常數。

常數 | 說明
adAffectCurrent | 僅重新整理目前的資料錄。
AdAffectGroup | 重新整理符合目前的 Filter 屬性設定值的需要的資料錄。若要使用這個選項，您必須將 Filter 屬性設成一種預先定義的有效常數。
AdAffectAll | 預設值。重新整理 Recordset 物件中所有的資料錄，包括任何被目前的 Filter 屬性設定值隱藏的資料錄。
adAffectAllChapters | 重新整理所有的章節資料錄。

ResyncValues 選擇性參數。一個 ResyncEnum 值，其指定是否要覆寫所使用的數值。其可以是下列其中一種常數。

常數 | 說明
adResyncAllValues | 預設值。資料被覆寫，被擱置的更新也被取消。
AdResyncUnderlyingValues | 資料不會被覆寫，而被擱置的更新也不會被取消。

備註

利用 Resync 方法，以所使用的資料庫將目前 Recordset 中的資料錄重新同步化。這對於正在使用靜態或順向資料指標，同時想看到所使用的資料庫中的任何變更的您來說，是很管用的。

如果您對 adUseClient 設定 CursorLocation 屬性，則只有非唯讀的 Recordset 物件可以使用 Resync。

Resync 方法不像 Requery 方法，它不會重新執行 Recordset 物件的指令；所使用的資料庫中的新資料錄是看不到的。

如果重新同步化的動作因與使用的資料衝突而失敗 (例如，資料錄已被另一位使用者刪除)，提供者會將警告傳回到 Errors 集合物件，進而產生一個執行時期錯誤。可利用 Filter 屬性 (adFilterConflictingRecords) 及 Status 屬性來找出有衝突的資料錄。

Remote Data Service 使用方法 Resync 方法在用戶端 Recordset 無法使用。

如果已經設定 Unique Table 與 Resync Command 動態屬性，且 Recordset 是在多重資料表上執行 JOIN 作業的結果，則 Resync 方法會只會執行在 Unique Table 屬性中已命名資料表上 Resync Command 屬性所下的指令。


Save 方法 (ADO Recordset)

將 Recordset 儲存 (保留) 在檔案中。

語法

recordset.Save FileName, PersistFormat

參數

FileName 選擇性參數。Recordset 儲存的完整路徑名稱。

PersistFormat 選擇性參數。是 PersistFormatEnum 值，用來指定 Recordset 的儲存格式。可以是下列常數。

常數說明

adPersistADTG(預設值) 以專用的 Advanced Data Tablegram 格式儲存。

adPersistXML以 XML 格式儲存。

Recordset 儲存的格式。目前的預設值，且為唯一有效值是 adPersistADTG。

備註

Save 方法只能在開啟的 Recordset 呼叫。使用 Open 方法，即可在稍後從 FileName 還原 Recordset。

如果 Filter 屬性對 Recordset 是有效的，那麼只有在篩選資料下可存取的資料列才會被儲存。如果 Recordset 有階層架構，那麼目前的子 Recordset 及其下層都會被儲存，但其上層除外。

第一次儲存 Recordset 時，可指定 FileName。如果您隨後呼叫 Save，此時請忽略 FileName，否則會產生執行時期錯誤。如果您隨後以新的 FileName 呼叫 Save，則 Recordset 會儲存到新檔案中。不過新檔案和原始檔案都會被打開。

Save 不會關閉 Recordset 或 FileName，因此您可以繼續處理 Recordset，並儲存最新的變更。FileName 會保持在開啟狀態，直到 Recordset 關閉為止，而在這段期間，其他應用程式只能讀，不能寫入 FileName。

基於安全的理由，Save 方法只允許從 Microsoft Internet Explorer 執行的 script 來使用低與自訂的安全設定值。若需安全性問題的更詳盡說明，請參見位於 http://www.microsoft.com/data/techmat.htm 處，標題為 "Security Issues in the Microsoft Internet Explorer" 的白皮書。

如果 Save 方法在非同步 Recordset 抓取、執行或更新動作在進行的同時被呼叫，那麼 Save 就會等非同步動作完成。

當 Save 方法完成動作，目前的資料列位置將是 Recordset 的第一列。

若要得到最佳的結果，請將 CursorLocation 屬性設定為 adUseClient 及 Save。如果您的提供者不支援所有儲存 Recordset 物件的必要功能，則用戶端指標將提供該功能。


Seek 方法

搜索 Recordset 的索取可以快速找到符合指定值的資料列，並且將目前資料列的位置移到該資料列。

語法

recordset.Seek KeyValues, SeekOption

參數

KeyValues VARIANT 值的陣列。索取包含一或多欄，陣列包含與每個相關欄位比較的值。

SeekOption 是 SeekEnum 值，用來指定在索取的欄位與相關 KeyValues 間，比較的類別。可以是下列比較常數。

常數說明

adSeekAfterEQ尋找等於 KeyValues 或就在發生相符處之後的關鍵字。

adSeekAfter尋找就在與 KeyValues 相符處之後的關鍵字。

adSeekBeforeEQ尋找等於 KeyValues 或就在發生相符處之前的關鍵字。

adSeekBefore尋找就在與 KeyValues 相符處之前的關鍵字。

adSeekFirstEQ尋找第一筆與 KeyValues 相符的關鍵字。

adSeekLastEQ尋找最後一筆與 KeyValues 相符的關鍵字。

備註

使用 Seek 方法搭配 Index 屬性 (如果基礎的提功者支援 Recordset 物件上的索引)。 若是確定基礎的提功者是否支援索引，請使用 Supports (adIndex) 方法。

如果 Seek 無法找到所需的資料列，且沒有發生錯誤，同時資料列位於 EOF。請在執行此方法前，先將 Index 屬性設定到所需的索取。

只有在 Recordset 物件的 CursorLocation 屬性與 adUseClient 值不同時，才可以使用此方法。


SubmitChanges 方法 (RDS)

送出本端快取區更新的 Recordset 所擱置的變更至指定於連結屬性中的 ODBC 資料源。

語法

DataControl.SubmitChanges

DataFactory.SubmitChanges Connection, Recordset

參數

DataControl 物件變數，代表一個 RDS.DataControl 物件。

DataFactory 物件變數，代表一個 RDSServer.DataFactory 物件。

Connection String 值，代表以 RDS.DataControl 物件的 Connect 屬性建立的連結。

Recordset 物件變數，代表一個 Recordset 物件。

備註

在您可以 RDS.DataControl 物件使用 SubmitChanges 方法之前，連結、伺服器及 SQL 屬性必須先設定。

如果您呼叫 CancelUpdate 方法是在您已經以相同的 Recordset 物件呼叫了 SubmitChanges 之後，CancelUpdate 呼叫便失效，因為這些變更已經被認可了。

只有已變更的資料錄會被傳送作為修改之用，要不所有的變更持續，要不所有的變更一起失效。

您僅能以預設的 RDSServer.DataFactory 物件來使用 SubmitChanges。自訂的 business 物件不能使用這種方法。


Supports 方法

決定指定的 Recordset 物件是否支援特定類型的功能。

語法

boolean = recordset.Supports( CursorOptions )

傳回值

傳回一個布林值，指出提供者是否支援所有 CursorOptions 引數識別的功能。

參數

CursorOptions 含有下列一個或以上的 CursorOptionEnum 值的 Long 運算式。

常數 | 說明
adAddNew | 您可使用 AddNew 方法來新增新的資料錄。
AdApproxPosition | 您可讀取及設定 AbsolutePosition 和 AbsolutePage 屬性。
adBookmark | 您可使用 Bookmark 屬性來存取特定的資料錄。
adDelete | 您可使用 Delete 方法來刪除資料錄。
adHoldRecords | 您不須確認所有擱置的變更，就可以取得更多的資料錄或變更下一個取得的位置。
adMovePrevious | 您不須要求書籤，即可使用 MoveFirst 和 MovePrevious 方法，以及 Move 或 GetRows 方法將目前的資料錄位置往回移動。
adResync | 您可以使用 Resync 方法，使用所依據資料庫中可見的資料來更新資料指標。
adUpdate | 您可使用 Update 方法來修改現有的資料。
adUpdateBatch | 您可使用批次更新 (UpdateBatch 和 CancelBatch 方法)，傳送給提供者多組變更。
adIndex | 您可以使用 Index 屬性對索引命名。
adSeek | 您可以使用 Seek 方法來找出 Recordset 中的資料列。

備註

使用 Supports 方法來決定 Recordset 物件支援哪一種類型的功能。如果 Recordset 物件支援對應常數在 CursorOptions 中的功能，則 Supports 方法會傳回 True。否則，會傳回 False。

註解 雖然 Supports 方法可以為所給定的功能傳回 True，但它並不保證提供者在所有的情況下都可以使用此種功能。假設在符合的特定條件下，Supports 方法只是傳回提供者是否可支援指定的功能。例如，雖然資料指標是以多重資料表結合為依據，然而其中的一些資料行並未更新，但 Supports 方法可能還是指出 Recordset 物件支援更新功能。


Update 方法

儲存您對 Recordset 物件中的目前資料錄所做的任何變更。

語法

recordset.Update Fields, Values

參數

Fields 選擇性參數。表示您要修改之單一名稱的 Variant，或資料欄名稱或序數位置的 Variant 陣列。

Values 選擇性參數。表示新資料錄中單一值的 Variant 或欄位值的 Variant 陣列。

備註

在您呼叫了 AddNew 方法或變更了現有資料錄的資料欄值之後，請使用 Update 方法來儲存您對 Recordset 物件中的目前資料錄所做的任何變更。Recordset 物件必須支援更新功能。

若要設定資料欄值，請執行下列其中之一：

  • 指定一個值給 Field 物件的 Value 屬性，並呼叫 Update 方法。

  • 以 Update 呼叫傳遞一個資料欄名稱及一個值作為引數。

  • 以 Update 呼叫傳遞一個資料欄名稱陣列及一個值的陣列。

當您使用資料欄和值的陣列時，兩個陣列的元件數目必須相同。再者，資料欄名稱的順序必須與資料欄值的順序相符。如果資料欄和值的數目及順序不符，則會發生錯誤。

如果 Recordset 物件支援批次更新功能，您便可以在呼叫 UpdateBatch 方法之前，先將多個變更快取到近端的一個或多個資料錄中。如果您在呼叫 UpdateBatch 方法的同時，也在編輯目前的資料錄或新增新的資料錄，則 ADO 將會在批次變更傳送給提供者之前，自動地呼叫 Update 方法來儲存對目前資料錄所做的任何擱置變更。

如果您在呼叫 Update 方法之前離開正在新增或編輯的資料錄，則 ADO 會自動地呼叫 Update 來儲存變更。如果您希望取消對目前資料錄所做的變更，或放棄一筆新增的資料錄，您必須呼叫 CancelUpdate 方法。

在呼叫 Update 方法之後，目前的資料錄會停留在目前的狀態。

如果已經設定 Unique Table 動態屬性，且 Recordset 是在多重資料表上執行 JOIN 作業的結果，則 Update 方法無法更新多重資料表的主鍵值。此外，Update 方法可以僅更新於 Unique Table 屬性所指定資料表中的欄位。


UpdateBatch 方法

將所有擱置的批次更新寫入磁碟中。

語法

recordset.UpdateBatch AffectRecords

參數

AffectRecords 選擇性參數。AffectEnum 值決定 UpdateBatch 方法將會影響的資料錄數目。可能是下列其中一個常數。

常數 | 說明
adAffectCurrent | 只寫入目前資料錄的擱置變更。
AdAffectGroup | 寫入滿足目前 Filter 屬性設定值之資料錄的擱置變更。若要使用此選項，您必須將 Filter 屬性設定為有效內建常數的其中一個。
AdAffectAll | (預設值) 寫入 Recordset 物件中所有資料錄的擱置變更，包含目前 Filter 屬性設定所隱藏的資料錄。
adAffectAllChapters | 寫入所有章節的未決變更。

註釋

在批次更新模式下修改 Recordset 物件時，請使用 UpdateBatch 方法將所有在 Recordset 物件中所做的變更傳送到所依據的資料庫中。

如果 Recordset 物件支援批次更新功能，您便可以在呼叫 UpdateBatch 方法之前，先將多個變更快取到近端的一個或多個資料錄中。如果您在呼叫 UpdateBatch 方法的同時，也在編輯目前的資料錄或新增新的資料錄，則 ADO 將會在批次變更傳送給提供者之前，自動地呼叫 Update 方法來儲存對目前資料錄所做的任何擱置變更。

注意 您只能以索引鍵集或靜態資料指標來使用批次更新功能。

如果因為與所依據的資料衝突 (例如，資料錄被另一個使用者刪除了)，而導致任何或所以資料錄的變更傳輸失敗，提供者會傳回警告到 Errors 集合，且會發生執行期間錯誤。請使用 Filter 屬性 (adFilterAffectedRecords) 及 Status 屬性來找出相衝突的資料錄。

若要取消所有的擱置批次更新功能，請使用 CancelBatch 方法。

如果已經設定 Unique Table 與 Update Resync 動態屬性，且 Recordset 是在多重資料表上執行 JOIN 作業的結果，則會在執行依據 Update Resync 屬性設定值的 Resync 方法後，執行 UpdateBatch 方法。


ADO Events

ADO 事件

ADO 事件摘要

事件 | 說明
BeginTransComplete, CommitTransComplete, and RollbackTransComplete (ConnectionEvent) Methods | 這些事件處理方法會在 Connection 物件上的相關作業執行完畢之後被呼叫。 BeginTransComplete 會在 BeginTrans 作業之後被呼叫。 CommitTransComplete 會在 CommitTrans 作業之後被呼叫。 RollbackTransComplete 會在 RollbackTrans 作業之後被呼叫。
ConnectComplete and Disconnect (Connection Event) Method | ConnectComplete 方法會在連接開始之後被呼叫。 Disconnect 方法會在連接結束之後被呼叫。
EndOfRecordset (RecordsetEvent) Method | EndOfRecordset 方法會在嘗試將資料列傳送到 Recordset 結尾後被呼叫。
ExecuteComplete (Connection Event) Method | ExecuteComplete 方法在指令執行完畢之後被呼叫。
FetchComplete (RecordsetEvent) Method | FetchComplete 方法會在將長時間非同步作業放到 (投入) Recordset 之後被呼叫。
FetchProgress (Recordset Event) Method | FetchProgress 方法會在長時間非同步作業作業報告目前要將多少資料列放到 (投入) Recordset 的時候被呼叫。
InfoMessage (Connection Event) Method | InfoMessage 方法會在 ConnectionEvent 作業一發生警告就被呼叫。
onError (Event) Method (RDS) | onError 方法會在作業一發生錯誤就被呼叫。
onReadyStateChange (Event) Method (RDS) | 此方法會在 ReadyState 屬性值一變更的時候就被呼叫。
WillChangeField and FieldChangeComplete (RecordsetEvent) Methods | WillChangeField 方法會在 Recordset 內 Field 一或多個值暫停變更時就被呼叫。 FieldChangeComplete 方法會在一或多個 Field 物件的值變更之後就被呼叫。
WillChangeRecord and RecordChangeComplete (RecordsetEvent) Methods | WillChangeRecord 方法會在 Recordset 一或多個記錄 (資料列) 變更之前被呼叫。 RecordChangeComplete 方法會在一或多個記錄變更之後被呼叫。
WillChangeRecordset and RecordsetChangeComplete (RecordsetEvent) Methods | WillChangeRecordset 方法會在暫停作業變更 Recordset 之前被呼叫。 RecordsetChangeComplete 方法會在 Recordset 方法變更之後被呼叫。
WillConnect (ConnectionEvent) Method | WillConnect 方法會在連接開始之前被呼叫。用到此暫時連接的參數會當成輸入參數提供，而且可以在方法傳回之前變更。此方法可能會傳回一個可以取消暫停連接的要求。
WillExecute (ConnectionEvent) Method | WillExecute 方法會在剛好此連接上的暫停指令開始執行被呼叫，讓使用者可以檢查和修改暫停指令。此方法可能會傳回一個可以取消暫停連接的要求。
WillMove and MoveComplete (RecordsetEvent) Methods | WillMove 方法會在暫停作業指令變更 Recordset 的目前位置之前被呼叫。 MoveComplete 方法會在 Recordset 的目前位置變更之後被呼叫。


BeginTransComplete, CommitTransComplete 與 RollbackTransComplete (ConnctionEvent) 方法 (ADO)

BeginTransComplete､ CommitTransComplete 與 RollbackTransComplete (ConnectionEvent) 方法

這些 Event 處理方法會在 Connection 物件上相關的動作執行完畢被呼叫。

  • BeginTransComplete 在 BeginTrans 動作之後被呼叫。

  • CommitTransComplete 在 CommitTrans 動作之後被呼叫。

  • RollbackTransComplete 在 RollbackTrans 動作之後被呼叫。

語法

BeginTransComplete TransactionLevel, pError, adStatus, pConnection

CommitTransComplete pError, adStatus, pConnection

RollbackTransComplete pError, adStatus, pConnection

參數

TransactionLevel 一個 Long。其包含造成這個事件的 BeginTrans 的新交易層次。

pError 一個 Error 物件。它主要在描述當 EventStatusEnum 的值是 adStatusErrorsOccurred 時所產生的錯誤。否則它不會被設定。

adStatus 一個 EventStatusEnum 狀態值。當這些方法的其中一種被呼叫時，如果產生事件的動作成功，這些參數便設為 adStatusOK，若動作失敗，則設為 adStatusErrorsOccurred。

這些方法可防止後續的告知動作，其方法是在方法傳回之前將這個參數設為 adStatusUnwantedEvent。

pConnection 這個事件產生的 Connection 物件。

附註

在 Visual C++，多個 Connections 可共用相同的事件處理方法。這方法使用傳回的 Connection 物件來決定哪個物件會產生事件。

如果 Attributes 屬性設為 adXactCommitRetaining 或 adXactAbortRetaining，在認可或倒回一項交易之後，會開始另一個新交易。使用 BeginTransComplete 事件處理常式，除了第一個交易起始事件外，其他一概不理。


ConnectComplete and Disconnect (ConnectionEvent) 方法 (ADO)

ConnectComplete 與 Disconnect (ConnectionEvent) 方法

ConnectComplete 方法會在連接啟動之後被呼叫。而 Disconnect 方法則在連接結束之後被呼叫。

語法

ConnectComplete pError, adStatus, pConnection

Disconnect adStatus, pConnection

參數

pError 一個 Error 物件。它主要在描述當 adStatus 的值是 adStatusErrorsOccurred 時所產生的錯誤。否則它不會被設定。

adStatus 一個傳回 adStatusOK 的 EventStatusEnum 值。

當 ConnectComplete 被呼叫時，若 WillConnect 方法已經要求取消擱置連接，此此參數設為 adStatusCancel。

在任一方法傳回之前，將此參數設為 adStatusUnwantedEvent 以防止後續的告知。

pConnection 此事件所應用的 Connection 物件。不過關閉和重新開啟 Connection會造成事件重新發生。


EndOfRecordset (ConnectionEvent) 方法 (ADO)

EndOfRecordset (RecordsetEvent) 方法

當您企圖移至 Recordset 的資料結尾時便會呼叫本方法。

語法

EndOfRecordset fMoreData, adStatus, pRecordset

參數

fMoreData VARIANT_BOOL 型態。您可以在此事件中將新的資料附加至 pRecordset 中。在 EndOfRecordset 回應之前，加入您的資料，然後再將此參數設為 True 值以便指出這是 Recordset 新的結尾。

adStatus EventStatusEnum 狀態值。

當 EndOfRecordset 被呼叫時，此參數會在產生事件的動作完成時則設為 adStatusOK。若本方法無法要求取消產生此事件的動作時便會設為 adStatusCantDeny。

在 EndOfRecordset 回應前，您可以將此參數設為 adStatusUnwantedEvent 以避免隨後可能出現的警訊。

pRecordset Recordset 物件。產生本事件的 Recordset。

附註

當 Recordset.MoveNext 動作失敗時，EndOfRecordset 事件便會產生

此事件代碼會在使用者企圖讀取 pRecordset 結尾時被呼叫，例如在執行 MoveNext 時發。然而，有時使用者想要由資料庫取得更多的資料並附加至 pRecordset 結尾。在這種形況下，使用者可以將 fMoreData 設為 VARIANT_TRUE，然後經由 EndOfRecordset 回應。之後使用者便可重新呼叫 MoveNext 來取得新取入的資料錄。


ExecuteComplete (ConnectionEvent) 方法 (ADO)

ExecuteComplete (ConnectionEvent) 方法

當指令完成執行後 便會呼叫本方法。

語法

ExecuteComplete RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection

參數

RecordsAffected Long 型態。被指令影響的資料錄之數目。

pError Error 物件。此參數描述錯誤是如何發生，只有當 adStatus 的值被設為adStatusErrorsOccurred 才有效，否則是不會被設定。

adStatus EventStatusEnum 狀態值。本方法被呼叫時，當產生事件的動作成功的完成會將此參數設為 adStatusOK，若失敗﹐則設為 adStatusErrorsOccurred。

在此方法回應前，您可以將此參數設為 adStatusUnwantedEvent 以避免隨後可能出現的警訊。

pCommand Command 物件，只有在指令完成後才有的。

pRecordset Recordset 物件。指令執行的結果。此資料錄集可以是空的。

pConnection Connection 物件。被執行的指令之連結。

附註

ExecuteComplete 事件會在 Connection.Execute 、 Command.Execute 、 Recordset.Open 或 Recordset.NextRecordset 時而產生。


FetchComplete (RecordsetEvent) 方法 (ADO)

FetchComplete (RecordsetEvent)方法

當冗長的非同步動作將所有的資料錄取至（傳入） Recordset 便會呼叫本方法。

語法

FetchComplete pError, adStatus, pRecordset

參數

pError Error 物件。此參數描述錯誤是如何發生，只有當 adStatus 的值被設為adStatusErrorsOccurred 才有效，否則是不會被設定。

adStatus EventStatusEnum 狀態值。本方法被呼叫時，當產生事件的動作成功的完成會將此參數設為 adStatusOK，若失敗﹐則設為 adStatusErrorsOccurred。

在此方法回應前，您可以將此參數設為 adStatusUnwantedEvent 以避免隨後可能出現的警訊。

pRecordset Recordset 物件。被取至的資料錄之物件。


FetchProgress (RecordsetEvent) 方法 (ADO)

FetchProgress (RecordsetEvent) 方法

本方法會在冗長的非同步動作中定期的被呼叫，並告知目前有多少的資料錄被取至（傳入） Recordset 中。

語法

FetchProgress Progress, MaxProgress, pRecordset

參數

Progress Long 型態。目前已取得的資料錄數目。

MaxProgres Long 型態。預期最大將取得的資料錄數目。

pRecordset Recordset 物件。被取得的資料錄之物件。


InfoMessage (ConnectionEvent) 方法 (ADO)

InfoMessage (ConnectionEvent) 方法

無論何時，當 ConnectionEvent 動作成功的完成且提供者也已回應額外的資訊後，便會呼叫本方法。

語法

InfoMessage pError, adStatus, pConnection

參數

pError Error 錯誤物件。此參數包含任何傳回的錯誤。若傳回數個錯誤，則例舉 Errors 集合物件來尋找它們。

adStatus EventStatusEnum 狀態值。若發生警告， adStatus 會被設定成 adStatusOK，而且 pError 包含警告。

此方法傳回之前，請將此參數設成 adStatusUnwantedEvent 來禁止後續通知。

pConnection Connection 物件。發生警告的連接。例如，在 Connection 開啟 Connection 物件或執行 Command 時就會發生警告。


onError (事件) 方法 (RDS)

當動作執行中產生錯誤時便會呼叫本方法。

語法

onError SCode, Description, Source, CancelDisplay

參數

SCode 整數型態，錯誤狀態的代碼。

Description 字串型態，錯誤的描述。

Source 字串型態，引起錯誤的查詢或指令。

CancelDisplay 布林型態，若為 True 值，則產生的錯誤不會由對話方塊顯示出來。


onReadyStateChange (事件) 方法 (RDS)

當 ReadyState 屬性的值變更時便會呼叫本方法。

語法

onReadyStateChange

參數

無

附註

ReadyState 屬性可以反映出當 RDS.DataControl 物件以非同步將資料傳入 Recordset 物件的進度。您可以使用 onReadyStateChange 方法來監控發生變更的 ReadyState 屬性。這樣做會比使用定期檢查屬性的值還更有效。


WillChangeField 與 FieldChangeComplete (RecordsetEvent) 方法 (ADO)

WillChangeField 與 FieldChangeComplete (RecordsetEvent) 方法

WillChangeField 方法會在 Recordset 中一個或更多的 Field 物件變更前 被呼叫。FieldChangeComplete 方法則會在一個或更多的 Field 物件變更完成後 被呼叫。

語法

WillChangeField cFields, Fields, adStatus, pRecordset

FieldChangeComplete cFields, Fields, pError, adStatus, pRecordset

參數

cFields Long 型態。Fields 中 Field 物件的數目。

Fields Variants 型態的陣列。包含變更中的 Field 物件。

pError Error 物件。此參數描述錯誤是如何發生，只有當 adStatus 的值被設為adStatusErrorsOccurred 才有效，否則是不會被設定。

adStatus EventStatusEnum 狀態值。

當 WillChangeField 被呼叫時，若產生事件的動作成功的完成時設則為 adStatusOK。若本方法無法要求取消產生此事件的動作便會設為 adStatusCantDeny。

當 FieldChangeComplete 被呼叫時，若產生事件的動作成功的完成時設為 adStatusOK，若失敗則設為 adStatusErrorsOccurred。

在 WillChangeField 回應前，您可以將此參數設為 adStatusCancel 便可請求取消執行中的動作。

在 FieldChangeComplete 回應前，您可以將此參數設為 adStatusUnwantedEvent 以避免隨後可能出現的警訊。

pRecordset Recordset 物件。產生本事件的 Recordset。

附註

WillChangeField 或 FieldChangeComplete 事件會由下面的 Recordset 動作而產生：Value 與 Update 資料欄及參數值。


WillChangeRecord 與 RecordChangeComplete (RecordsetEvent) 方法 (ADO)

WillChangeRecord 與 RecordChangeComplete (RecordsetEvent) 方法

WillChangeRecord 方法會在 Recordset 中一列或更多的資料錄變更前被呼叫。RecordChangeComplete 方法則會在一列或更多的資料錄變更完成後被呼叫。

語法

WillChangeRecord adReason, cRecords, adStatus, pRecordset

RecordChangeComplete adReason, cRecords, pError, adStatus, pRecordset

參數

adReason EventReasonEnum 值。指出本事件產生的原因。此值可以是 adRsnAddNew、adRsnDelete、adRsnUpdate、adRsnUndoUpdate、adRsnUndoAddNew、adRsnUndoDelete 或 adRsnFirstChange。

cRecords Long 型態。變更（被影響） 的資料錄之數目。

pError Error 物件。此參數描述錯誤是如何發生，只有當 adStatus 的值被設為adStatusErrorsOccurred 才有效，否則是不會被設定。

adStatus EventStatusEnum 狀態值。

當 WillChangeRecord 被呼叫時，若產生事件的動作成功的完成時則設為 adStatusOK。若本方法無法要求取消產生此事件的動作便會設為 adStatusCantDeny。

當 RecordChangeComplete 被呼叫時，若產生事件的動作成功的完成時則設為 adStatusOK，若失敗則設為 adStatusErrorsOccurred。

在 WillChangeRecord 回應前，您可以將此參數設為 adStatusCancel 便可請求取消執行中的動作。

在 RecordChangeComplete 回應前，您可以將此參數設為 adStatusUnwantedEvent 以避免隨後可能出現的警訊。

pRecordset Recordset 物件。產生本事件的 Recordset。

附註

WillChangeRecord 或 RecordChangeComplete 可能因下列 Recordset 作業事件可能會發生在資料列的第一個變更的欄位；Update、Delete、CancelUpdate、AddNew、UpdateBatch 以及 CancelBatch。Recordset CursorType 的值可判斷造成事件發生的作業。


WillChangeRecordset 與 RecordsetChangeComplete (RecordsetEvent) 方法 (ADO)

WillChangeRecordset 與 RecordsetChangeComplete (RecordsetEvent) 方法

WillChangeRecordset 方法會在變更 Recordset 的動作執行前被呼叫。RecordsetChangeComplete 方法則會在 Recordset 變更完成後被呼叫。

語法

WillChangeRecordset adReason, adStatus, pRecordset

RecordsetChangeComplete adReason, pError, adStatus, pRecordset

參數

adReason EventReasonEnum 值。指出本事件產生的原因。此值可以是 adRsnReQuery 、 adRsnReSynch 、 adRsnClose 與 adRsnOpen。

adStatus EventStatusEnum 狀態值。

當 WillChangeRecordset 被呼叫時，若產生事件的動作成功的完成時則設為 adStatusOK。若本方法無法要求取消產生此事件的動作便會設為 adStatusCantDeny。

當 RecordsetChangeComplete 被呼叫時，若產生事件的動作成功的完成時則設為 adStatusOK，若失敗則設為 adStatusErrorsOccurred，或是之前被 WillChangeRecordset 事件接受的相關動作被取消時便會設為 adStatusCancel。

在 WillChangeRecordset 回應前，您可以將此參數設為 adStatusCancel 便可請求取消執行中的動作。

在 WillChangeRecordset 或 RecordsetChangeComplete 回應前，您可以將此參數設為 adStatusUnwantedEvent 以避免隨後可能出現的警訊。

pError Error 物件。此參數描述錯誤是如何發生，只有當 adStatus 的值被設為adStatusErrorsOccurred 才有效，否則是不會被設定。

pRecordset Recordset 物件。產生本事件的 Recordset。

附註

WillChangeRecordset 或 RecordsetChangeComplete 事件會由下面的 Recordset 動作而產生：Requery 與 Open。

若提供者不支援書籤，則每次從提供者取得新資料列時，就會發生 RecordsetChange 事件。此事件的頻率是由 RecordsetCacheSize 屬性決定的。


WillExecute (ConnectionEvent) 方法 (ADO)

WillExecute (ConnectionEvent) 方法

當一項擱置指令在此連接上執行，並提供使用者檢查及修改擱置執行參數的機會之前，此方法會被呼叫。此方法可能傳回取消擱置指令的要求。

語法

WillExecute Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection

參數

Source 包含一項 SQL 指令或保存的程序名稱的 String。

CursorType 包含將被開啟的 Recordset 所用的指標類型的 CursorTypeEnum。當此方法被呼叫時，若此參數設為 adOpenUnspecified，便無法變更。

LockType 包含將被開啟的 Recordset 所用的鎖定類型的 LockTypeEnum。當此方法被呼叫時，若此參數設為 adLockUnspecified，便無法變更。

Options 一個可用來執行指令或開啟 Recordset 的選項 Long 值。

adStatus 一個 EventStatusEnum 狀態值，在此方法被呼叫時，其可能是 adStatusCantDeny 或 adStatusOK。若是 adStatusCantDeny，此方法可能不會要求取消擱置動作。

在此方法傳回之前，將此參數設為 adStatusUnwantedEvent 以防止後續的告知，或設為 adStatusCancel 以要求取消產生此事件的動作。

pCommand 此事件通知所應用的 Command 物件。

pRecordset 此事件通知所應用的 Recordset 物件。

pConnection 此事件通知所應用的 Connection 物件。

附註

產生 WillExecute 事件的可能因素是 Connection.Execute、Command.Execute 或 Recordset.Open。其對應的 pConnection、pCommand 或 pRecordset 參數將設為產生事件的物件，而剩餘的兩個參數將設為 Nothing。


WillConnect (ConnectionEvent) 方法 (ADO)

WillConnect (ConnectionEvent) 方法

這個方法會在啟動連接之前被呼叫。擱置連接所用的參數會被當成輸入值，且可在方法傳回之進行變更。這個方法可能傳回取消擱置連接的要求。

語法

WillConnect ConnectionString, UserID, Password, Options, adStatus, pConnection

參數

ConnectionString 一個用於包含擱置連接的連接資訊的 String。

UserID 一個包含用於擱置連接的使用者名稱的 String。

Password 一個包含用於擱置連接的密碼的 String。

Options 一個 Long 值，其指示提供應計算 ConnectionString 的方式。請參閱 CommandType 屬性，以取得可接受值的清單。

adStatus 一個 EventStatusEnum 狀態值。

此方法被呼叫時，若產生事件的動作成功，此參數便設為 adStatusOK。若此方法無法要求取消擱置連接，參數便設為 adStatusCantDeny。

此方法傳回之前，將此參數設為 adStatusUnwantedEvent 以防止後續的告知。將此參數設為 adStatusCancel，即可要求造成此通知被取消的連接動作。

pConnection 此事件通知所應用的 Connection 物件。

附註

此方法被呼叫時，ConnectionString、UserID、Password 和 Options 參數就會設為產生事件的動作所建立的值。

方法被取消時，ConnectComplete 將被呼叫，而其 adStatus 參數被設為 adStatusErrorsOccurred。


WillMove 與 MoveComplete (RecordsetEvent) 方法 (ADO)

WillMove 與 MoveComplete (RecordsetEvent) 方法

WillMove 方法會在執行中的動作變更目前 Recordset 的位置前被呼叫。MoveComplete 方法則會變更目前 Recordset 的位置後被呼叫。

語法

WillMove adReason, adStatus, pRecordset

MoveComplete adReason, pError, adStatus, pRecordset

參數

參數

adReason EventReasonEnum 值。指出本事件產生的原因。此值可以是 adRsnMoveFirst、adRsnMoveLast、adRsnMoveNext、adRsnMovePrevious、adRsnMove 或 adRsnRequery。

pError Error 物件。此參數描述錯誤是如何發生，只有當 adStatus 的值被設為adStatusErrorsOccurred 才有效，否則是不會被設定。

adStatus EventStatusEnum 狀態值。

當 WillMove 被呼叫時，若產生事件的動作成功的完成時設則為 adStatusOK。若本方法無法要求取消產生此事件的動作便會設為 adStatusCantDeny。

當 WillMove 被呼叫時，若產生事件的動作成功的完成時設則為 adStatusOK。若本方法無法要求取消產生此事件的動作便會設為 adStatusCantDeny。

當 MoveComplete 被呼叫時，若產生事件的動作成功的完成時設為 adStatusOK，若失敗則設為 adStatusErrorsOccurred。

在 WillMove 回應前，您可以將此參數設為 adStatusCancel 便可請求取消執行中的動作。在 MoveComplete 回應前，您可以將此參數設為 adStatusUnwantedEvent 以避免隨後可能出現的警訊。

pRecordset Recordset 物件。產生本事件的 Recordset。

附註

WillMove 或 MoveComplete 事件會由下面的 Recordset 動作而產生：Open、Move、MoveFirst、MoveLast、MoveNext、MovePrevious、Bookmark、AddNew、Delete, Requery 與 Requery。若子 Recordset 連接了 Recordset 事件而主 Recordset 被移動時也會發生這些事件。


ADO 屬性

ADO 屬性摘要

屬性 | 說明
AbsolutePage | 指定目前資料錄常駐的頁面。
AbsolutePosition | 指定 Recordset 物件之目前資料錄的順序位置。
ActiveCommand | 表示建立以及和 Recordset 物件產生關聯之 Command 物件。
ActiveConnection | 表示指定的 Command 或 Recordset 物件目前歸屬於哪一個 Connection 物件。
ActualSize | 表示資料欄值的實際長度。
Attributes | 表示物件的一個或多個特性。
BOF and EOF | BOF 表示目前資料錄的位置在 Recordset 物件的第一筆資料錄之前。 EOF 表示目前資料錄的位置在 Recordset 物件的最後一筆資料錄之後。
Bookmark | 傳回唯一可以辨識出 Recordset 物件上目前的資料錄的書籤，或將 Recordset 物件上目前的資料錄設定為有效書籤所辨識的資料錄。
CacheSize | 表示在本端記憶體快取的 Recordset 物件的資料錄數。
CommandText | 包含您想要發給提供者的指令的文字
CommandTimeout | 表示在執行指令過程中，於中止指令及產生錯誤之前，必須等待多久時間•
CommandType | 表示 Command 物件的型態•
Connect | 設定或傳回用來執行查詢與更新動作的資料庫名稱•
ConnectionString | 包含可用來建立資料來源連接的資訊
ConnectionTimeout | 指示在建立連接時，並於中止作業並產生錯誤之前，須等待多久時間•
Count | 表示集合物件中的物件數•
CursorLocation | 設定或傳回資料指標引擎的位置
CursorType | 表示 Recordset 物件所使用的資料指標型態•
DataMember | 指定資料成員的名稱，從 DataSource 屬性參照的物件處取得。
DataSource | 指定包含哪一個物件要被表示成 Recordset 物件。
DefaultDatabase | 指示 Connection 物件的預設資料庫。
DefinedSize | 指示 Field 物件的定義大小。
Description | 說明 Error 物件。
Direction | 指示 Parameter 是否表示輸入參數、輸出參數或兩者。或者參照是否為某個預存程序的傳回值。
EditMode | 指示目前資料錄的編輯狀態。
ExecuteOptions (RDS) | 指示是否啟動非同步執行
FetchOptions | 設定或傳回非同步取得的類型。
Filter | 指示 Recordset 內資料的過濾器。
FilterColumn (RDS) | 設定或傳回用於計算過濾器準則的欄位
FilterCriterion (RDS) | 設定或傳回用於過濾器值內的計算運算子
FilterValue (RDS) | 設定或傳回用於過濾記錄的值。
Handler (RDS) | 設定或傳回包含伺服器端程式 (處理常式) 名稱的字串 (該程式可擴充 RDSServer.DataFactory的功能)，以及處理常式使用的任何參數 (全部以逗點 "," 分開)。
HelpContext 與 HelpFile | 表示有關 Error 物件的說明檔與主題。HelpContextID - 針對說明檔案中的主題，傳回說明主題代碼，當作長整數。 HelpFile - 傳回至說明檔案完整路徑的字串。
Index | 指示目前受 Recordset 物件影響的索引名稱。
InternetTimeout (RDS) | 指示在要求逾時之前的毫秒數目
IsolationLevel | 指示 Connection 物件的隔離層次。
LockType | 指示編輯時設定在記錄的鎖定類型
MarshalOptions | 指示哪些記錄要存回伺服器
MaxRecords | 指示從查詢傳回到 Recordset 的記錄數目上限。
Mode | 指示在修改 Connection 內資料可用的許可權。
Name | 指示物件的名稱。
NativeError | 指示提供者特定錯誤碼給指定的 Error 物件。
Number | 指示唯一用於識別 Error 物件的號碼。
NumericScale | 指示 Parameter 或 Field 物件內，數值的範圍。
Optimize | 表示在此資料欄中是否該建立索引功能。
OriginalValue | 表示在作任何變更之前存在資料錄中的 Field 值。
PageCount | 表示 Recordset 物件包含的資料頁數。
PageSize | 表示在 Recordset 中，建構一頁要多少資料錄。
Precision | 表示在一個 Parameter 物件或數字型的 Field 物件中，數值的精準程度。
Prepared | 表示是否要在執行之前儲存一個編譯過的指令版本。
Provider | 表示 Connection 物件的提供者名稱。
RecordCount | 表示在 Recordset 物件中現有的資料錄個數。
Recordset and SourceRecordset (RDS) | 指示從自訂 business 物件傳回的 ADOR.Recordset 物件。
ReadyState (RDS) | 傳遞 RDS.DataControl 物件將取得資料送到 Recordset 物件的處理進度。
Server (RDS) | 設定或傳回 Internet Information Server (IIS) 名稱與通訊協定。
Size | 以位元組或字元為單位，顯示 Parameter 物件大小的最大值。
Sort | 指定 Recordset 所要排序的一個或多個資料欄名稱，以及每個資料欄要以昇冪或降冪的方式來排序。
SortColulmn (RDS) | 設定或傳回排序記錄的欄位。
SortDirection (RDS) | 設定或傳回代表排序次序為昇冪或降冪的 Boolean 值。
Source (ADO Error) | 指示產生錯誤的物件或應用程式名稱。
Source (ADO Recordset) | 指示 Recordset 物件中資料的來源 (Command 物件、SQL 敘述、表格名稱或預存程序)。
SQL (RDS) | 設定或傳回用來取回 Recordset 的查詢字串。
SQLState | 指示特定 Error 物件的 SQL 狀態。
State | 說明所有可應用物件的物件狀態為開放或封閉。 說明執行匿名方法的 Recordset 物件，物件目前狀態為連接、執行或是取得資料。
Status | 指示在批次更新或整體作業中目前記錄的狀態。
StayInSync | 在階層式的 Recordset 物件中，指示主資料列是否要隨著依據的子記錄 (也就是 chapter) 來改變。
Type | 指示 Parameter、Field 或 Property 物件資料型態的運算類型。
UnderlyingValue | 顯示 Field 物件在資料庫中目前的數值。
Value | 顯示 Field、Parameter 或 Property 物件的指定值。
Version | 顯示 ADO 版本編號。


AbsolutePage 屬性

指定目前資料錄常駐的頁面。

設定與傳回值

設定或傳回一個從 1 到 Recordset 物件 (PageCount) 頁數之 Long 值，或傳回下列其中一個常數。

常數 | 說明
adPosUnknown | Recordset 是空的，目前的位置未知， 或提供者不支援 AbsolutePage 屬性。
adPosBOF | 目前的資料錄指標在 BOF (亦即，BOF 屬性為 True)。
adPosEOF | 目前的資料錄指標在 EOF (亦即，EOF 屬性為 True)。

附註

使用 AbsolutePage 屬性可確認目前資料錄所在的頁數。使用 PageSize 屬性可將 Recordset 物件邏輯性地分割成連串的若干頁，每頁中所含的資料錄數等於 PageSize (最後一頁除外，它可能只有少筆資料錄)。提供者必須支援適用之功能，才能使用此項屬性。

和 AbsolutePosition 屬性一樣，AbsolutePage 以 1 為底，當目前的資料錄是 Recordset 的第一筆資料錄時，便等於 1。設定此項屬性即可移到某頁的第一筆資料錄。而從 PageCount 屬性可獲得總頁數。


AbsolutePosition 屬性

指定 Recordset 物件之目前資料錄的順序位置。

設定與傳回值

設定或傳回從 1 到 Recordset 物件 (RecordCount) 中資料錄數目的 Long 值，或傳回下列其中一個常數。

常數 | 說明
AdPosUnknown | Recordset 是空的，目前的位置不明， 或提供者不支援 AbsolutePosition 屬性。
AdPosBOF | 目前的資料錄指標在 BOF (亦即，BOF 屬性為 True)。
adPosEOF | 目前的資料錄指標在 EOF (亦即， EOF 屬性為 True)。

附註

使用 AbsolutePosition 屬性，即可移到一筆根據其在 Recordset 物件中的順序位置的資料錄，或可決定目前資料錄的順序位置。提供者必須支援適用之功能，才能使用此項屬性。

和 AbsolutePage 屬性一樣，AbsolutePosition 以 1 為底，當目前的資料錄是 Recordset 的第一筆資料錄時，便等於 1。從 RecordCount 屬性可以獲得 Recordset 物件的總資料錄數。

當您設定 AbsolutePosition 屬性時，即使是將它設定到目前快取區中的資料錄，ADO 仍會重新載入具有以您指定的資料錄為首的一組新資料錄的快取區。CacheSize 屬性決定此組資料錄的大小。

註解 您不得使用 AbsolutePosition 屬性當作代用資料錄編號。刪除位於指定的資料錄前面的資料錄時，該資料錄的位置會改變。如果 Recordset 物件被重新查詢或開啟，亦無法保證指定的資料錄會有相同的 AbsolutePosition。建議您用書籤來取得或回到指定的位置，這也是在各種 Recordset 物件中標定位置的唯一方法。


ActiveCommand 屬性

表示建立以及和 Recordset 物件產生關聯之 Command 物件。

傳回值

傳回一個內含 Command 物件的 Variant 。 預設值為 Null 物件參照。

附註

ActiveCommand 屬性為唯讀。

如果 Command 物件未被用來產生目前的 Recordset， 則傳回 Null 物件參照。

當您只有最終的 Recordset 物件時，使用這項屬性去找出相關的 Command 物件。


ActiveConnection 屬性

表示指定的 Command 或 Recordset 物件目前歸屬於哪一個 Connection 物件。

設定和傳回值

設定或傳回一個內含連接或 Connection 物件的定義的 String。預設值是 Null 物件參照。

附註

利用 ActiveConnection 屬性即可決定被用來指定的 Command 物件或開啟指定的 Recordset 之 Connection 物件。

指令

對於 Command 物件，ActiveConnection 屬性為讀/寫。

如果在為開啟的 Connection 物件或有效的連接字串設定此項屬性之前，試圖在 Command 物件呼叫 Execute 方法，將會產生錯誤。

Microsoft Visual Basic 將 ActiveConnection 屬性設定為 Nothing，將使Command 物件與目前的 Connection 解除連結，並且讓提供者釋出任何與資料源相關的資源。然後您可以將 Command 物件連結到同一個或另一個 Connection 物件。有些提供者允許您將屬性設定從 Connection 改成另一個，而不需要先將屬性設為 Nothing。

如果 Command 物件的 Parameters 集合物件含有提供者所給的參數，如果將 ActiveConnection 屬性設為 Nothing 或另一個 Connection 物件，該集合物件將被清除。如果以手動方式建立 Parameter 物件，並且用它們來填充 Connection 物件的 Parameters 集合物件，將 ActiveConnection 屬性設為 Nothing 或另一個 Connection 物件將使 Parameters 集合物件維持不變。

關閉和 Command 物件相關的 Connection 物件，將使 ActiveConnection 屬性被設定為 Nothing。為關閉的 Connection 物件設定此項屬性，將產生錯誤。

Recordset

對於已開啟或其 Source 屬性被設成有效的 Command 物件的 Recordset 物件，其 ActiveConnection 屬性為唯讀。反之為讀/寫。

您可以將此屬性設定為有效的 Connection 物件或連接字串。此時，提供者會利用這項定義建立新的 Connection 物件，並開啟連接。另外，提供者可能將此屬性設定為新的 Connection 物件，以提供存取 Connection 物件以取得延伸的錯誤資訊，或執行其他指令的方法。

如果利用 Open 方法的 ActiveConnection 引數打開 Recordset 物件，ActiveConnection 屬性將承襲該引數的值。

如果將 Recordset 物件的 Source 屬性設為有效的 Command 物件變數，Recordset 的 ActiveConnection 屬性將承襲 Command 物件之 ActiveConnection 屬性的設定值。

Remote Data Service 使用方法 當用在用戶端 (ADOR) Recordset 物件時，這個屬性只能被設為連接字串或 (在 Microsoft Visual Basic 或 VBScript 中) Nothing。


ActualSize 屬性

表示資料欄值的實際長度。

設定和傳回值

傳回一個 Long 值。有些提供者允許設定這項屬性以保留供 BLOB 資料使用的空間。若是如此，預設值便為 0。

附註

利用 ActualSize 屬性來傳回 Field 物件值的實際長度。ActualSize 屬性對於所有的資料欄都是唯讀。如果 ADO 無法決定 Field 物件值的長度，ActualSize 屬性會傳回 adUnknown。

ActualSize 和 DefinedSize 屬性之差異如下列範例所示:具 adVarChar 宣告型態的，且最大長度為 50 字元的 Field 物件，會傳回一個值為 50 的 DefinedSize 屬性，但是它傳回的 ActualSize 屬性值是目前資料錄內資料欄中所儲存資料的長度。


Attributes 屬性

表示物件的一個或多個特性。

設定和傳回值

設定或傳回一個 Long 值。

就 Connection 物件而言，Attributes 屬性是讀/寫，而其值可以是這些 XactAttributeEnum 值的任何一個或多個數值的總和 (預設值為零)。

常數 | 說明
AdXactCommitRetaining | 執行保留性認可 - 亦即，自動呼叫 CommitTrans 會啟動一項新交易。並非所有的提供者都支援這個項目。
AdXactAbortRetaining | 執行保留性中止—亦即，自動呼叫 RollbackTrans 會啟動一項新交易。並非所有的提供者都支援這個項目。

對於 Parameter 物件而言，Attributes 屬性為讀/寫，其值可以是這些 ParameterAttributesEnum 值的一個或多個數值的總和。

常數 | 說明
adParamSigned | 預設值。表示參數接受有正負號的數值。
adParamNullable | 表示參數接受 Null 值。
adParamLong | 表示參數接受長的二位元資料。

對於 Field 物件而言，Attributes 屬性為唯讀，其值可以是這些 FieldAttributeEnum 值的一個或多個數值的總和。

常數 | 說明
AdFldMayDefer | 表示資料欄被延遲 - 亦即，資料欄值未隨同整個資料錄從資料源中被擷取出來，只有在直接存取資料欄值時才會擷取。
AdFldUpdatable | 表示可以寫到資料欄內。
adFldUnknownUpdatable | 表示提供者無法確定您是否能寫入資料欄。
adFldFixed | 表示資料欄中含有固定長度的資料。
adFldIsNullable | 表示資料欄接受 Null 值。
adFldMayBeNull | 表示您可以從資料欄讀取 Null 值。
adFldLong | 表示該資料欄是一個長的二位元欄位。也表示您可以使用 AppendChunk 和 GetChunk 方法。
adFldRowID | 表示資料欄中含有永久性的列識別碼，它無法被寫入，而且除供辨識資料列之外，並不具有意義的值 (例如資料錄號碼，唯一的識別碼等等)。
adFldRowVersion | 表示資料欄含有可用來追蹤資料更新的某種時間和日期戳記。
adFldCacheDeferred | 表示提供者快取資料欄的值，而後續的讀取動作都在快取區完成。

對於 Property 物件而言，Attributes 屬性是唯讀，其值可以是這些 PropertyAttributesEnum 值的一個或多個數值的總和:

常數 | 說明
adPropNotSupported | 表示提供者不支援此項屬性。
adPropRequired | 表示資料源被初始化之前，使用者必須指定此屬性的值。
adPropOptional | 表示資料源被初始化之前，使用者不需要指定此屬性的值。
adPropRead | 表示使用者可以讀取屬性。
adPropWrite | 表示使用者可以設定屬性。

附註

利用 Attributes 屬性即可設定或傳回 Connection 物件、Parameter 物件、Field 物件或 Property 物件的特性。

當您設定多項屬性時，可以將其相對的適當常數加總。如果您將屬性值設為不相容常數的總和，就會發生錯誤。

Remote Data Service 使用方法 用戶端的 Connection 物件不具備這項屬性。


BOF，EOF 屬性

  • BOF 表示目前資料錄的位置在 Recordset 物件的第一筆資料錄之前。

  • EOF 表示目前資料錄的位置在 Recordset 物件的最後一筆資料錄之後。

傳回值

BOF 和 EOF 屬性傳回布林值。

附註

利用 BOF 和 EOF 屬性即可獲知 Recordset 物件是否含有資料錄，或者在資料錄間移動時是否已經超出 Recordset 物件的極限。

如果目前的資料錄位置在第一筆之前，BOF 屬性傳回 True (-1)，而如果目前的資料錄位置在第一筆或第一筆之後，則傳回 False (0)。

如果目前的資料錄位置在最後一筆之後，EOF 屬性傳回 True，而如果目前的資料錄位置在最後一筆或最後一筆之前，則傳回 False。

如果 BOF 或 EOF 屬性為 True，則表示目前無資料錄。

如果您開啟的 Recordset 物件不含資料錄，BOF 和 EOF 屬性將都被設為 True，而且 Recordset 物件的 RecordCount 屬性設定是 0。當您打開的 Recordset 物件至少有一筆資料錄時，第一筆資料錄將是目前的資料錄，而 BOF 和 EOF 屬性都為 False。

如果刪除 Recordset 物件中所剩的最後一筆資料錄，BOF 和 EOF 屬性可能都維持為 False，直到您移動目前資料錄的位置為止。

下表所示為在不同的 BOF 和 EOF 屬性組合下允許哪些 Move 方法。

 | MoveFirst, MoveLast | MovePrevious, Move < 0 | Move 0 | MoveNext, Move > 0
BOF=True, EOF=False | 允許 | 錯誤 | 錯誤 | 允許
BOF=False, EOF=True | 允許 | 允許 | 錯誤 | 錯誤
兩者皆 True | 錯誤 | 錯誤 | 錯誤 | 錯誤
兩者皆 False | 允許 | 允許 | 允許 | 允許

允許的 Move 方法並不保證該方法可以順利找到資料錄;它只表示呼叫指定的 Move 方法不會產生錯誤。

下表所示為在您呼叫各種 Move 方法而無法順利找到資料錄時，BOF 和 EOF 屬性設定的情形。

 | BOF | EOF
MoveFirst，MoveLast | 設為 True | 設為 True
Move 0 | 不變 | 不變
MovePrevious，Move < 0 | 設為 True | 不變
MoveNext，Move > 0 | 不變 | 設為 True


Bookmark 屬性

傳回唯一可以辨識出 Recordset 物件上目前的資料錄的書籤，或將 Recordset 物件上目前的資料錄設定為有效書籤所辨識的資料錄。

設定和傳回值

設定或傳回 Variant 表示式，它的評估結果產生有效的書籤。

附註

利用 Bookmark 屬性即可儲存目前的資料錄的位置，並可以在任何時候回到該資料錄處。書籤只有在支援書籤功能的 Recordset 物件中才能使用。

在開啟 Recordset 物件時，它的每一個資料錄都擁有獨一無二的書籤。若要儲存用於目前的資料錄的書籤，請將 Bookmark 屬性的值指定到一個變數。若要在移到不同資料錄後很快回到該資料錄，可將 Recordset 物件的 Bookmark 屬性設定為該變數值。

使用者也許無法看到書籤的值。同時，使用者也無法預期書籤是否相同，因為參照相同資料錄的兩個書籤的值可能不一樣。

如果使用 Clone 方法複製 Recordset 物件，原始的及複製的 Recordset 物件的 Bookmark 屬性的設定值都相同，且可以交換使用。然而，不同 Recordset 物件的書籤無法交換使用，即使它們是來自相同的來源或指令。

Remote Data Service 使用方法 用在用戶端 (ADOR) Recordset 物件時，都可以使用 Bookmark 屬性。


CacheSize 屬性

表示在本端記憶體快取的 Recordset 物件的資料錄數。

設定和傳回值

設定或傳回必須大於 0 的 Long 值•預設值是 1•

附註

利用 CacheSize 屬性即可控制提供者保存在它的緩衝區的資料錄數量，以及一次可以擷取多少資料錄數量到本端記憶體•例如，如果 CacheSize 是 10，在第一次打開 Recordset 物件後，提供者會擷取前 10 筆資料錄到本端記憶體•隨著您在 Recordset 物件中移動，提供者會從本端記憶體緩衝區傳回資料•一旦通過快取區的最後一筆資料錄，提供者就會將下 10 筆資料錄從資料源擷取到快取區•

這項屬性的值可以在 Recordset 物件運作期間被調整，但是這項調整只會影響接下來從資料源擷取後在快取區中的資料錄數•單獨變更屬性值不會改變快取區目前的內容•

如果要擷取的資料錄數少於 CacheSize 所指定的，提供者將傳回剩餘的資料錄；但不會有錯誤產生•

CacheSize 設定值不可為 0，否則將傳回錯誤•

從快取區擷取的資料錄不會同時反映其他使用者對資料源所做的改變•若要強制更新所有的快取資料，請使用 Resync 方法•


CommandText 屬性

包含您想要發給提供者的指令的文字•

設定和傳回值

設定或傳回一個含有提供者指令的 String 值，例如 SQL 陳述式、資料表名稱或預存程序•預設值是 "" (長度是零的字串)•

附註

利用 CommandText 屬性即可設定或傳回 Command 物件的文字•通常是一個 SQL 陳述式，也可能是提供者能辨識的其他類型的指令陳述式，例如預存程序•SQL 陳述式必須是提供者查詢處理器所支援的特定對話或版本•

如果 Command 物件的 Prepared 屬性被設定為 True，而且在您設定 CommandText 屬性時，Command 物件被連到一個開放式的連接時，ADO 會在您呼叫 Execute 或 Open 方法時，準備查詢 (亦即，提供者將儲存編譯後的查詢)•

ADO 可能會根據 CommandType 屬性的設定值改變 CommandText 屬性•您可以隨時讀取 CommandText 屬性來查看執行時 ADO 會真正使用的指令•


CommandTimeout 屬性

表示在執行指令過程中，於中止指令及產生錯誤之前，必須等待多久時間•

設定和傳回值

設定或傳回一個 Long 值，它以秒表示須等待多久才執行指令•預設值是 30•

附註

利用 Connection 物件或 Command 物件的 CommandTimeout 屬性，即可因網路流量大或伺服器忙碌而取消 Execute 方法•如果在指令執行完成之前已過了 CommandTimeout 屬性所設定的間隔時間，便會發生錯誤，而且 ADO 會取消指令•如果您將屬性設為 0，ADO 將無限期地等待，直到執行完成為止•請確定您正為其寫程式碼的提供者與資料源支援 CommandTimeout 功能•

Connection 物件上的 CommandTimeout 設定值不影響同一 Connection 上的 Command 物件的 CommandTimeout 設定值；亦即，Command 物件的 CommandTimeout 屬性值不會承襲 Connection 物件的 CommandTimeout 值•

在 Connection 物件上，CommandTimeout 屬性在開啟 Connection 之後仍為讀/寫•


CommandType 屬性

表示 Command 物件的型態•

設定和傳回值

設定或傳回下列其中一個 CommandTypeEnum 值•

常數 | 說明
adCmdText | 將 CommandText 視為指令的文字定義或預存程式•
adCmdTable | 將 CommandText 視為資料表名稱，其資料行由內部產生之 SQL 查詢所傳回•
adCmdTableDirect | 將 CommandText 視為資料表名稱，其資料行全部被傳回•
adCmdStoredProc | 將 CommandText 視為預存程序•
AdCmdUnknown | 預設值•未知的 CommandText 屬性的指令型態•
AdCmdFile | 將 CommandText 視為永久性 Recordset 的檔案名稱•
AdExecuteNoRecords | 表示 CommandText 是不傳回資料列的指令或預存程序 (例如只插入資料的指令)•若擷取到任何資料列，它們將被放棄而不被傳回•它經常和 adCmdText 或 adCmdStoredProc 連合使用•

附註

利用 CommandType 屬性即可使 CommandText 屬性的評估結果最佳化•

如果 CommandType 屬性值等於 adCmdUnknown (預設值)，您可能會發現效能降低，因為 ADO 必須呼叫提供者來決定 CommandText 屬性是 SQL 陳述式、預存程序或資料表名稱•如果您知道正使用何種指令型態，設定 CommandType 屬性以指示 ADO 直接移到相關的程式碼•如果 CommandType 屬性與 CommandText 屬性的指令型態不符，在您呼叫 Execute 方法時會發生錯誤•

adExecuteNoRecords 常數藉由將內部處理程序減到最少而改善效能•這個常數不單獨使用；它經常和 adCmdText 或 adCmdStoredProc 一起使用(例如 adCmdText+adExecuteNoRecords)•如果 adExecuteNoRecords 和 Recordset.Open 方法一起使用，或者該方法使用 Command 物件都將產生錯誤•


Connect 屬性 (RDS)

設定或傳回用來執行查詢與更新動作的資料庫名稱•

您可以將 Connect 屬性設定在 RDS.DataControl 物件的 OBJECT 附加文字中的設計階段，或在 scripting 碼中的執行期 (例如，VBScript)•

語法

設計階段: <PARAM NAME="Connect" VALUE="DSN=DSNName;UID=usr;PWD=pw;">

執行期: DataControl.Connect = "DSN=DSNName;UID=usr;PWD=pw;"

參數

DSNName 為一 String，指定能辨識特定資料庫的系統資料源名稱•

usr 為一 String，代表伺服器上正確的使用者•

pw 為一 String，代表使用者帳號的正確密碼•

DataControl 物件變數 代表 RDS.DataControl 物件•


ConnectionString 屬性

包含可用來建立資料源連接的資訊•

設定和傳回值

設定或傳回一個 String 值•

附註

利用 ConnectionString 屬性即可藉由傳遞內含一串以分號隔開的 argument = value 陳述式的詳細連接字串，來指定資料源•

ADO 支援 4 個用於 ConnectionString 屬性的引數；其他引數不經過 ADO 處理，直接傳遞給提供者•ADO 所支援的引數如下；

引數 | 說明
Provider= | 指定用來連接的提供者名稱•
File Name= | 指定內含預設的連接資訊的提供者特定檔案名稱 (例如，永久性資料源物件)•
Remote Provider= | 指定開啟用戶端連接時所使用的提供者名稱•(只適用於 Remote Data Service•)
Remote Server= | 指定開啟用戶端連接時所使用的伺服器路徑名稱•(只適用於 Remote Data Service•)

在您設定 ConnectionString 屬性並開啟 Connection 物件之後，提供者可能會變更屬性內容，例如，將 ADO 定義的引數名稱映射到其提供者對應的名稱•

ConnectionString 屬性會自動承接 Open 方法的 ConnectionString 引數所使用的值，因此在呼叫 Open 方法過程中，您可以改寫目前的 ConnectionString 屬性•

因為 File Name 引數會讓 ADO 載入相關的提供者，因此您無法同時傳遞 Provider 和 File Name 引數•

當連接關閉時，ConnectionString 屬性是讀/寫，而在開啟時是唯讀•

Remote Data Service 使用方法 當用在用戶端的 Connection 物件時，ConnectionString 屬性只包括 Remote Provider 和 Remote Server 參數•


ConnectionTimeout 屬性

表示在建立連接時，並於中止作業並產生錯誤之前，須等待多久時間•

設定和傳回值

設定或傳回一個以秒數表示等待連接開啟的時間的 Long 值•預設值是 15•

附註

利用 Connection 物件的 ConnectionTimeout 屬性即可知道是否有必要因網路流量大或伺服器忙碌所造成的延遲，而放棄連接•如果過了 ConnectionTimeout 屬性的設定時間而未開啟連結，將會產生錯誤，而且 ADO 會取消連接•若將屬性設為 0，ADO 會無限期等待，直到連接開啟為止•請先確定您正為其寫程式碼的提供者支援 ConnectionTimeout 功能•

當連接關閉時，ConnectionTimeout 屬性是讀/寫，而開啟時是唯讀•


Count 屬性

表示集合物件中的物件數•

傳回值

傳回一個 Long 值•

附註

利用 Count 屬性即可得知指定的集合物件中有多少物件•

由於集合物件的編號以 0 開始算起，程式迴圈通常須從零開始，而以 Count 屬性的值減 1 結束•如果您正在使用 Microsoft (R) Visual Basic (R)，而且希望能在不核對 Count 屬性下計算集合物件內的物件數，便可使用 For Each...Next 指令•

如果 Count 屬性是 0，表示集合物件內沒有物件•


CursorLocation 屬性

設定或傳回資料指標服務的位置•

設定和傳回值

設定或傳回一個可設定為下列其中一個常數的 Long 值•

常數 | 說明
AdUseNone | 未使用資料指標服務•(這個常數已廢止，在此出現是供往後追溯相容性之用•)
AdUseClient | 使用本端資料指標程式庫所提供的用戶端資料指標•本端資料指標服務通常具備多項驅動程式之資料指標所沒有的功能，因此，就可以啟動的功能而言，使用這個設定值有其優點•對於往後追溯相容性，同義字的 adUseClientBatch 也受支援•
adUseServer | 預設值•使用資料提供者或驅動程式提供者所提供的資料指標•這些指標有時候具有很大的彈性，可容許他人對資料源所做的變更•然而，Microsoft Client Cursor Provider (例如不相關的 Recordset) 的某些功能，無法用伺服端的資料指標來模擬，因而在這個設定值下不能使用這些功能•

附註

這個屬性允許您在提供者可存取的各種資料指標程式庫之間作選擇•通常您可以選擇用戶端資料指標程式庫，或伺服器上的資料指標程式庫。

這個屬性設定只有在屬性被設定後才會影響所建立的連接•變更 CursorLocation 屬性不會影響既有的連接•

在 Connection 或已關閉的 Recordset 上，這項屬性是讀/寫，而在開啟的 Recordset 上是唯讀•

由 Execute 方法所傳回的指標會承接這個設定值•Recordsets 將會自動從相關連接承接這個設定值•

Remote Data Service 使用方法 當用在用戶端的 (ADOR) Recordset 或 Connection 物件時，CursorLocation 屬性只能設定為 adUseClient•


CursorType 屬性

表示 Recordset 物件所使用的資料指標型態•

設定和傳回值

設定或傳回下列其中一個 CursorTypeEnum 值•

常數 | 說明
AdOpenForwardOnly | 順向資料指標•是預設值•除了只能往資料錄前端捲動之外，其他都和靜態資料指標一樣•當您必須在 Recordset 內作單向移動時，運用這個常可以增加效能•
AdOpenKeyset | 索引鍵集 (Keyset) 資料指標•除了無法看到其他使用者增加的資料錄以外，和動態資料指標是一樣的。從您的 Recordset 無法存取其他使用者刪除的資料錄，但是仍然可以看到其他使用者變更的資料錄•
AdOpenDynamic | 動態資料指標•可看到其他使用者所做的增加，變更和刪除結果，而且允許在 Recordset 進行所有型態的動作，但書籤例外，如果提供者不支援的話•
AdOpenStatic | 靜態資料指標•一組可讓您用來找尋資料或產生報表的資料錄的靜態複本•但看不到其他使用者所做的增加、變更或刪除結果•

附註

利用 CursorType 屬性即可指定在開啟 Recordset 物件時應使用的資料指標型態•當 Recordset 關閉時，CursorType 屬性是讀/寫，開啟時則是唯讀•

如果 CursorLocation 屬性被設為 adUseClient，則只有 adUseStatic 的設定值被支援•如果所設定的值不被支援，將產生錯誤；代而使用最接近且被支援的 CursorType•

如果提供者不支援所要求的資料指標型態，提供者可能傳回其他資料指標型態•開啟 Recordset 物件時，CursorType 屬性將改變以符合實際使用的資料指標型態•若要確認所傳回的資料指標的特定功能，可使用 Supports 方法•在關閉 Recordset 之後，CursorType 屬性會回復到其原來的設定值•

下表顯示每一種資料指標形態所需要的提供者功能(使用 Supports 方法的常數來辨識)•

此 CursorType 的 Recordset | Supports 方法必須對這些常數都傳回 True
adOpenForwardOnly | 無
adOpenKeyset | adBookmark, adHoldRecords, adMovePrevious, adResync
adOpenDynamic | AdMovePrevious
adOpenStatic | adBookmark, adHoldRecords, adMovePrevious, adResync

註解 就動態或順向資料指標而言，雖然 Supports(adUpdateBatch) 可能為 true，但對於批次更新，您必須使用索引鍵集 (keyset) 或靜態資料指標•將 LockType 屬性設定為 adLockBatchOptimistic，將 CursorLocation 屬性設定為 adUseClient，即可啟用對 OLE DB 的指標服務，批次更新時須用到它•

Remote Data Service 使用方法 當用在用戶端 (ADOR) 的 Recordset 物件時，CursorType 屬性只能設定為 adOpenStatic。


DataMember 屬性

指定資料成員的名稱，從 DataSource 屬性參照的物件處取得。

設定和傳回值

設定或傳回 String 值。名稱不區分大小寫。

備註

此屬性是用於在資料環境建立資料連結控制。資料環境會維護資料的集合物件 (資料來源)，其包含會被表示成 Recordset 物件的已命名物件 (資料成員)。

DataMember 和 DataSource 屬性必須合併使用。

DataMember 屬性決定哪些由DataSource 屬性指定的物件，會被表示成 Recordset 物件。Recordset 物件必須在設定此屬性設定之前，就先關閉。若 DataMember 屬性未在DataSource 之前設定，或者在 DataSource 屬性內指定的物件無法識別 DataMember 名稱，就會產生錯誤。

如需詳細資訊，請參閱 Data Access SDK 的 Control Writer 小節。

用法

Dim rs as New ADODB.Recordset
rs.DataMember = "Command"        'Name of the rowset to bind to
Set rs.DataSource = myDE        'Name of the object containing an IRowset


DataSource 屬性

指定包含哪一個物件要被表示成 Recordset 物件。

備註

此屬性是用於在資料環境建立資料結合控制項。資料環境會維護資料的集合物件 (資料來源)，其包含會被表示成 Recordset 物件的已命名物件 (資料成員)。

DataMember 和 DataSource 屬性必須合併使用。

參照的物件必須建置 IDataSource 介面，而且必須包含 IRowset 介面。

如需詳細資訊，請參閱 Data Access SDK 的 Control Writer 小節。

用法

Dim rs as New ADODB.Recordset
rs.DataMember = "Command"        'Name of the rowset to bind to
Set rs.DataSource = myDE        'Name of the object containing an IRowset


DefaultDatabase 屬性

指示 Connection 物件的預設資料庫。

設定和傳回值

設定或傳回 String，可計算提供者能給予的資料庫名稱。

備註

使用 DefaultDatabase 屬性來設定或傳回特定 Connection 物件的相關預設資料庫名稱。

如果有一個預設資料庫，則 SQL 字串可能會使用不正確的語法來存取該資料庫的物件。要存取資料庫內的物件而不是存取指定在 DefaultDatabase 屬性內的物件，您必須指定正確的物件名稱和希望的資料庫名稱。在連線時，提供者會將預設的資料庫資訊寫入DefaultDatabase 屬性。部份提供者只允許每一個連線有一個資料庫，這種情況下您無法變更DefaultDatabase 屬性。

部份資料來源和提供者可能不支援此特性，而且可能會傳回錯誤或清空字串。

Remote Data Service 此屬性不適用於用戶端 Connection 物件。


DefinedSize 屬性

指示Field物件的定義大小。

傳回值

傳回 Long 值，將欄位的定義大小反映成位元組。

備註

使用 DefinedSize屬性來判斷 Field 物件的資料容量。

DefinedSize 和 ActualSize 屬性是不相同的。例如，假設Field 物件的宣告類型是adVarChar，DefinedSize屬性值為50，其包含單一字元。ActualSize 屬性傳回的值為單一字元的長度 (以位元組計算)。


Description 屬性

說明 Error 物件。

傳回值

傳回 String 值。

備註

使用 Description屬性來取得錯誤的簡短說明。顯示此屬性來警告使用者您無法或不想處理的錯誤。字串是來自ADO 或提供者。

提供者負責將特定錯誤內文傳送到ADO。ADO 會在收到的提供者錯誤或警告時，會將Error 物件傳送到Errors 集合物件。請例舉 Errors集合物件來追蹤提供者傳送的錯誤。


Direction 屬性

指示Parameter 是否表示輸入參數、輸出參數或兩者。或者參照是否為某個 stored procedure 的傳回值。

設定和傳回值

設定或傳回下列其中一個 ParameterDirectionEnum 值。

常數 | 說明
adParamUnknown | 指示參數用向不詳。
adParamInput | 預設值。指示輸入參數。
adParamOutput | 指示輸出參數。
adParamInputOutput | 同時指示輸出和輸入參數。
adParamReturnValue | 指示傳回值。

備註

使用Direction 屬性來指定參數如何傳送到程序或從程序傳送出來。Direction屬性為讀取/寫入；這樣可以讓您使用那些無法傳回此資訊的提供者，或者當您不想讓ADO額外呼叫提供者來取得參數資訊時，就可以設定此資訊。

並非全部的提供者都可以判斷在其預存程序中的參數用向。在這些情況下，您必須先設定 Direction屬性，然後再執行查詢。


EditMode 屬性

指示目前記錄的編輯狀態。

傳回值

傳回下列其中一個 EditModeEnum 值。

常數 | 說明
adEditNone | 指示目前沒有任何編輯作業進行中。
adEditInProgress | 指示已經修改目前記錄內的資料，但是尚未儲存。
adEditAdd | 指示已經呼叫AddNew 方法，而且複製緩衝區內的目前記錄，是尚未儲存到資料庫的新記錄。
adEditDelete | 指示已經刪除目前的記錄。

備註

ADO會維護一個與目前記錄相關的編輯緩衝區。此屬性會指示所做的變更是否儲存到此緩衝區中，或者是否建立新的記錄。請使用 EditMode 屬性來判斷目前記錄的編輯狀態。如果編輯過程已經被中斷，則您可以測試等候處理的變更。而且您可以判斷是否需要使用Update 或 CancelUpdate 方法。

如需不同編輯條件下，詳細的 EditMode說明，請參閱 AddNew方法。


ExecuteOptions 屬性 (RDS)

ExecuteOptions 屬性

指示是否啟動非同步執行。

設定值與傳回值

設定或傳回下列其中之一的值。

常數 | 說明
adcExecSync | 執行同步執行下一個Recordset重新整理。
adcExecAsync | 預設值。非同步執行下一個 Recordset重新整理。

注意 每一個使用這些常數的用戶端執行檔必須提供它們的宣告。您可以從 C:\Program Files\System\MSADC資料夾的 Adcvbs.inc 檔案，剪下和貼上您想要的常數宣告。

備註

若 ExecuteOptions 設成adcExecAsync，則這樣會非同步在 RDS.DataControl物件的Recordset上執行下一個 Refresh呼叫。

當其它非同步作業正在執行中，而且可能會變更 RDS.DataControl物件的Recordset，若此時嘗試呼叫Reset、Refresh、SubmitChanges、 CancelUpdate 或Recordset，則會發生錯誤。

若在非同步作業中發生錯誤，RDS.DataControl 物件的 ReadyState 值會從 adcReadyStateLoaded 變成adcReadyStateComplete，而 Recordset 屬性則不會保留任何值。


FetchOptions 屬性 (RDS)

表示非同步取得的類型。

設定值與傳回值

設定或傳回是下列任何值之一。

常數 | 說明
adcFetchUpFront | Recordset 全部的記錄是在控制項傳回到應用程式之前，先行取得的。完整的 Recordset 是在應用程式被允許執行任何相關事項之前，先行取得的。
adcFetchBackground | 當取得第一批的記錄後，控制項可以立即傳回到應用。後續想存取第一批未擷取之記錄的 Recordset讀取動作，會延後至真正取得希望之記錄後，才開始執行，到時候控制項會傳回到應用程式。
adcFetchAsync | 預設值。在背景取得記錄時，控制項會立即傳回到應用程式。若應用程式嘗試讀取尚未取得的記錄，則會讀取最接近希望的記錄，而控制項會立即指示已經到達 Recordset 目前的結尾。例如，就算更多的記錄會繼續填入Recordset，但是 MoveLast 呼叫仍會將目前的記錄位置移至最後實際取得的記錄。

注意 每一個使用這些常數的用戶端執行檔必須提供它們的宣告。您可以從 C:\Program Files\System\MSADC資料夾的 Adcvbs.inc 檔案，剪下和貼上您想要的常數宣告。

備註

在 Web應用程式中，您經常會想使用 adcFetchAsync (預設值)，原因在於它提供更佳的效能。在編譯的用戶端應用程式中，您經常會想使用 adcFetchBackground。


Filter 屬性

指定Recordset內資料的過濾器。

設定值和傳回值

設定或傳回 Variant 值，它可以包含下列其中之一：

  • 準則字串 — 由一或多個個別子句，並且用 AND或 OR運算子所組成的字串。

  • 書籤陣列 — 指向 Recordset 物件內記錄的唯一書籤值陣列。

  • 下列 FilterGroupEnum 值其中一個。
    常數 | 說明
    adFilterNone | 移除目前的過濾器以及回復所有記錄來檢視。
    adFilterPendingRecords | 允許您只檢視已經變更，但尚未傳送到伺服器的記錄。只適用於批次更新模式。
    adFilterAffectedRecords | 允許您只檢視上次 Delete, Resync、UpdateBatch，或CancelBatch呼叫所影響的記錄。
    adFilterFetchedRecords | 允許您檢視目前快取記憶體內的記錄 -- 也就是指上次呼叫時，所取得資料庫記錄的結果。
    adFilterConflictingRecords | 允許您檢視造成上次批次更新失敗的記錄。

備註

請使用 Filter 屬性來選擇性過濾 Recordset 物件的記錄。過濾的Recordset 會變成目前的指標。這樣會影響其它屬性，例如AbsolutePosition、AbsolutePage、RecordCount，以及哪些以目前指標為基礎而傳回數值的 PageCount，原因在於將 Filter 屬性設定成特定的值，會將目前的記錄移至最新值的第一筆記錄。

準則是由子句組成的，格式為 FieldName-Operator-Value (例如， "LastName = 'Smith'")。您可以使用AND結合個別的子句 (例如，"LastName = 'Smith' AND FirstName = 'John'") 或 OR (例如，"LastName = 'Smith' OR LastName = 'Jones'")，就可以建立複合子句。請將下列綱領應用於準則字串:

  • FieldName必須是 Recordset 的有效欄位名稱。若欄位名稱包括空白，您必須將名稱括在方括號內。

  • Operator必須是下列其中之一：<、>、<=、>=、<>、=，或LIKE。

  • Value是您會用於比較欄位的值，例如 'Smith'、#8/24/95#、12.345或 $50.00)。請在字串使用單引號而在日期加上井字號 (#)。至於數字方面，您可以使用小數點、錢號，以及科學記號。若Operator 為LIKE，Value可以是萬用字元。只允許使用星號 (*) 和百分比符號 (%) 萬用字元，而且它們必須是字串內最後的字元。Value不可以為Null (空值)。

  • AND 和 OR 之間沒有先行計算。子句可以放在括弧內。不過您不可以使用 OR 將子句組成群組，然後使用 AND 將該群組與其它群組一起結合，例如：
    (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'

  •
您反而應該按照下列方式，設定此過濾器的結構
    (LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')

    •

  •
在 LIKE字句中，您可以在樣式的開頭結尾使用萬用字元 (例如 LastName Like '*mit*')，或者只在樣式的結尾使用萬用字元 (例如，LastName Like 'Smit*')。
    •

過濾器常數可以讓您檢視上次 UpdateBatch 方法呼叫時影響到的記錄，方便您解決批次更新模式下，個別的記錄衝突。

設定 Filter屬性本身可能會失敗，原因在於與相依資料的衝突 (例如已經被其它使用者刪除的記錄)；在這種狀況下，提供者會傳回警告至 Errors集合物件，但是不會停止程式的執行。執行時間 (run-time) 錯誤只會在所有要求之記錄都產生衝突的時候才會發生。請使用 Status 屬性來尋找衝突的記錄。

將 Filter屬性設定成0長度字串 ("") 與使用 adFilterNone常數，作用是相同的。

任何時候設定 Filter屬性的時候，目前的記錄位置會移至Recordset內過濾之記錄子集合物件的第一筆記錄。同樣地，清除 Filter屬性的時候，目前的記錄會移至 Recordset 的第一筆記錄。

如需建立陣列來使用Filter屬性時可以使用的書籤值說明，請參閱Bookmark屬性。


FilterColumn 屬性 (RDS)

表示用於計算過濾器準則的欄位。

語法

DataControl.FilterColumn = String

參數

DataControl 一種表示 RDS.DataControl 物件的物件變數。

String String值會指定用於計算過濾器準則的欄位。過濾器準則是在 FilterCriterion 屬性內指定的。

備註

SortColumn、SortDirection、FilterValue、FilterCriterion，以及 FilterColumn 屬性提供用戶端快取記憶體的排序和過濾功能。排序功能會依照欄位的值排列記錄。過濾功能會顯示那些以尋找準則為基礎的記錄子集合物件，而完整的 Recordset則是在快取記憶體內維護的。Reset方法會執行準則，然後目前的 Recordset 取代成更新的 Recordset。


FilterCriterion 屬性 (RDS)

設定或傳回用於過濾器值內的計算運算子。

語法

DataControl.FilterCriterion = String

參數

DataControl 一種表示 RDS.DataControl 物件的物件變數。

String String值可以指定記錄的FilterValue 運算子。它可以是下列任何其中一個：<、<=、>、>=、= 或 <>。

備註

SortColumn、SortDirection、FilterValue、FilterCriterion以及 FilterColumn 屬性提供用戶端快取記憶體的排序和過濾功能。排序功能會依照欄位的值排列記錄。過濾功能會顯示那些以尋找準則為基礎的記錄子集合物件，而完整的 Recordset則是在快取記憶體內維護的。Reset方法會執行準則，然後目前的 Recordset 取代成更新的 Recordset。

"!=" 運算子不適用於 FilterCriterion；您應該使用 "<>"。

如果同時設定過濾器和排序屬性，而且您呼叫 Reset方法，則會先過濾列集合物件，然後再進行排序。至於昇冪排序方面，NULL會放在最前面；至於降冪排序方面，NULL 則會放在最下面 (昇冪為預設的作業方式)。


FilterValue 屬性 (RDS)

設定或傳回用於過濾記錄的值。

語法

DataControl.FilterValue = String

參數

DataControl 一種表示 RDS.DataControl 物件的物件變數。

String String值，表示要用於過濾記錄的資料值 (例如， 'Programmer' 或 125)。

備註

SortColumn、SortDirection、FilterValue、FilterCriterion，以及 FilterColumn 屬性提供用戶端快取記憶體的排序和過濾功能。排序功能會依照欄位的值排列記錄。過濾功能會顯示那些以尋找準則為基礎的記錄子集合物件，而完整的 Recordset則是在快取記憶體內維護的。Reset方法會執行準則，然後目前的 Recordset 取代成更新的 Recordset。

空值會造成類型不符的錯誤。


Handler屬性 (RDS)

設定或傳回包含伺服器端程式 (處理常式) 名稱的字串 (該程式可擴充 RDSServer.DataFactory的功能)，以及處理常式使用的任何參數 (全部以逗點 "," 分開)。

語法

DataControl.Handler = String

參數

DataControl 一種表示 RDS.DataControl 物件的物件變數。

String String值，包含處理常式名稱和任何參數 (全部以逗點分開，例如 "handlerName,parm1,parm2,...,parmN")。

備註

此屬性支援的功能稱為自訂。自訂的支援需要將CursorLocation屬性設定成adUseClient。

處理常式的名稱和它的參數，如果有的話會以逗點 (",") 分開。若String內任何地方顯示分號 (";")，就會產生無法預測的作業方式。您可以撰寫自己處理常數，但是它一定要支援 IDataFactoryHandler介面。

預設的處理常式為 MSDFMAP.Handler，而它的預設參數是一個叫做 MSDFMAP.INI的自訂檔。請使用此屬性來呼叫由您伺服器管理員建立的替用自訂檔。

另一種設定 Handler屬性的方法就是在 ConnectionString屬性內設定處理常式和參數；也就是 "Handler=handlerName,parm1,parm2,...;"。


HelpContext、HelpFile 屬性

表示與 Error 物件有關的說明檔案與主題。

傳回值

  • HelpContextID — 針對說明檔案中的主題，傳回主題說明代號，當做長整數值。

  • HelpFile — 傳回指向說明檔案完整路徑的字串。

備註

如果在 HelpFile 屬性中指定說明檔，HelpContext 屬性適用於自動顯示辨識出的說明主題。如果沒有相關的主題，HelpContext 屬性會傳回零，且 HelpFile 屬性會傳回零長度的字串 ("")。


Index 屬性

表示目前受 Recordset 物件影響的索引名稱。

設定值與傳回值

設定或傳回索引名稱的字串值。

備註

由 Index 屬性所命名的索引必須先在為 Recordset 物件基礎的基本資料表上宣告。也就是索引必須被當作 ADOX 索引 物件被宣告，或是在建立基本資料表時宣告。

如果沒有設定索引會發生執行期間錯誤。而 Index 屬性無法在 WillRecordsetChange 或 RecordsetChangeComplete 事件處理常式中被設定。也無法在 Recordset 仍然執行作業時被設定。如果關閉 Recordset 可以成功設定 Index 屬性，但是 Recordset 將無法成功開啟，如果提供者不支援索引，則索引會無效。

如果可以設定索引，則目前資料列可以變更。這將會造成對 AbsolutePosition 屬性的更新，及 WillRecordsetChange、RecordsetChangeComplete、WillMove、與 MoveComplete 事件的產生。

如果可以設定索引且 LockType 屬性是 adLockPessimistic 或 adLockOptimistic，則會執行 UpdateBatch 作業，發佈目前與受影響的群組。任何現有的 filter 會被發佈，且目前資料列的位置會變更為重新排列過的 Recordset 其第一列。

Index 屬性用於搭配 Seek 方法。如果提供者不支援 Index 屬性搭配 Seek 方法，請考慮使用 Find 方法代替。先確認 Recordset 物件是否支援索引搭配 Supports (adIndex) 方法。

內建的 Index 屬性尚未發佈到動態 Optimize 屬性，雖然它們都處理索引。


InternetTimeout 屬性 (RDS)

指示在要求逾時之前的毫秒數目。

設定和傳回值

設定或傳回 Long 數值。

備註

此屬性只適用於透過HTTP或HTTPS通訊協定傳送的要求。

在第 3 階層環境的要求可以花數分鐘時間來執行。請使用此屬性來指定長期執行要求的額外時間。


IsolationLevel 屬性

指示 Connection 物件的隔離層次。

設定和傳回值

設定或傳回下列其中一個 IsolationLevelEnum 值。

常數 | 說明
adXactUnspecified | 指示提供者不是使用指定的IsolationLevel，但是無法判斷該層次。
adXactChaos | 預設值。指示您無法從更高隔離交易覆寫擱置中的變更。
adXactBrowse | 指示您可以從某個交易檢視其它交易未認可的變更。
adXactReadUncommitted | 與 adXactBrowse 相同。
adXactCursorStability | 預設值。指示您只可以從某個交易檢視其它交易已經認可的變更。
adXactReadCommitted | 與 adXactCursorStability 相同。
adXactRepeatableRead | 指示您無法從某個交易看到其它交易的變更，但是該查詢可以得到新的記錄集合物件。
adXactIsolated | 指示交易是在與其它交易隔離的狀況下進行。
adXactSerializable | 與 adXactIsolated 相同。

備註

請使用 IsolationLevel屬性來設定 Connection物件的隔離層次。IsolationLevel屬性是讀/寫。設定只會在下次您呼叫BeginTrans 方法時才會生效。若您要求的隔離層次無法使用，提供者可能會傳回下一個更高的隔離層次。

Remote Data Service 用法 當用於用戶端 Connection 物件時，IsolationLevel屬性可以只設定成adXactUnspecified。

因為使用者會在用戶端快取記憶體處理中斷的 Recordset物件，所以就會有多個使用者的問題。例如，當兩個不同的使用者試著更新相同的記錄，Remote Data Service 只會允許第一個更新記錄的使用者。第二個使用者的更新要求則會失敗並產生錯誤。


LockType 屬性

指示編輯時設定在記錄的鎖定類型。

設定和傳回值

設定或傳回下列其中一個 LockTypeEnum 值。

常數 | 說明
adLockReadOnly | 預設值。唯讀 -- 您無法變更資料。
adLockPessimistic | 悲觀性鎖定，一個記錄接著另一個記錄 -- 提供者執行必要的動作來確定記錄的成功編輯，通常會在編輯時立即在資料來源鎖定記錄。
adLockOptimistic | 悲觀性鎖定，一個記錄接著另一個記錄 -- 提供者使用悲觀性鎖定，只在您呼叫 Update 方法時才鎖定。
adLockBatchOptimistic | 悲觀性批次更新 -- 批次更新模式時需要，與立即更新模式相反。

備註

在開啟 Recordset 之前設定 LockType 屬性，以便指定提供者在開啟時要使用哪一種鎖定類型。讀取屬性來傳回在開啟中 Recordset 物件使用的鎖定類型。當 Recordset 關閉時，LockType 屬性為讀/寫，而在它開啟時則為唯讀。

提供者可能不支援所有的鎖定類型。若提供者不支援要求的 LockType 設定，它會替換其它的鎖定類型。要判斷 Recordset 實際可以使用的鎖定類型，請使用Supports 方法加上adUpdate 以及 adUpdateBatch。

若 CursorLocation 屬性設定成adUseClient，則 adLockPessimistic 會設定成adUseClient。若設定了未支援的值，則不會發生任何錯誤；反而會使用最接近且支援的 LockType。

Remote Data Service 用法 當用於用戶端 (ADOR) Recordset 物件時，LockType 屬性只能設定成 adLockOptimisticBatch。


MarshalOptions 屬性

指示哪些記錄要存回伺服器。

設定和傳回值

設定或傳回 Long 數值，可以是下列其中一個常數。

常數 | 說明
adMarshalAll | 預設值。指示所有的列要傳回到伺服器。
adMarshalModifiedOnly | 指示只有修改的列才傳回伺服器。

備註

使用用戶端 (ADOR) Recordset 時，已經在用戶端修改的記錄會透過一種稱為 marshaling 的技術，寫入中間階層或 Web 伺服器。Marshaling 是指包裝與傳送介面方法參數到各執行緒或過程範圍。設定 MarshalOptions 屬性可以改進配置修改的遠端資料，以便回頭更新中間階層或 Web 伺服器時的效能。

Remote Data Service 用法 此屬性只用於用戶端 (ADOR) Recordset。


MaxRecords 屬性

指示從查詢傳回到Recordset 的記錄數目上限。

設定和傳回值

設定或傳回 Long 值。預設值為 0 (沒有限制)。

備註

使用 MaxRecords 屬性來限制提供者從資料來源傳回的記錄數目。此屬性的預設值為 0，表示提供者會傳回所有要求的記錄。當 Recordset 關閉時，MaxRecords 內容為讀/寫，但是在開啟時則為唯讀。


Mode 屬性

指示在修改 Connection 內資料可用的許可權。

設定和傳回值

設定或傳回下列其中一個 ConnectModeEnum 值。

常數 | 說明
adModeUnknown | 預設值。指示尚未設定許可權或者無法判斷。
adModeRead | 指示唯讀許可權。
adModeWrite | 指示唯寫許可權。
adModeReadWrite | 指示讀/寫許可權。
adModeShareDenyRead | 禁止其他人使用讀取許可權開啟連線。
adModeShareDenyWrite | 禁止其他人使用寫入許可權開啟連線。
adModeShareExclusive | 禁止其他人開啟連線。
adModeShareDenyNone | 禁止其他人使用任何許可權開啟連線。

備註

請使用 Mode 屬性來設定或傳回在目前連線中，提供者使用的存取許可權。當 Connection 物件關閉時，您只能設定 Mode 屬性。

Remote Data Service 用法 用在用戶端 Connection 物件時，Mode 屬性只能設定成 adModeUnknown。


Name 屬性

指示物件的名稱。

設定和傳回值

設定或傳回 String 值。在 Command 或 Parameter 物件上，值為讀/寫，而在 Property 或 Field 物件上，值為誰讀。

備註

請使用 Name 屬性來指定 Command、Field、Parameter 或 Property 物件的名稱或取得它們的名稱。

至於尚未附加至 Parameters 集合物件的 Parameter 物件方面，Name 屬性是讀/寫。至於已附加的 Parameter 物件和其它所有物件方面，Name 屬性為唯讀。在集合物件內名稱可以重複。

您可以利用序數參照來擷取物件的 Name 屬性，之後您可以直接透過名稱參照物件。例如，如果 rstMain.Properties(20).Name 的結果為 Updatability，接下來就可以將此屬性參照為 rstMain.Properties("Updatability")。


NativeError 屬性

指示提供者特定錯誤碼給指定的 Error 物件。

傳回值

傳回 Long 數值。

備註

請使用 NativeError 屬性來取得特殊 Error 物件的資料庫特定錯誤資訊。例如，使用Microsoft(R) ODBC Provider for OLE DB 加 Microsoft(R) SQL Server(R) 時，從 SQL Server 產生的原始錯誤碼，會透過 ODBC 和 ODBC Provider 傳送到 ADO NativeError 屬性。


Number 屬性

Number Property

指示唯一用於識別 Error 物件的號碼。

傳回值

傳回 Long 值。

備註

請使用 Number 屬性來判斷發生的錯誤。屬性的值是對映至錯誤狀況的唯一號碼。


NumericScale 屬性

指示 Parameter 或 Field 物件內，數值的範圍。

設定和傳回值

設定或傳回 Byte 數值，指示要求出數值的小數位數。

備註

請使用 NumericScale 屬性來判斷小數點右邊的位數，用以表示數值 Parameter 或 Field 物件的值。

至於 Parameter 物件方面，NumericScale 屬性是讀/寫。至於 Field 物件方面， NumericScale 屬性為唯讀。


Optimize 屬性 (RDS)

表示在此資料欄中是否該建立索引功能。

設定和傳回值

設定或傳回一個布林值。

附註

在 Recordset 中，索引可以改善尋找或排序值的動作效能。此索引是 ADO 內建的，在您的應用程式中無法存取或使用它。

Optimize 屬性是「動態的」；它並不是屬於 Field 物件介面。如果您將 CursorLocation 屬性設定為 adUseClient，Optimize 屬性只會存在於 Field 物件的 Properties 集合物件中。

若要在資料欄上建立索引功能，請設定 Optimize 屬性為 True。若要刪除索引功能，設定屬性為 False。

使用方法

Dim rs As New Recordset
Dim fld As Field
rs.CursorLocation = adUseClient      'Enable index creation
rs.Fields.Append "Field1", adChar, 35, adFldIsNullable
rs.Open
Set fld = rs.Fields(0)
fld.Properties("Optimize") = True    'Create an index
fld.Properties("Optimize") = False   'Delete an index


OriginalValue 屬性

表示在作任何變更之前存在資料錄中的 Field 值。

傳回值

傳回一個 Variant 值。

附註

利用 OriginalValue 屬性從現有的資料錄中，傳回原始資料欄值給資料欄。

在立即更新模式中 (一旦您呼叫 Update 方法，提供者便會在所使用的資料源作變更。)，OriginalValue 屬性會在任何變更之前，傳回已存在的資料欄值 (也就是說，已經呼叫了最近的 Update 方法)。這是 CancelUpdate 方法以相同的值來取代 Value 屬性。

在批次更新模式中 (只有當您呼叫 UpdateBatch 方法時，提供者會快取多重變更，並將它們寫入所使用的資料源)，OriginalValue 屬性會在任何變更之前，傳回已存在的資料欄值 (也就是從最近一次 UpdateBatch 方法呼叫之後)，這是 CancelBatch 方法用來取代 Value 屬性的同一個值。當您以 UnderlyingValue 屬性來使用這個屬性時，便可以解決從批次更新所引發的衝突。


PageCount 屬性

表示 Recordset 物件包含的資料頁數。

傳回值

傳回一個 Long 值。

附註

利用 PageCount 屬性即可決定在 Recordset 物件中的資料頁數。頁數為一群資料錄，其大小等於 PageSize 屬性設定。縱使最後一頁不完整，由於資料錄比 PageSize 值少，在 PageCount 值中，它計算成另外一頁。如果 Recordset 物件不支援這種屬性，則該值為 -1，以表示 PageCount 是無法確定的。

有關頁數功能，請參閱 PageSize 及 AbsolutePage 屬性。


PageSize 屬性

表示在 Recordset 中，建構一頁要多少資料錄。

設定和傳回值

設定或傳回一個 Long 值，表示在一頁上有多少資料錄。預設值為 10。

附註

利用 PageSize 屬性即可決定有多少資料錄組成一個邏輯資料頁。設定頁面大小，您便可利用AbsolutePage 屬性來移動第一個特定頁的資料錄。這在 Web 伺服器圖文集是很管用的，尤其當您要讓使用者透過資料傳呼、一次檢視許多資料集時。

這個屬性可在任何時候設定，而且這個屬性值可用來計算特定頁的第一個資料錄所在位置。


Precision 屬性

表示在一個 Parameter 物件或數字型的 Field 物件中，數值的精準程度。

設定和傳回值

設定或傳回一個 Byte 值，表示以最大的總數字來表示數值。該值在 Parameter 物件中為讀/寫，而在 Field 物件中為唯讀。

附註

利用 Precision 屬性即可決定使用的最大數字，並作為數字型的 Parameter 或 Field 物件值。


Prepared 屬性

表示是否要在執行之前儲存一個編譯過的指令版本。

設定和傳回值

設定或傳回一個布林值。

附註

利用 Prepared 屬性讓提供者在 Command 物件的第一次執行之前，儲存指定於 CommandText 屬性中一個預備好的 (或編譯過的) 查詢版本。這也許會減緩指令的第一次執行，可是，當提供者編譯指令時便會將編譯過的指令版本用於下一個執行動作，如此一來便能改善執行效能。

如果該屬性為 False，提供者會直接執行 Command 物件，不必建立編譯過的版本。

如果提供者不支援指令的預先設定，當屬性設定為 True，提供者就可能傳回一項錯誤。如果未傳回錯誤，提供者就會忽視預先設定指令的要求，並將 Prepared 屬性設定為 False。


Provider 屬性

表示 Connection 物件的提供者名稱。

設定和傳回值

設定或傳回一個 String 值。

附註

利用 Provider 屬性即可設定或傳回連接的提供者名稱。這個屬性也可以藉由 ConnectionString 屬性內容或 Open 方法的 ConnectionString 引數來設定；然而，若在呼叫 Open 方法時在一個以上的地方指定提供者，將造成不能預期的結果。如果未指定任何提供者，該屬性會預設為 MSDASQL (Microsoft OLE DB Provider for ODBC)。

當連接關閉時，Provider 屬性為讀/寫狀態，開啟時則為唯讀狀態。該設定在您開啟 Connection 物件或存取 Connection 物件的 Properties 集合物件之後，才會發生作用。如果設定失效，便會產生錯誤。


RecordCount 屬性

表示在 Recordset 物件中現有的資料錄個數。

傳回值

傳回一個 Long 值。

附註

利用 RecordCount 屬性即可算出在 Recordset 物件中有多少個資料錄。當 ADO 無法確定資料錄個數，或是如果提供者或資料指標類型不支援 RecordCount 時，該屬性便傳回 -1。在關閉的 Recordset 讀取 RecordCount 屬性時，會產生錯誤。

如果 Recordset 物件支援接近的位置或書籤 - 也就是說，Supports (adApproxPosition) 或 Supports (adBookmark) 會分別地傳回 True 值 - 不管該資料錄及是否完全組合，該值便是真正在 Recordset 中的資料錄個數。如果 Recordset 物件不支援接近的位置，這個屬性也許會消耗資源，因為所有的資料錄必須擷取並作計算以便傳回一個精確的 RecordCount 值。

Recordset 物件的資料指標類型會影響是否可以確認資料錄的數目。RecordCount 屬性對會順向資料指標傳回 -1，對靜態或索引鍵集資料指標傳回實際數目，對動態資料指標，依資料來源，傳回 -1 或實際數目。


Recordset, SourceRecordset 屬性 (RDS)

表示 ADOR.Recordset 物件已經從自訂的 business 物件傳回。

您可以設定 SourceRecordset 屬性，或讀取位於 scripting 碼 (例如，VBScript) 中執行期的 Recordset 屬性。

語法

DataControl.SourceRecordset = Recordset

Recordset = DataControl.Recordset

參數

DataControl 一個物件變數，代表一個 RDS.DataControl 物件。

Recordset 一個物件變數，代表一個 ADOR.Recordset 物件。

附註

SourceRecordset 為一唯寫屬性，相對於 Recordset 屬性，則為唯讀屬性。

您可以將 SourceRecordset 屬性設定為從自訂的 business 物件屬性傳回的 Recordset。

這些屬性藉由自訂程序，讓應用程式處理連結程序。這些屬性接收隱藏於 Recordset 中的資料列集，如此您便可以直接與 Recordset 互動，像是設定屬性或透過 Recordset 陳述等執行動作。


ReadyState 屬性 (RDS)

傳遞 RDS.DataControl 物件將取得資料送到 Recordset 物件的處理進度。

設定值與傳回值

設定或傳回下列其中一值。

值 | 說明
adcReadyStateLoaded | 目前的查詢仍持續執行，而且未取得任何資料列。RDS.DataControl 物件的 Recordset 無法使用。
adcReadyStateInteractive | 由目前查詢所擷取的資料列初始設定，已被儲存在 RDS.DataControl 物件中的 Recordset，而且可以使用。其餘的資料列仍然在擷取中。
adcReadyStateComplete | 由目前查詢所擷取的所有資料列，已儲存在 RDS.DataControl 物件中的 Recordset，而且可以使用。 如果某項動作因錯誤而告中斷，或者 Recordset 物件未初始化，上述這種狀態仍就會存在。

註解 使用這些常數的每一個用戶端執行檔，必須給這些常數宣告。您可以從 C:\Program Files\Common Files\System\MSADC 資料夾中 Adcvbs.inc 檔案剪下並貼上您想要的常數宣告。

附註

利用 onReadyStateChange 事件方法，即可在非同步查詢動作期間監控 ReadyStateChange 屬性的變更。這遠比週期性檢查屬性值更具效率。

如果在非同步查詢動作期間產生錯誤，ReadyState 屬性會變更為 adcReadyStateComplete，而 State 屬性會從 adStateExecuting 變更為 adStateClosed，Recordset 物件 Value 屬性則保留 Nothing。


Server 屬性 (RDS)

設定或傳回 Internet Information Server (IIS) 名稱與通訊協定。

您可以在設計階段於 RDS.DataControl 物件的 OBJECT 標記中設定 Server 屬性，或在執行期間於 script 程式碼中設定 (例如，VBScript)。

語法

通訊協定 | 設計階段語法
HTTP | <PARAM NAME="Server" VALUE="http://awebsrvr:port">
HTTPS | <PARAM NAME="Server" VALUE="https://awebsrvr:port">
DCOM | <PARAM NAME="Server" VALUE="machinename">
In-process | <PARAM NAME="Server" VALUE="">

通訊協定 | 執行階段語法
HTTP | DataControl.Server="https://awebsrvr:port"
HTTPS | DataControl.Server="https://awebsrvr:port"
DCOM | DataControl.Server="machinename"
In-process | DataControl.Server=""

部份 | 說明
Awebsrvr 或 machinename | 包含有效 Internet 或 intranet 路徑與伺服器名稱的 String。
Port | 選用性。用來連接至 IIS 伺服器的連接埠。連接埠號碼設定於 Internet Explorer (在 [檢視] 功能表，按一下 [選項]，然後選擇 [連線] 標籤) 或在 IIS 中設定。
DataControl | 代表 RDS.DataControl 物件的物件變數。

備註

伺服器位置為建立伺服器端物件位置 (相對於資料所在的位置)。


Size 屬性

以位元組或字元為單位，顯示 Parameter 物件大小的最大值。

設定與傳回值

設定或傳回 Long 值，以位元組或字元為單位，顯示 Parameter 物件中數值大小的最大值。

備註

請使用 Size 屬性來決定可從 Parameter 物件 Value 屬性讀取或寫入數值大小的最大值。Size 屬性可讀取或寫入。

若 Parameter 物件的資料型態指定為可變動長度 (例如，adVarChar 之類的所有 String 資料型態)，您必須在將物件附加至 Parameters 物件集合前，設定物件的 Size 屬性；否則會發生錯誤。

若您已將 Parameter 物件附加至 Command 物件的 Parameters 物件集合，且將其資料型態改為可變動長度，您必須在執行 Command 物件前，設定 Parameter 物件的 Size 屬性；否則會發生錯誤。

若使用 Refresh 方法從提供者取得參數資訊，而提供者傳回一個或數個可變動長度資料型態的 Parameter 物件，ADO 可能會根據參數的潛在大小來配置記憶體，而使得在執行時發生錯誤。為了避免此類錯誤，您必須在執行指令前，明確地設定這些參數的 Size 屬性。


Sort 屬性

指定 Recordset 所要排序的一個或多個資料欄名稱，以及每個資料欄要以昇冪或降冪的方式來排序。

設定與傳回值

設定或傳回以逗號分隔資料欄名稱的 String，在 Recordset 中每個名稱都是資料欄，可選擇性地在後面加上空白以及 ASC 或 DESC 關鍵字，以指定資料欄排序的次序。

備註

資料並非實際上重新排列，而只是以排序的次序來存取。

若 CursorLocation 屬性設定為 adUseClient，且沒有索引，則會替 Sort 屬性中所指定的每個資料欄產生暫時性的索引。

Sort 屬性設定為空白字串時，會將資料列重設回原始的次序，並刪除暫時性索引。現有的索引則不會被刪除。

欄位無法命名為 "ASC" 或 "DESC" 是因為這些名稱與關鍵字 ASC 及 DESC 衝突。在查詢中使用傳回 Recordset 的 AS 關鍵字，給有衝突名稱的欄位一個別名。


SortColumn 屬性 (RDS)

設定或傳回排序記錄的欄位。

語法

DataControl.SortColumn = String

參數

DataControl 代表 RDS.DataControl 物件的物件變數。

String 代表排序記錄的欄位名稱或別名的 String 值。

備註

SortColumn、SortDirection、FilterValue、FilterCriterion，與 FilterColumn 屬性提供用戶端快取的排序功能。排序功能依欄位值來排序記錄。篩選功能則依尋找條件來顯示記錄，而完整的 Recordset 仍保留在快取中。Reset 方法會執行條件，並以更新的 Recordset 來取代目前的 Recordset。

若要排序 Recordset，首先您必須儲存擱置中的變更。若您正在使用 RDS.DataControl，則可使用 SubmitChanges 方法。例如，若您的 RDS.DataControl 名稱為 ADC1，則程式碼為 ADC1.SubmitChanges。若您使用 ADO Recordset，則可使用其 UpdateBatch 方法。以 CreateRecordset 方法所建立的 Recordset 物件建議使用 UpdateBatch 方法。例如，您的程式碼可為 myRS.UpdateBatch or ADC1.Recordset.UpdateBatch。


SortDirection 屬性 (RDS)

設定或傳回代表排序次序為昇冪或降冪的 Boolean 值。

語法

DataControl.SortDirection = value

參數

DataControl 代表 RDS.DataControl 物件的物件變數。

Value 設定或傳回下列值的 Boolean 值：

  • True—昇冪次序

  • False—降冪次序

備註

SortColumn、SortDirection、FilterValue、FilterCriterion，與 FilterColumn 屬性提供用戶端快取的排序與篩選功能。排序功能依欄位值來排序記錄。篩選功能則依尋找條件來顯示記錄，而完整的 Recordset 仍保留在快取中。Reset 方法會執行條件，並以更新的 Recordset 來取代目前的 Recordset。


Source 屬性 (ADO Error)

指示產生錯誤的物件或應用程式名稱。

傳回值

傳回 String 值。

備註

使用 Error 物件的 Source 屬性來決定產生錯誤的物件與應用程式。這可以是物件的類別名稱或程式 ID。在 ADODB 中的錯誤，屬性值將會是 ADODB.ObjectName，其中的 ObjectName 為啟動錯誤的物件名稱。Source 屬性為 Error 物件的唯讀屬性。

您可以根據 Error 物件的 Source、Number 與 Description 屬性有關錯誤的說明文件，撰寫程式碼，以適當地處理錯誤。


Source 屬性 (ADO Recordset)

指示 Recordset 物件中資料的來源 (Command 物件、SQL 敘述、表格名稱或儲存的程序)。

設定與傳回值

設定 String 值或 Command 物件參考；僅傳回 String 值。

備註

利用 Source 屬性來指定 Recordset 物件的資料來源，使用下列其中之一：Command 物件變數、SQL 敘述、儲存的程序或表格名稱。封閉 Recordset 物件的 Source 屬性可讀可寫，而開放 Recordset 物件的 Source 屬性則是唯讀。

若設定 Command 物件的 Source 屬性，Recordset 物件的 ActiveConnection 屬性會繼承指定 Command 物件的 ActiveConnection 屬性的值。不過，讀取 Source 屬性不會傳回 Command 物件；相反地，會傳回您設定 Source 屬性的 Command 物件的 CommandText 屬性。

若 Source 屬性為 SQL 敘述、儲存的程序或表格名稱，您可以傳遞合適的 Options 引數與 Open 方法呼叫，以便使效能最佳化。


SQL 屬性 (RDS)

設定或傳回用來取回 Recordset 的查詢字串。

您可以在設計階段於 RDS.DataControl 物件的 OBJECT 標記中設定 SQL 屬性，或在執行期間於 script 程式碼中設定 (例如，VBScript)。

語法

Design time: <PARAM NAME="SQL" VALUE="QueryString">

Run time: DataControl.SQL = "QueryString"

參數

QueryString 包含有效 SQL 資料要求的 String。

DataControl 代表 RDS.DataControl 物件的物件變數。

備註

一般而言，此為 "Select * from NewTitles" 之類的 SQL 敘述 (使用資料庫伺服器的用語)。若要確保記錄能正確地符合與更新，可更新查詢必須包含 Long Binary 資料欄或計算資料欄以外的資料欄。

若自訂伺服器端 business 物件從用戶端取回資料，則 SQL 屬性為選用性。


SQLState 屬性

指示特定 Error 物件的 SQL 狀態。

傳回值

傳回遵循 ANSI SQL 標準的五個字元 String。

備註

若在處理 SQL 敘述時發生錯誤，請使用 SQLState 屬性來讀取提供者所傳回的五字元錯誤碼。例如，在以 Microsoft (R) SQL Server (TM) 資料庫使用 Microsoft OLE DB Provider for ODBC 時，ODBC 所產生的 SQL 狀態錯誤碼可能是 ODBC 本身特有的錯誤，或來自 Microsoft SQL Server 的錯誤但對映成 ODBC 錯誤。這些錯誤碼記載於 ANSI SQL 標準，但可能因不同的資料來源而有不同的應用。


State 屬性

說明所有可應用物件的物件狀態為開放或封閉。

說明執行匿名方法的 Recordset 物件，物件目前狀態為連接、執行或是取得資料。

傳回值

傳回下列常數之一的 Long 值。

常數 | 說明
adStateClosed | 預設。指示物件為封閉狀態。
adStateOpen | 指示物件為開放狀態。
adStateConnecting | 指示 Recordset 物件正在連接中。
adStateExecuting | 指示 Recordset 物件正在執行指令。
adStateFetching | 指示 Recordset 物件的資料列正被取回。

備註

您可以使用 State 屬性，在任何時間決定特定物件的目前狀態。此為唯讀屬性。

Recordset 物件的 State 屬性可由數個數值所組成。例如，若正在執行敘述，此屬性則由 adStateOpen 與 adStateExecuting 兩個數值所組成。


Status 屬性

指示在批次更新或整體作業中目前記錄的狀態。

傳回值

傳回下列一個或數個 RecordStatusEnum 值的總值。

常數 | 說明
adRecOK | 成功更新記錄。
adRecNew | 記錄為新的記錄。
adRecModified | 記錄已修改。
adRecDeleted | 記錄已刪除。
adRecUnmodified | 記錄未修改。
adRecInvalid | 由於記錄的書籤無效，因此沒有儲存記錄。
adRecMultipleChanges | 由於記錄影響其他數個記錄，因此沒有儲存記錄。
adRecPendingChanges | 由於記錄引用擱置的插入項，因此沒有儲存記錄。
adRecCanceled | 由於作業取消，因此沒有儲存記錄。
adRecCantRelease | 由於鎖定現有的記錄，因此沒有儲存記錄。
adRecConcurrencyViolation | 由於正在使用樂觀性平行處理，因此沒有儲存記錄。
adRecIntegrityViolation | 由於使用者違反完整性限制，因此沒有儲存記錄。
adRecMaxChangesExceeded | 由於太多擱置中的變更，因此沒有儲存記錄。
adRecObjectOpen | 由於與開啟的儲存物件衝突，因此沒有儲存記錄。
adRecOutOfMemory | 由於電腦記憶體不足，因此沒有儲存記錄。
adRecPermissionDenied | 由於使用者的權限不足，因此沒有儲存記錄。
adRecSchemaViolation | 由於記錄違反資料庫的架構，因此沒有儲存記錄。
adRecDBDeleted | 記錄已從資料來源中刪除。

備註

請使用 Status 屬性來檢視在批次更新中，修改了那些擱置中的變更。您也可以使用 Status 屬性來檢視整體作業失敗記錄的狀態，例如當您在 Recordset 物件上呼叫 Resync、UpdateBatch，或 CancelBatch 方法，設定 Recordset 物件的 Filter 屬性為書籤陣列時。您可以利用此屬性來決定記錄失敗的原因，以及解決的方法。


StayInSync 屬性

在階層式的 Recordset 物件中，指示參照至依據的子記錄 (也就是 chapter) 是否要隨著主資料列位置的改變而改變。

設定與傳回值

設定或傳回 Boolean 值。預設值是 True，如果是 True，一旦主 Recordset 物件變更資料列位置則 chapter 會隨著更新；若設定為 False，就算主 Recordset 物件變更資料列位置， chapter 仍然會繼續引用前一 chapter 上的資料。

備註

此屬性可應用至階層式 recordset，例如 Microsoft Data Shaping Service for OLE DB 所支援的 recordset，且必須在取回子 Recordset 前，先行設定主 Recordset。此屬性可簡化階層式 recordset 的巡覽工作。


Type 屬性

指示 Parameter、Field 或 Property 物件資料型態的運算類型。

設定與傳回值

設定或傳回下列 DataTypeEnum 值之一。相對 OLE DB 類型指示器顯示在下表中說明欄的括弧內。有關 OLE DB 資料型態的詳細資訊，請參閱第 10 章與附錄 A 的 OLE DB 設計人員參考手冊。

常數 | 說明
adArray | 連結邏輯 OR 與其他型態，指示資料為該型態的安全陣列 (DBTYPE_ARRAY)。
adBigInt | 8 位元帶正負號的整數 (DBTYPE_I8)。
adBinary | 二進位值 (DBTYPE_BYTES)。
adBoolean | Boolean 值 (DBTYPE_BOOL)。
adByRef | 連結邏輯 OR 與其他型態，指示資料為該型態資料的指標 (DBTYPE_BYREF)。
adBSTR | 以 null 結尾的字元字串 (Unicode) (DBTYPE_BSTR)。
adChar | String 值 (DBTYPE_STR)。
adCurrency | 貨幣符號 (DBTYPE_CY)。貨幣符號為固定數字，在小數點後有四位數。它儲存為 8 位元組帶正負號的整數中，單位大小是 10,000。
adDate | Date 值 (DBTYPE_DATE)。日期儲存成 Double，範圍自 1899 年 12 月 30 日，分數部份為日的分數。
adDBDate | 日期值 (yyyymmdd) (DBTYPE_DBDATE)。
adDBTime | 時間值 (hhmmss) (DBTYPE_DBTIME)。
adDBTimeStamp | 日期時間戳記 (yyyymmddhhmmss 加上十億分之一的分數) (DBTYPE_DBTIMESTAMP)。
adDecimal | 固定精確度與單位的數字值 (DBTYPE_DECIMAL)。
adDouble | 倍精準度浮點數值 (DBTYPE_R8)。
adEmpty | 沒有指定任何值 (DBTYPE_EMPTY)。
adError | 32 位元錯誤碼 (DBTYPE_ERROR)。
adGUID | 全域唯一的識別碼 (GUID) (DBTYPE_GUID)。
adIDispatch | OLE 物件上 IDispatch 介面的指標 (DBTYPE_IDISPATCH)。
adInteger | 4 位元組帶正負號的整數 (DBTYPE_I4)。
adIUnknown | OLE 物件上 IUnknown 介面的指標 (DBTYPE_IUNKNOWN)。
adLongVarBinary | 長二進位值 (只有 Parameter 物件)。
adLongVarChar | 長 String 值 (只有 Parameter 物件)。
adLongVarWChar | 以 null 為字尾的長字串值 (只有 Parameter 物件)。
adNumeric | 固定精確度與單位的數字值 (DBTYPE_NUMERIC)。
adSingle | 單精確度浮點數值 (DBTYPE_R4)。
adSmallInt | 2 位元組帶正負號的整數 (DBTYPE_I2)。
adTinyInt | 1 位元組帶正負號的整數 (DBTYPE_I1)。
adUnsignedBigInt | 8 位元組帶正負號的整數 (DBTYPE_UI8)。
adUnsignedInt | 4 位元組不帶正負號的整數 (DBTYPE_UI4)。
adUnsignedSmallInt | 2 位元組不帶正負號的整數 (DBTYPE_UI2)。
adUnsignedTinyInt | 1 位元組不帶正負號的整數 (DBTYPE_UI1)。
adUserDefined | 使用者自訂的變數 (DBTYPE_UDT)。
adVarBinary | 二進位值 (只有 Parameter 物件)。
adVarChar | String 值 (只有 Parameter 物件)。
adVariant | Automation Variant (DBTYPE_VARIANT)。
adVector | 連結邏輯 OR 與其他型態，指示資料為 DBVECTOR 架構，由 OLE DB 所定義，其中包含了一些元素以及指向該類型資料的指標 (DBTYPE_VECTOR)。
adVarWChar | 以 null 為字尾的 Unicode 字元字串 (只有 Parameter 物件)。
adWChar | 以 null 為字尾的 Unicode 字元字串 (DBTYPE_WSTR)。

備註

Parameter 物件的 Type 屬性為可讀可寫。其他物件的 Type 屬性則是唯讀。


UnderlyingValue 屬性

顯示 Field 物件在資料庫中目前的數值。

傳回值

傳回 Variant 值。

備註

使用 UnderlyingValue 屬性從資料庫傳回目前資料欄值。在 UnderlyingValue 屬性的資料欄值為交易中可見的數值，可能是其他交易在最近更新的結果。此屬性與 OriginalValue 屬性不同，後者反映原來要傳回 Recordset 的數值。

如此類似使用 Resync 方法，但 UnderlyingValue 屬性只從目前記錄傳特定資料欄值。此數值與 Resync 方法用來取代 Value 屬性的數值相同。

使用此屬性與 OriginalValue 屬性時，可解決批次更新所造成的衝突。


Value 屬性

顯示 Field、Parameter 或 Property 物件的指定值。

設定與傳回值

設定或傳回 Variant 值。預設值因 Type 屬性而異。

備註

使用 Value 屬性值來設定或傳回來自 Field 物件的資料、利用 Parameter 物件設定或傳回參數值，或利用 Property 物件設定或傳回屬性設定。Value 屬性是否為可讀可寫或唯讀因數項因素而異。詳細資訊請參閱各個物件的相關主題。

ADO 允許以 Value 屬性設定或傳回長二位元資料。

注意 對 Parameter 物件，ADO 只從提供者讀取 Value 屬性一次。如果指令包含其 Value 屬性是空的 Parameter，且您從指令建立 Recordset，請確定您在讀取 Value 屬性前先關閉 Recordset。否則，對某些提供者其 Value 屬性可能為空的，不會包含正確的值。


Version 屬性

顯示 ADO 版本編號。

傳回值

傳回 String 值。

備註

使用 Version 屬性來傳回 ADO 的版本編號。

提供者的版本可從 Properties 物件集合的動態屬性取得。


ADO ADO 動態屬性

ADO 動態屬性

ADO 動態屬性摘要

屬性 | 說明
Name | 用來為 Recordset 物件指定名稱。
Unique Table, Unique Schema, Unique Catalog | Unique Table 指定的是基礎表格的名稱，使用者可以對該表格執行更新、新增、與刪除等的作業。 Unique Schema 指定的是結構描述，或者是表格擁有者的名稱。 Unique Catalog 指定的是包含表格的資料庫目錄或名稱。
Resync Command | 用來指定使用者所提供的指令字串，這個字串是Resync方法在重新整理表格資料時所使用的，這些表格在 Unique Table 動態屬性中被命名。
Update Resync | 用來指定 UpdateBatch 這個方法是否能在絕對的 Resync 方法操作中使用，如果可以，則指定它的作業範圍。


Name 屬性--動態 (ADO)

Name 屬性—動態

用來為 Recordset 物件指定名稱。

傳回值

傳回 Recordset 名稱的 String 值。

備註

在連線狀態期間、或直到 Recordset 被關閉前所持續的名稱。

Name 屬性主要是與 Microsoft Data Shaping Service for OLE DB服務提供者的 re-shaping 功能一起使用的，為了參加 re-shaping，它使用的名稱必須是唯一的。

這項屬性是唯讀的，不過當 Recordset 產生時，則可以間接予以設定。比方說，如果 SHAPE 指令片語產生了Recordset，並以"AS"關鍵字提供別名時，該別名就會被賦予 Name 屬性。如果未宣告別名、或該別名與現有的名稱發生衝突的話，則會由Shape提供者提供 Name 屬性一個名稱。

當您想在SHAPE指令中參考Recordset時，可以考慮使用 Name 屬性，不過您並不知道它的名稱，因為它是由MSDataShape所產生的。在這種情況下，您可以透過將指令與由 Name 屬性所傳回的字串的結合，產生出一個SHAPE指令。

當 CursorLocation 屬性設定為 adUseClient 時，Name 屬性是附加在 Recordset 物件 Properties 集合物件上的動態屬性。


Unique Table, Unique Schema, Unique Catalog 屬性--動態 (ADO)

Unique Table, Unique Schema, Unique Catalog 屬性—動態

讓您對 Recordset 中特殊的基礎表格進行密切地控制修改，該 Recordset 是由 JOIN 運算子在多個基礎表格上執行後所形成的。

  • Unique Table 指定的是基礎表格的名稱，使用者可以對該表格執行更新、新增、與刪除等的作業。

  • Unique Schema 指定的是結構描述，或者是表格擁有者的名稱。

  • Unique Catalog 指定的是包含表格的資料庫目錄或名稱。

設定和傳回值

設定或傳回表格、結構描述、或目錄名稱的 String 值。

備註

您想要的基礎表格可以由它的目錄、結構描述、與表格名稱予以辨識。當 Unique Table 屬性被設定時，Unique Schema 或 Unique Catalog 屬性的值就會被用來找出該基礎表格。Unique Schema 與 Unique Catalog 屬性最好在 Unique Table 屬性被設定前就設定好，不過也不是一定需要這樣。

Unique Table 的主鍵值會被當做是全部 Recordset 的主鍵值。它會被當做是所有需要主鍵值的方法的鍵值使用。

當 Unique Table 屬性被設定時，AddNew, Delete, Resync, Update, 與 UpdateBatch方法只會影響到被命名的表格。

如果無法找到唯一的基礎表格時，會產生錯誤的訊息。

當CursorLocation屬性設定為 adUseClient 時，這些動態屬性都會附加在 Recordset物件 Properties 集合物件上。


Resync Command Command 屬性--動態 (ADO)

Resync Command 屬性—動態

用來指定使用者所提供的指令字串，這個字串是 Resync 方法在重新整理表格資料時所使用的，這些表格在 Unique Table 動態屬性中被命名。

設定和傳回值

設定或傳回指令字串的 String 值。

備註

該 Recordset 物件是由 JOIN 運算子在多個基礎表格上的執行結果。被影響到的資料列由 Resync 方法的 AffectRecord s參數決定。如果 Unique Table 與 Resync Command 屬性未被設定時，將執行標準的 Resync 方法。

Resync Command 屬性的指令字串是一種參數化的指令、或儲存程序，可以辨識需要重新整理的資料列，並傳回包含相同資料欄數目與順序的單一資料列。這個指令字串包含了一個參數，可用在Unique Table 中每個主鍵值的欄位上，否則就會傳回錯誤的訊息。這個參數會自動以被重新整理的資料列的主鍵值填入。

底下是兩個以SQL為基礎的範例：

1) Recordset 由指令來定義：

SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE city = ‘Seattle’
ORDER BY CustomerID

Resync Command 屬性被設定為：

"SELECT * FROM
(SELECT * FROM Customers JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
city = ‘Seattle’ ORDER BY CustomerID)
WHERE Orders.OrderID = ?"

其中的 Unique Table 是 Orders，而且 OrderID 這個主鍵值也被參數化了。第二個SELECT指令提供了一種簡單的方式，可透過程式確保傳回的資料欄數目與順序會與原始指令相同。

2) Recordset 由儲存程序來定義：

CREATE PROC Custorders @CustomerID char(5) AS
SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = @CustomerID

Resync 方法應該執行下列的儲存程序：

CREATE PROC CustordersResync @ordid int AS
SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE Orders.ordid  = @ordid

Resync Command 屬性設定為：

"{call CustordersResync (?)}"

與前面相同的是，Unique Table是 Orders，而且 OrderID 這個主鍵值也被參數化了。

當 CursorLocation 屬性設定為 adUseClient時，Resync Command 是附加在 Recordset 物件 Properties 集合物件上的動態屬性。


Update Resync 屬性--動態 (ADO)

Update Resync 屬性—動態

用來指定 UpdateBatch 這個方法是否能在絕對的 Resync 方法操作中使用，如果可以，則指定它的作業範圍。

設定和傳回值

設定或傳回底下的CEResyncEnum數值之一：

常數 | 說明
adResyncNone | 不要啟動 Resync。
adResyncAutoIncrement | (預設) 對所有成功插入的資料列啟動 Resync，包括自動增益資料欄的數值在內。
adResyncConflicts | 針對所有因為同時性衝突，產生的更新或刪除作業失敗的資料列啟動 Resync。
adResyncUpdates | 對所有更新成功的資料列啟動 Resync。
adResyncInserts | 對所有插入成功的資料列啟動 Resync，包括它們身份欄的數值在內。
adResyncAll | 對所有暫停更改的資料列啟動 Resync。

備註

這個屬性只有在Unique Table動態屬性被設定時才有效。

您可以同時使用 adResyncAutoIncrement 與 adResyncConflicts，另外也可以同時使用 adResyncAll、adResyncUpdates、adResyncInserts 與 adResyncConflicts。

AdResyncConflicts 常數將resync 值儲存為基礎的數值，不過不會讓暫停更改失效。

當 CursorLocation 屬性設定為 adUseClient 時，Update Resync這個動態屬性會附加在 Recordset 物件 Properties 集合物件上。


使用提供者搭配 ADO

本節討論三類的提供者：資料提供者、服務提供者、與服務元件。提供者可以粗分為兩大類：提供資料與提供服務。資料提供者保有其自己的資料且將資料置於資料表格式至您的應用程式。服務提供者製造及消耗資料、增加您 ADO 應用程式的功能，提供服務。服務提供者可以更進一步定義為服務元件，必須搭配其它服務提供者或元件才能作業。

資料提供者

由於 ADO 可以連結多種不同的資料提供者，而且不論所使用的提供者特定功能為何，仍表現出相同的程式設計模式，因此功能強大且深具彈性。

但是由於每個資料提供者都有其獨特之處，所以在資料提供者不同的情況下，您的應用程式如何與 ADO 相互作用都會有些許的差異。您必須了解的差異主要可分為三種類型：

  • ConnectionString 屬性中的連結參數。

  • Command 物件的使用方法。

  • 提供者特有的 Recordset 行為。

在這三大範圍中，目前 Microsoft 所提供的每一個資料提供者特有的詳細資料均詳列如下：

範圍 | 主題
ODBC 資料庫 | Microsoft OLE DB Provider for ODBC
Microsoft (R) Index Server | Microsoft OLE DB Provider for Microsoft Index Server
Microsoft (R) Active Directory Service | Microsoft OLE DB Provider for Microsoft Active Directory Service
Microsoft (R) Jet 資料庫 | OLE DB Provider for Microsoft Jet
Microsoft (R) SQL Server | Microsoft OLE DB Provider for SQL Server
Oracle 資料庫 | Microsoft OLE DB Provider for Oracle

提供者特有的動態屬性

Connection、Command 及 Recordset 物件的 Properties 集合物件包括對於提供者特定的動態屬性。這些在 ADO 所支援的內建屬性以外的動態屬性，可以提供有關提供者特定功能的相關資訊。

在建立連結與新增這些物件後，請在物件的 Properties 集合物件上使用 Refresh 方法，以取得提供者特有的屬性。若需關於這些動態屬性的詳細資訊，請查閱提供者相關文件及 OLE DB 程式設計師參考文件。

服務提供者

若要使用服務提供者，您必須提供關鍵字。您也應該注意關於每一服務提供者的提供者特定動態屬性。列出目前 Microsoft 的提供者特定細節。

  • Microsoft Data Shaping Service for OLE DB

  • Microsoft OLE DB Persistence Provider

  • Microsoft OLE DB Remoting Provider

服務元件

OLE DB 服務元件的資料指標服務提供資料提供者的資料指標支援功能。並且需要關鍵字且有動態屬性。

Microsoft Cursor Service for OLE DB

請參閱 若需更多關於提供者的相關資訊，請參閱 Data Access SDK 中有關 Microsoft (R) OLE DB 的相關文件，或瀏覽在 http://www.microsoft.com/data 上的 Microsoft 資料存取網頁。


供 ODBC 使用的 Microsoft OLE DB Provider

對 ADO 或 RDS 程式設計師來說，如果每一個資料來源都能看到 OLE DB 介面，讓 ADO 能夠直接呼叫資料來源，將會是最完美的一件事。雖然越來越多的資料庫供應商引入 OLE DB 介面，但某些資料來源仍未出現這樣的方式。不過現今所有使用中的 DBMS 系統都能透過 ODBC 進行存取。

Microsoft (R) ODBC Provider 允許 ADO 連結至任何的 ODBC 資料。包括 Microsoft (R) SQL Server (TM)、Microsoft Access (Microsoft Jet 資料庫引擎) 和 Microsoft FoxPro (R)，或者非 Microsoft 所製作的資料庫產品，例如 Oracle 的產品，現今每一種主要的 DBMS，都能取得 ODBC 驅動程式。提供者啟用了自由執行緒及 unicode。

雖然不同的 DBMS 引擎提供不同交易類型的支援，但提供者仍支援交易。例如 Microsoft Access 支援高達五層的巢狀交易。

此為 ADO 預設的提供者，當與 Microsoft SQL Server 6.5 搭配使用時，除了在 ADO 語系參考主題中特別註明者，支援所有提供者相關的 ADO 屬性及方法。

連結字串參數

若要連結至此提供者，請設定 ConnectionString 屬性的 Provider= 引數為：

MSDASQL

讀取 Provider 屬性會傳回此字串。

因為此為 ADO 預設的提供者，如果您省略來自連結字串的 Provider= 參數，ADO 將會試著建立與此提供者的連結。

除了 ADO 所定義的連結參數外，提供者並不支援任何特定的連結參數。但是提供者仍將傳遞每一個非 ADO 連結參數到 ODBC 驅動程式管理員。

因為您可以省略 Provider 參數，所以您可以用相同的資料來源撰寫一個與 ODBC 連結字串相同的 ADO 連結字串。在撰寫 ODBC 連結字串時，可以使用相同的參數名稱 (DRIVER=、DATABASE=、DSN= 等等)、值及語法。您可以選擇與內建資料來源名稱 (DSN) 或 FileDSN 連結或不連結。

使用 DSN 或 FileDSN 的語法為：

"[Provider=MSDASQL;] { DSN=name | FileDSN=filename } ; [DATABASE=database;] UID=user; PWD=password"

不使用 DSN (無 DSN 的連結) 的語法為：

"[Provider=MSDASQL;] DRIVER=driver; SERVER=server; DATABASE=database; UID=user; PWD=password"

如果使用 DSN 或 FileDSN，必須透過 Windows [控制台] 的 [ODBC 管理員] 加以定義。還有另一個設定 DSN 的方法，就是直接指定 ODBC 驅動程式 (DRIVER=)，例如 "SQLServer"、伺服器名稱 (SERVER=) 及資料庫名稱 (DATABASE=)。

您也可以在 ODBC 特定參數或標準 ADO 定義的 User ID 及 Password 參數中，指定使用者帳號名稱 (UID=) 及使用者帳號密碼 (PWD=)。如果您同時在 ADO 及 ODBC 特定參數中均包括了這些值，將會以 ADO 參數的設定為準。

雖然在 DSN 定義中已經指定了資料庫，您可以在 DSN 之外另外指定 DATABASE 參數，以連結至不同的資料庫。這樣也將改變 DSN 的定義，將所指定的資料庫包括在內。當您使用 DSN 時，一直保留 DATABASE 參數是一個很好的想法。因為縱使其他使用者在您上一次查對 DSN 定義之後，曾改變了預設的資料庫參數，仍可以確保您可以連接至所需的資料庫。

指令文字

Command 物件的使用方式絕大部份都是取決於它可以接受的資料來源及查詢或指令陳述式的類型。

ODBC 提供呼叫預存程序的指定語法。對於 Command 物件的 CommandText 屬性、 Connection 物件的 Execute 方法的 CommandText 引數，或 Recordset 物件的 Open 方法的 Source 引數，傳遞至具有此語法的字串：

"{ [ ? = ] call procedure [ ( ? [, ? [ , ) ] }"

? 引用 Parameters 集合物件的物件，第一個 ? 引用 Parameter(0)，下一個 ? 引用 Parameters(1)，以此類推。

參數引用屬於選擇性並依預存程序而定。如果您要呼叫一個未定義參數的預存程序，字串應該像這樣設定：

"{ call procedure }"

如果有兩個查詢參數，字串應該像這樣設定：

"{ call procedure ( ?, ? ) }"

如果預存程序需要傳回值，傳回值會被視為另一個參數。若您並沒有查詢參數，但有傳回值，字串應像這樣設定：

"{ ? = call procedure }"

如果有一個傳回值和兩個查詢參數，字串應該像這樣設定：

"{ ? = call procedure ( ?, ? ) }"

Recordset 行為

下列表格列出隨此提供者開啟的 Recordset 物件所提供的標準 ADO 方法及屬性：

若需更多關於提供者的 Recordset 行為規格的詳細資訊，請執行 Support 方法並列出 Recordset 的 Properties 集合物件，以判定提供者特定動態屬性是否存在。

標準 ADO Recordset 屬性的可用性：

屬性 | ForwardOnly | 動態 | 索引鍵集 | 靜態
AbsolutePage | 無 | 無 | 可讀 / 可寫 | 可讀 / 可寫
AbsolutePosition | 無 | 無 | 可讀 / 可寫 | 可讀 / 可寫
ActiveConnection | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
BOF | 唯讀 | 唯讀 | 唯讀 | 唯讀
Bookmark | 無 | 無 | 可讀 / 可寫 | 可讀 / 可寫
CacheSize | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
CursorLocation | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
CursorType | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
EditMode | 唯讀 | 唯讀 | 唯讀 | 唯讀
EOF | 唯讀 | 唯讀 | 唯讀 | 唯讀
Filter | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
LockType | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
MarshalOptions | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
MaxRecords | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
PageCount | 無 | 無 | 唯讀 | 唯讀
PageSize | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
RecordCount | 無 | 無 | 唯讀 | 唯讀
Source | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫 | 可讀 / 可寫
State | 唯讀 | 唯讀 | 唯讀 | 唯讀
Status | 唯讀 | 唯讀 | 唯讀 | 唯讀

當 ADO 與供 ODBC 使用的 Microsoft OLE DB Provider 的 1.0 版配合使用時，AbsolutePosition 及 AbsolutePage 的屬性是唯寫的。

標準 ADO Recordset 方法的可用性：

方法 | ForwardOnly | 動態 | 索引鍵集 | 靜態
AddNew | 是 | 是 | 是 | 是
Cancel |  |  |  |
CancelBatch | 是 | 是 | 是 | 是
CancelUpdate | 是 | 是 | 是 | 是
Clone | 否 | 否 | 是 | 是
Close | 是 | 是 | 是 | 是
Delete | 是 | 是 | 是 | 是
GetRows | 是 | 是 | 是 | 是
Move | 是 | 是 | 是 | 是
MoveFirst | 是 | 是 | 是 | 是
MoveLast | 否 | 是 | 是 | 是
MoveNext | 是 | 是 | 是 | 是
MovePrevious | 否 | 是 | 是 | 是
NextRecordset* | 是 | 是 | 是 | 是
Open | 是 | 是 | 是 | 是
Requery | 是 | 是 | 是 | 是
Resync | 否 | 否 | 是 | 是
Supports | 是 | 是 | 是 | 是
Update | 是 | 是 | 是 | 是
UpdateBatch | 是 | 是 | 是 | 是

*不支援 Microsoft Access 資料庫。

請參閱 若需關於 Microsoft OLE DB Provider for ODBC 的特定完成細節及功能資訊，請查閱 Data Access SDK 中有關 Microsoft OLE DB Provider for ODBC 及 Microsoft OLE DB Programmer's Reference 的部份。或瀏覽在 http://www.microsoft.com/data 上的 Microsoft 資料存取網頁。


Microsoft OLE DB Provider for Microsoft Index Server

Microsoft OLE DB Provider for Microsoft Index Server 對於由 Microsoft (R) Index Server 2.0 建立索引的檔案系統及 Web 資料提供程式唯讀存取。ADO 應用程式可以發出 SQL 查詢來取得內容及檔案屬性資訊。

提供者啟用了自由執行緒及 unicode。

連結字串參數

若要連結此提供者，請設定 ConnectionString 屬性的 Provider= 引數為：

MSIDXS

讀取 Provider 屬性會傳回此字串。

指令文字

Index Server SQL 查詢語法是由 SQL92 SELECT 陳述式的副檔名及其 FROM 和 WHERE 子句所組成。查詢的結果經由 OLE DB 資料列集傳回，經 ADO 使用後並運作成為 Recordset 物件。

您可以搜尋確切的文字或片語，也可以利用通用字元來搜尋某種模式的字。搜尋邏輯可依布林 (Boolean) 判斷值加權詞與其他字的相似度。您也可以根據意義的相符性，而非確切的文字，進行 "自然文字" 搜尋。

特定指令的用法在 Microsoft Index Server Reference 的 "SQL Access to Index Server Data" 中有詳盡的說明。

提供者不接受預存程序呼叫或簡單資料表名稱 (例如 CommandType 屬性一律呼叫 adCmdText)。

Recordset 行為

下列表格列出隨此提供者開啟的 Recordset 物件提供的功能。僅提供 [靜態] 資料指標型態 (adOpenStatic)。

若需更多關於提供者的 Recordset 行為規格的詳細資訊，請執行 Support 方法並列出 Recordset 的 Properties 集合物件，以判定提供者特定動態屬性是否存在。

標準 ADO Recordset 屬性的可用性：

屬性 | 可用性
AbsolutePage | 可讀 / 可寫
AbsolutePosition | 可讀 / 可寫
ActiveConnection | 唯讀
BOF | 唯讀
Bookmark* | 可讀 / 可寫
CacheSize | 可讀 / 可寫
CursorLocation | 一律詢問 adUseServer
CursorType | 一律詢問 adOpenStatic
EditMode | 一律詢問 adEditNone
EOF | 唯讀
Filter | 可讀 / 可寫
LockType | 可讀 / 可寫
MarshalOptions | 無
MaxRecords | 可讀 / 可寫
PageCount | 唯讀
PageSize | 可讀 / 可寫
RecordCount | 唯讀
Source | 可讀 / 可寫
State | 唯讀
Status | 唯讀

*必須啟動提供者的書籤，使 Recordset 具有此項功能。

標準 ADO Recordset 方法的可用性：

方法 | 是否提供
AddNew | 否
Cancel |
CancelBatch | 否
CancelUpdate | 否
Clone | 是
Close | 是
Delete | 否
GetRows | 是
Move | 是
MoveFirst | 是
MoveLast | 是
MoveNext | 是
MovePrevious | 是
NextRecordset | 是
Open | 是
Requery | 是
Resync | 是
Supports | 是
Update | 否
UpdateBatch | 否

請參閱 若需有關 Microsoft OLE DB Provider for Microsoft Index Server 的特定完成細節及功能資訊，請查閱 Microsoft OLE DB Programmer's Reference 及 Microsoft Index Server 的相關文件。在 http://www.microsoft.com/iis 上的 Microsoft Internet Information Server 網頁也具有 Microsoft Index Server 的相關資訊。


Microsoft OLE DB Provider for Microsoft Active Directory Service

The Microsoft (R) Active Directory Service Interfaces (ADSI) Provider 可供 ADO 透過 ADSI 連結異質目錄服務。 如此可讓 ADO 應用程式唯讀存取 Microsoft (R) Windows NT (R) 4.0 目錄服務及任何 LDAP 順應的目錄及 [Novell 目錄服務]。ADSI 是以提供者模型做為基礎，所以如果有一個新的提供者可以存取另一個目錄，ADO 應用程式就可以完整存取這個目錄。ADSI 提供者啟用了自由執行緒及 unicode。

連結字串參數

若要連結至此提供者，請設定 ConnectionString 屬性的 Provider 引數為：

ADSDSOObject

讀取 Provider 屬性會傳回此字串。

指令文字

提供者以下列語法辨識四部份的指令文字字串語法：

"Root; Filter; Attributes[; Scope]"

值 | 說明
Root | ADsPath 物件開始搜尋的位置 (也就是搜尋的根目錄)。
Filter | RFC 960 格式的搜尋條件。
Attributes | 以逗號分隔傳回屬性的清單。
Scope 選擇性。指定搜尋範圍的 String。可以為下列幾種形式之一：
  • Base—僅搜尋基礎物件 (搜尋的根目錄)。

  • OneLevel—僅搜尋一個階層。

  • Subtree—搜尋整個子目錄。

提供者不接受預存程序呼叫或簡單資料表名稱 (例如 CommandType 屬性一律詢問 adCmdText)。若需更多有關指令文字元素的完整說明，請參閱 Active Directory Service Interfaces 相關文件。

Recordset 行為

下列表格列出隨此提供者開啟的 Recordset 物件提供的功能。僅提供 [靜態] 資料指標型態 (adOpenStatic)。

若需更多關於提供者的 Recordset 行為規格的詳細資訊，請執行 Support 方法並列出 Recordset 的 Properties 集合物件，以判定提供者特定動態屬性是否存在。

標準 ADO Recordset 屬性的可用性：

屬性 | 可用性
AbsolutePage | 可讀 / 可寫
AbsolutePosition | 可讀 / 可寫
ActiveConnection | 唯讀
BOF | 唯讀
Bookmark | 可讀 / 可寫
CacheSize | 可讀 / 可寫
CursorLocation | 一律呼叫 adUseServer
CursorType | 一律呼叫 adOpenStatic
EditMode | 一律呼叫 adEditNone
EOF | 唯讀
Filter | 可讀 / 可寫
LockType | 可讀 / 可寫
MarshalOptions | 無
MaxRecords | 可讀 / 可寫
PageCount | 唯讀
PageSize | 可讀 / 可寫
RecordCount | 唯讀
Source | 可讀 / 可寫
State | 唯讀
Status | 唯讀

標準 ADO Recordset 方法的可用性：

方法 | 是否提供
AddNew | 否
Cancel |
CancelBatch | 否
CancelUpdate | 否
Clone | 是
Close | 是
Delete | 否
GetRows | 是
Move | 是
MoveFirst | 是
MoveLast | 是
MoveNext | 是
MovePrevious | 是
NextRecordset | 是
Open | 是
Requery | 是
Resync | 是
Supports | 是
Update | 否
UpdateBatch | 否

請參閱 若需有關 ADSI 的一般資訊及提供者的特性，請參閱 Active Directory Service Interfaces SDK 提供的相關文件。您可以從 http://www.microsoft.com/iis 上的 ADSI 網頁安裝 SDK。


OLE DB Provider for Microsoft Jet

OLE DB Provider for Microsoft (R) Jet 可讓 ADO 存取 Microsoft Jet 資料庫。

連結字串參數

若要連結此提供者，請設定 ConnectionString 屬性的 Provider 引數為：

Microsoft.Jet.OLEDB.4.0

讀取 Provider 屬性會傳回此字串。

除了 ADO 所定義的連結參數以外，OLE DB Provider for Microsoft Jet 支援多種提供者特有的連結參數。這些參數與所有其他連結參數一樣，可以經由 Connection 物件的 Properties 集合物件加以設定，或者做為連結參數的一部份。

參數 | 說明
Jet OLEDB:System Database | 工作群組資訊檔案的路徑及檔案名稱。
Jet OLEDB:Registry Path | 包含 Microsoft Jet 資料庫引擎值的 Windows 註冊機碼。
Jet OLEDB:Database Password | 資料庫密碼。

預設 OLE DB Provider for Microsoft Jet 以可讀/可寫模式開啟 Microsoft Jet 資料庫。若要以唯讀模式開啟資料庫，請將 ADO Connection 物件的 Mode 屬性設定為 adModeRead。

指令物件使用方法

Command 物件的指令文字使用 Jet SQL 用法。您可以在指令文字中指定資料列傳回的查詢、動作查詢及資料表名稱；但是並不支援且不應指定預存程序。

Recordset 行為

Microsoft Jet 資料庫引擎並不支援動態資料指標。因此 OLE DB Provider for Microsoft Jet 不支援 adLockDynamic 資料指標型態。當出現動態資料指標要求，提供者將會傳回索引鍵集的資料指標，並且重新設定 CursorType 屬性，以表示傳回的 Recordset 類型。更進一步，如果出現可更新 Recordset 的要求 (LockType 為 adLockOptimistic、adLockBatchOptimistic 或 adLockPessimistic)，提供者也會傳回索引鍵集的資料指標，並重新設定 CursorType 屬性。

請參閱 若需關於 OLE DB Provider for Microsoft Jet 的特定完成細節及功能資訊，請查閱 Data Access SDK 中有關 OLE DB Provider for Microsoft Jet 的相關文件。


Microsoft OLE DB Provider for SQL Server

名為 SQLOLEDB 的 Microsoft (R) OLE DB Provider for SQL Server 可供 ADO 存取 Microsoft (R) SQL Server (TM)。

連結字串參數

若要連結此提供者，請設定 ConnectionString 屬性的 Provider 引數為：

SQLOLEDB

此值可以使用 Provider 屬性來設定或讀取。

除了 ADO 所定義的連結參數以外，提供者支援多種提供者特有的連結參數。這些提供者特定的參數與 ADO 連結參數一樣，可以經由 Connection 物件的 Properties 集合物件加以設定，或者可設定為 ConnectionString 的一部份。

參數 | 說明
Trusted Connection | 使用者授權模式。可設定為 True 或 False，預設的值為 False。如果此屬性設定為 True，SQLOLEDB 會使用 [Microsoft (R) Windows NT(R) 授權模式] 來授權使用者存取由 Location 及 Datasource 屬性值指定的 SQL 伺服器資料庫。如果此屬性設定為 False，SQLOLEDB 會使用 [混合模式] 來授權使用者存取 SQL 伺服器資料庫。SQL 伺服器的登錄及密碼是由 User Id 及 Password 屬性指定。
Current Language | SQL 伺服器語系名稱。識別系統訊息及格式所使用的語系。語系必須安裝於 SQL 伺服器，否則開啟連結將會失敗。
Network Address | 由 Location 屬性指定的 SQL 伺服器的網路位址。
Network Library | 用於與 SQL 伺服器交談的 [網路程式庫 (Net-Library)] (DLL) 的名稱。名稱中不應包括路徑或 .dll 檔案名稱副檔名。預設是由 SQL 伺服器用戶端組態提供。
Use Procedure for Prepare | SQL 伺服器預存程序所使用。定義當 [Commands] 預備好時，SQL 伺服器暫時預存程序的使用。
Auto Translate | OEM/ANSI 字元轉換。此屬性可設定為 True 或 False，預設值為 True。如果屬性設定為 True，當多位元組字元字串傳送或接收自 SQL 伺服器，SQLOLEDB 執行 OEM/ANSI 字元的轉換。當屬性設定為 False，SQLOLEDB 不會對多位元組字元字串資料執行 OEM/ANSI 字元轉換。
Packet Size | 以位元組為單位的網路封包大小。適當的封包大小必須介於 512 到 32767 之間。預設的 SQLOLEDB 網路封包大小為 4096。
Application Name | 用戶端用戶程式名稱。
Workstation ID | 識別工作站的字串。

指令物件使用方法

SQLOLEDB 可以接受 ODBC、ANSI 及 [SQL Server 獨有的 Transact-SQL] 的混合做為有效的語法。例如下面的 SQL 陳述式使用 ODBC SQL 跳離程序，以指定 LCASE 字串功能：

SELECT customerid={fn LCASE(CustomerID)} FROM Customers

LCASE 傳回所有將大寫字元轉換為小寫字元的字元字串。ANSI SQL 字串功能 LOWER 執行同樣的動作，所以下面的 SQL 陳述式是與上面 ODBC 陳述式相等的 ANSI 陳述式：

SELECT customerid=LOWER(CustomerID) FROM Customers

當把指令指定為文字的情況下，不論哪一種形式的陳述式，SQLOLEDB 都能順利的處理。

預存程序

當使用 SQLOLEDB 指令執行 SQL 伺服器預存程序時，請以指令文字使用 ODBC 程序呼叫跳離程序。SQLOLEDB 便可以使用 SQL 伺服器的遠端程序呼叫機制使指令處理最佳化。例如下面的 ODBC SQL 陳述式中，指令文字就優先於 [Transact-SQL] 形式：

ODBC SQL

{call SalesByCategory('Produce', '1995')}

Transact-SQL

EXECUTE SalesByCategory 'Produce', '1995'

Recordset 行為

SQLOLEDB 無法使用 SQL 伺服器資料指標來支援由許多指令產生的多重資料列集。若使用者要求需要 SQL 伺服器資料指標支援的資料列集，當所用的指令文字產生超過一個資料列集的結果，就會出現錯誤。

SQL 伺服器資料指標支援可捲動的 SQLOLEDB 資料列集。SQL 伺服器在對於資料庫其他使用者所做改變敏感的資料指標上加以限制。特別是在某些資料指標中的資料列無法排序，而且試圖以具有 SQL ORDER BY 子句來建立資料列集將會失敗。

請參閱 若需關於 Microsoft SQL Server OLE DB Provider 的特定完成細節及功能資訊，請查閱 Data Access SDK 中 有關 Microsoft SQL Server OLE DB Provider 的相關文件。


Microsoft OLE DB Provider for Oracle

Microsoft OLE DB Provider for Oracle 可以讓 ADO 存取 Oracle 資料庫。

連結字串參數

若要連結此提供者，請設定 ConnectionString 屬性的 Provider 引數為：

MSDAORA

讀取 Provider 屬性會傳回此字串。

如果在 Oracle 資料庫上執行搭配索引鍵集或動態資料指標的 join 查詢，會發生錯誤。Oracle 僅支援靜態的唯讀資料指標。


Microsoft Data Shaping Service for OLE DB (ADO 服務提供者)

Microsoft Data Shaping Service for OLE DB

Microsoft Data Shaping Service for OLE DB這項服務提供者，支援從一個、或一個以上的資料提供者的地方，建構階層式(shaped)的 Recordset 物件。

提供者關鍵字

如果要啟動 Data Shaping Service for OLE DB，可以在連接字串中指定底下的關鍵字與數值。

"Provider=MSDataShape"

動態屬性

當這項服務提供者被啟動時，底下的動態屬性會被加到 Connection 物件的 Properties 集合物件中。

動態屬性名稱 | 說明
Unique Reshape Names | 用來指出設定給 Recordset 的 Name 屬性值是否與現有的名稱相互衝突，如果該屬性值為 True 的話，那麼就會產生一個唯一的名稱；否則，兩個名稱將同時存在。
Data Provider | 指出將提供要成形的資料列的提供者名稱。

您也可以透過將它們的名稱指定為連接字串中的關鍵字，來設定可寫入的動態屬性。舉例來說，在 Visual Basic 中，透過底下的指定方式，就可以將 Data Provider 動態屬性設定到 "MSDASQL"：

Dim cn as New ADODB.Connection
cn.Open "Provider=MSDataShape;Data Provider=MSDASQL"

您也可以透過將它的名稱指定為 Properties 屬性的索引，對動態屬性進行設定與擷取的動作。比方說，取得並列印 Data Provider 動態屬性的目前值，然後設定新的數值如下：

Debug.Print cn.Properties("Data Provider")
cn.Properties("Data Provider") = "MSDASQL"

如果您想多瞭解有關資料成形的資料，可參閱 Data Shaping 。


Microsoft OLE DB Persistence Provider (ADO 服務提供者)

Microsoft OLE DB Persistence Provider

Microsoft OLE DB Persistence Provider 可讓您將某個 Recordset 物件存入檔案，並於稍後從該檔案中進行回存 Recordset 物件的作業。其中的結構敘述、資料、以及暫停的更改將會被保留下來。

您可以將 Recordset 物件儲存為專屬性的 Advanced Data Table Gram (ADTG) 格式，或者是開放式的 Extensible Markup Language (XML) 格式。

提供者關鍵字

如果要啟動這個提供者，可以在連接字串中指定底下的關鍵字與數值。

"Provider=MSPersist"

錯誤

底下由提供者所發出的錯誤訊息可以在您的應用程式中被偵測出來。

常數 | 說明
E_BADSTREAM | 正在開啟的檔案格式不正確（這個意思是說它不是 ADTG 或 XML 的格式）。
E_CANTPERSISTROWSET | 正在儲存的 Recordset 物件中，存有無法儲存的特徵。

備註

Microsoft OLE DB Persistence Provider 無法使用動態屬性。

目前，只有參數化的階層式 Recordset 物件可被儲存。

如果您想多瞭解有關 persisting Recordset 物件的資料，可參閱 Recordset Persistence。


Microsoft OLE DB Remoting Provider (ADO 服務提供者)

Microsoft OLE DB Remoting Provider

Microsoft OLE DB Remoting Provider 可讓位於前端機器上的本地使用者，啟動遠端機器上的資料提供者。如果您是遠端機器上的本地使用者，您可以如您所願的指定該遠端機器的資料提供者參數。然後，再指定 Remoting Provider 所使用的參數，對遠端機器進行讀取。結果的效應是，您可以如同本地使用者般地讀取遠端機器上的資料。

提供者關鍵字

如果要啟動 OLE DB Remoting Provider 這個提供者，可以在連接字串中指定底下的關鍵字與數值。（請注意在提供者名稱中的空白鍵。）

"Provider=MS Remote"

額外的關鍵字

當這項服務提供者被啟動時，就可以使用底下額外的關鍵字了。

關鍵字 | 說明
Data Source | 指定遠端資料來源的名稱。它會被傳給 OLE DB Remoting Provider 進行處理。 這個關鍵字與 RDS.DataControl 物件的 Connect 屬性相等。

動態屬性

當這項服務提供者被啟動時，底下的動態屬性會被加到 Connection 物件的 Properties 集合物件中。

動態屬性名稱 | 說明
DFMode 指示 DataFactory Mode。指定在伺服器上所希望 DataFactory 物件版本的字串。請在開啟要求特定版本的 DataFactory 連線之前，先行設定這項屬性。如果所要求的版本無法使用，會嘗試使用先前的版本。如果也找不到先前版本的話，就會產生錯誤訊息。如果 DFMode 小於可使用版本的話，也會產生錯誤訊息。在連線建立之後，它將變成唯讀的屬性。

它可以是底下有效字串數值之一：

  • "21"— 2.1 版 (預設值)

  • "20"— 2.0 版

  • "15"— 1.5 版
Current DFMode 表示在伺服器上 DataFactory 的真正版本編號。您可以檢查這項屬性，查看是否真的是 DFMode 屬性中所要求版本。

它可以是底下有效長整數的數值之一：

  • 21— 2.1 版 (預設值)

  • 20— 2.0 版

  • 15— 1.5 版
Handler | 表示伺服器端自訂程式（或處理器）的名稱，該程式的作用是要延伸 RDSServer.DataFactory、以及任何被處理器所使用的參數的功能，這些參數都以逗號 (",") 分隔開。這是字串型的數值。
Internet Timeout | 表示某項要求傳給伺服器、或從伺服器傳來的最大等待時間。（預設值是 5 分鐘。）
Remote Provider | 表示在遠端伺服器上所使用的資料提供者的名稱。
Remote Server | 表示連線所使用的伺服器名稱、以及通訊協定。這項屬性與 RDS.DataControl 物件的 Connect 屬性相等。

您也可以透過將它們的名稱指定為連接字串中的關鍵字，來設定可寫入的動態屬性。舉例來說，透過底下的指定方式，就可以將 Internet Timeout 動態屬性設定為 5 秒鐘的時間：

Dim cn as New ADODB.Connection
cn.Open "Provider=MS Remote;Internet Timeout=5000"

您也可以透過將它的名稱指定為 Properties 屬性的索引，對動態屬性進行設定與擷取的動作。比方說，取得並列印 Internet Timeout 動態屬性的目前值，然後設定新的數值如下：
Debug.Print cn.Properties("Internet Timeout")
cn.Properties("Internet Timeout") = 5000

備註

在 ADO 2.0 中，OLE DB Remoting Provider 只可以在 Recordset 物件 Open 方法的 ActiveConnection 參數中指定。從 ADO 2.1 開始，這項提供者也可以在 Connection 物件 Open 方法的 ConnectionString 參數中指定。

您不可以使用 RDS.DataControl 物件 SQL 屬性的同義詞，您應該使用 Recordset 物件 Open 方法的 Source 敘述以做為替代。

範例

這個範例是針對 authors 表格所執行的一項查詢，該表格存在於名為 YourServer 伺服器上的 pubs 資料庫中。遠端資料來源與遠端伺服器的名稱都在 Connection 物件的 Open 方法中提供，而 SQL 查詢則在 Recordset 物件的 Open 方法中指定。執行後，Recordset 物件會被傳回、編輯、並被用來更新資料來源。

Dim rs as New ADODB.Recordset
Dim cn as New ADODB.Connection
cn.Open     "Provider=MS Remote;Data Source=pubs;" & _
            "Remote Server=http://YourServer"
rs.Open "SELECT * FROM authors", cn
...                                'Edit the recordset
rs.UpdateBatch                    'Equivalent of RDS SubmitChanges
...


Microsoft Cursor Service for OLE DB (ADO Service Component)

Microsoft Cursor Service for OLE DB

Microsoft Cursor Service for OLE DB 服務元件可以補充資料提供者的資料指標支援功能。結果，使用者可以從所有資料提供者上，感受到相對統一化的功能性。

Cursor Service for OLE DB 服務元件讓動態屬性變得可以使用，而且強化了特定方法的行為。舉例來說，Optimize 動態屬性可以產生暫時性的索引檔，來加快特定運算的速度，像 Find 的方法就是一個例子。

這項 Cursor Service for OLE DB 服務元件可以支援所有狀況中的批次更新作業。當某個資料提供者只可以提供比較不夠威力的資料指標時，像是只能提供靜態的資料指標，它也可以模擬更有威力的資料指標類型，像是動態資料指標。

Keyword

如果要啟動這項元件，請將 Recordet 或 Connection 物件的屬性設定為 adUseClient。

connection.CursorLocation=adUseClient
recordset.CursorLocation=adUseClient

動態屬性

當 Cursor Service for OLE DB 被啟動時，底下的動態屬性會被加到 Recordset 物件的 Properties 集合物件中。

動態屬性名稱 | 說明
Handler (RDS) | 表示伺服器端在 RDSServer.DataFactory 的自訂支援是否被啟動。
Name | 表示 Recordset 的名稱。可能在目前、或後續的資料成形指令中被參考。
Optimize | 表示是否應該建立索引。當設定為 True 的時候，則允許產生暫時性的索引，來改善特定運算的執行速度。
Resync Command | 當 Unique Table 屬性在實施時，指定被 Resync 方法所使用的自訂指令字串。
Unique Catalog | 表示包含在 Unique Table 屬性中被參考的表格的資料庫名稱。
Unique Schema | 表示在 Unique Table 屬性中被參考的表格擁有者的名稱。
Unique Table | 表示在 Recordset 中某個表格的名稱，這個 Recordset 物件是由多重表格所產生的，可透過新增、更新、或刪除的運算予以修改。
Update Resync | 當 Unique Table 屬性在實施時，指定在 UpdateBatch （以及它的行為）方法之後，Resync 方法是否被暗中啟動。

您也可以透過將它的名稱指定為 Properties 屬性的索引，對動態屬性進行設定與擷取的動作。比方說，取得並列印 Optimize 動態屬性的目前值，然後設定新的數值如下：
Debug.Print rs.Properties("Optimize")
rs.Properties("Optimize") = True

內建屬性作業方式

Cursor Service for OLE DB 也會影響某些特定內建屬性的行為。

屬性名稱 | 說明
CursorType | 補充適用於 Recordset 的資料指標類型。
LockType | 補充適用於 Recordset 的鎖定類型。並提供批次更新的功能。
Sort | 指定一個、或一個以上 Recordset 的排序欄位名稱，並指定某個欄位要以遞增、或遞減的方式排序。

方法作業方式

Cursor Service for OLE DB 可啟動、或影響enables or affects the behavior of the Field 物件的 Append 方法；以及 Recordset 物件的 Open, Resync, UpdateBatch, 與 Save 方法的行為。


學習 ADO

請使用下列小節來學習如何使用 ADO 和 RDS。

  • 教學課程

  • RDS 範例應用程式

  • RDS Developer's Guide

  • ADO 程式碼範例


ADO和RDS教學課程

  • ADO 教學課程

  • RDS 教學課程. 此教學課程舉例說明如何使用 RDS 程式化模組來查詢並更新資料來源。

  • 建立簡單的 Remote Data Service 應用程式。此教學課程會帶領您建立簡單的 Remote Data Service 應用程式，以便存取Microsoft (R) Access 資料庫內的現存資料。

  • 通訊錄。此教學課程會教您如何建立簡單的 Remote Data Service 應用程式，以便存取和更新 Microsoft(R) SQL Server(TM) 資料庫。


ADO 教學課程

  • ADO 教學課程

此教學課程教您使用 ADO 程式設計模式來查詢與更新資料來源。首先，教學課程會說明完成此工作所需的步驟。接著，教學課程會重覆以 Microsoft (R) Visual Basic (R)；Microsoft (R) Visual C++ (R)，VC++ Extensions；Microsoft (R) Visual Basic (R)，Scripting Edition；與Microsoft(R) Visual J++ (TM)，ADO for Windows Foundation Classes (ADO/WFC) 等程式語言來進行。

由於以下兩項因素，此教學課程以不同的語言來撰寫程式碼：

  • ADO 的說明文件假設讀者以 Visual Basic 來撰寫程式。如此可便於 Visual Basic 的程式設計師使用說明文件，不過對使用其他語言的程式設計師則無甚幫助。

  • 若您無法確定某一 ADO 功能，而您略通其他語言，則查看同一功能在其他語言的表示方法，也許有助於解決您的問題。

教學課程的呈現方式

此教學課程是根據 ADO 程式設計模式。它個別討論程式設計的每個步驟。除此之外，它還以 Visual Basic 程式碼片段來說明每個步驟。最後，則重新說明並整合程式碼片段，成為一個 Visual Basic 範例。

程式碼範例會以其他語言來重覆表示，但不會有討論的資訊。在程式設計語言教學課程中的每個步驟，都標示程式設計模式與說明的教學課程中的相關步驟。請使用步驟的編號，來參照教學課程中的討論資訊。

由於此教學課程是由一些小的程式碼片段所組成，因此您無法執行課程中的這些程式碼。

ADO 程式設計模式說明如下。請利用它作為教學課程的藍圖。

ADO 物件程式設計模式

  • 連接至資料來源 (Connection)。您可以選擇性地開始交易。

  • 您可以選擇性地建立物件，以代表 SQL 指令 (Command)。

  • 您可以選擇性地以 SQL 指令的變數參數指定資料欄、表格，與數值 (Parameter)。

  • 執行指令 (Command、Connection，或 Recordset)。

  • 若指令傳回整列資料，將資料列儲存在儲存物件 (Recordset)。

  • 您可以選擇性地建立儲存物件的檢視，以便排序、篩選，與巡覽資料 (Recordset)。

  • 新增、刪除，或改變行列的方式來編輯資料 (Recordset)。

  • 若合適時，以儲存物件中的變更來更新資料 (Recordset)。

  • 若使用交易，則須接受或拒絕交易期間所做的變更。結束交易 (Connection)。

下一步 步驟 1


步驟 1：開啟連接 (ADO 教學課程)

本步驟的工作

  • 連接資料來源。

  • 您可以選擇性地建立物件，以代表 SQL 查詢指令。

  • 您可以選擇性地以 SQL 指令的變數參數來指定資料值。

  • 執行指令。若指令傳回整列資料，則將資料列儲存在儲存物件。

  • 您可以選擇性地巡覽、檢視、操控，與編輯資料。

  • 若合適時，以儲存物件中的變更來更新資料。您可以選擇性地在交易中嵌入更新資訊。

  • 若使用交易，則須接受或拒絕交易期間所做的變更。

討論

您必須要有建立交換資料必須條件的方法；也就是連接。您連接的資料來源指定於連接字串，但在連接字串中所指定的參數可因每個提供者與資料來源而異。

ADO 開啟連接的主要方法是 Connection.Open 方法。您也可以用不同的方法，呼叫 Recordset.Open 捷徑方法，在同一作業中開啟連接，並經由連接發出指令。以下為每種方法在 Visual Basic 中的語法：

connection.Open ConnectionString, UserID, Password, OpenOptions
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

比較這兩種方法可了解 ADO 方法運算元一般的特性。

ADO 提供數種便捷的方法來指定運算元。例如，Recordset.Open 利用 ActiveConnection 運算元，它可以是實際上的 [字串]、代表字串的變數，或代表開啟連接的 Connection 物件。

物件大多數的方法都具有在方法運算元遺漏時，仍然能提供引數的屬性。在 Connection.Open 中，您可以省略顯性的 ConnectionString 運算元，而將 ConnectionString 屬性設定為 "DSN=pubs;uid=sa;pwd=;database=pubs"，以隱性的方式提供所需的資訊。

相反地，在連接字串中的 uid 與 pwd 關鍵字運算元，可設定為 Connection 物件 UserID 與 Password 參數。

此教學課程以顯性的連接字串來啟動 Connection.Open 方法。資料來源可以是 Open Database Connectivity (ODBC) pubs 資料庫，此為 Microsoft SQL Server 所附帶的測試資料庫。(定義 [資料來源名稱] (DSN) 時，指定資料來源的實際位置，例如本區磁碟機或遠端伺服器)。

connection.Open "DSN=pubs;uid=sa;pwd=;database=pubs"

下一步 步驟 2


步驟 2：建立指令 (ADO 教學課程)

本步驟的工作

  • 建立連接至資料來源。

  • 您可以選擇性地建立物件，以代表 SQL 查詢指令。

  • 您可以選擇性地以 SQL 指令的變數參數指定數值。

  • 執行指令。若指令傳回整列資料，則將資料列儲存在儲存物件。

  • 您可以選擇性地巡覽、檢視、操控，與編輯資料。

  • 若合適時，以儲存物件中的變更來更新資料。您可以選擇性地在交易中嵌入更新資訊。

  • 若使用交易，則須接受或拒絕交易期間所做的變更。結束交易。

討論

查詢指令要求資料來源傳回 Recordset 物件，其中包含了所要求資訊的資料列。指令通常是以 SQL 來撰寫。

  1. 如前文所述，command string 之類的運算元可代表：
    • 實際上的字串，或代表字串的變數。此教學課程可利用指令字串 "SELECT * from authors"，查詢 pubs 資料庫 authors 表格中的全部資訊。

    • 代表指令字串的物件。在此例中，Command 物件 CommandText 屬性的值設定為指令字串。
      Command cmd = New ADODB.Command;
cmd.CommandText = "SELECT * from authors"
  2. 以 '?' 預留位置指定參數化的指令字串。

    SQL 字串的內容是固定不變的。不過，您可以建立參數化指令，其中 '?' 預留位置子字串在指令執行時，以參數來取代。

    您可以用 Prepared 屬性來最佳化參數化指令的效能。您可以重覆發出這些指令，每次只改變其中一個參數。

    例如，以下指令字串查詢所有姓氏為 "Ringer" 的作者：

    Command cmd = New ADODB.Command
cmd.CommandText = "SELECT * from authors WHERE au_lname = ?"
  3. 指定 Parameter 物件。將它附加至 Parameters 集合物件。

    每個 '?' 預留位置是由相對在 Command 物件 Parameters 集合物件的 Parameter 物件的值所取代。以 Ringer 為資料值來建立 Parameter 物件，然後將它附加至 Parameters 集合物件：

    Parameter prm = New ADODB.Parameter
prm.Name = "au_lname"
prm.Type = adVarChar
prm.Direction = adInput
prm.Size = 40
prm.Value = "Ringer"
cmd.Parameters.Append prm
  4. 以 CreateParameter 方法，指定並附加 Parameter 物件。

    ADO 目前提供便捷替代方法，以建立 Parameter 物件，並在同一步驟中將它附加至 Parameters 集合物件。

    cmd.Parameters.Append cmd.CreateParameter _
"au_lname", adVarChar, adInput, 40, "Ringer"

    不過，此教學課程不會使用參數化的指令，因為您必須使用 Command.Execute 方法來取代 ‘?’ 預留位置的參數。但該方法不允許使用者指定 Recordset 指標類型與鎖住選項。因此，請使用此程式碼：

    Command cmd = New ADODB.Command;
cmd.CommandText = "SELECT * from authors"

此為 authors 表格的結構敘述，提供您做為參考：

資料欄名稱 | 資料型態 (長度) | 是否可空白
au_id | ID (11) | 否
au_lname | varchar(40) | 否
au_fname | varchar(20) | 否
Phone | char(12) | 否
Address | varchar(40) | 是
City | varchar(20) | 是
State | char(2) | 是
Zip | char(5) | 是
Contract | bit | 否

下一步 步驟 3


步驟 3：執行指令 (ADO 教學課程)

本步驟的工作

  • 建立連接至資料來源。

  • 您可以選擇性地建立物件，以代表 SQL 查詢指令。

  • 您可以選擇性地以 SQL 指令的變數參數指定數值。

  • 執行指令。若指令傳回整列資料，則將資料列儲存在儲存物件。

  • 您可以選擇性地巡覽、檢視、操控，與編輯資料。

  • 若合適時，以儲存物件中的變更來更新資料。您可以選擇性地在交易中嵌入更新資訊。

  • 若使用交易，則須接受或拒絕交易期間所做的變更。結束交易。

討論

傳回 Recordset 的三種方法為 Connection.Execute、Command.Execute，與 Recordset.Open。此為這些方法在 Visual Basic 中的語法：

connection.Execute(CommandText, RecordsAffected, Options)
command.Execute(RecordsAffected, Parameters, Options)
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

這些方法已經加以最佳化，可充份利用其特殊物件的優點。

在發出指令前，您必須先開啟連接。每種方法所發出代表連接的指令都不相同：

  • Connection.Execute 方法所使用的連接是由 Connection 物件本身所包含。

  • Command.Execute 方法則在其 ActiveConnection 屬性中使用 Connection 物件集。

  • Recordset.Open 方法指定連接字串或 Connection 物件運算元，或在其 ActiveConnection 屬性使用 Connection 物件集。

三種方法中指定指令的方式也各有不同：

  • 在 Connection.Execute 方法，指令為字串。

  • 在 Command.Execute 方法，指令無法檢視，而是指定於 Command.CommandText 屬性。且指令能包含參數符號 (‘?’)，由 Parameters VARIANT 陣列引數的相關參數所取代。

  • 在 Recordset.Open 方法，指令為 Source 引數，它可以是字串或 Command 物件。

每種方法各有其功能性與效能的優缺點：

  • Execute 方法主要是用來 (但不僅限於此用途) 執行不會傳回資料的指令。

  • 兩種 Execute 方法皆快速傳回唯讀指標、順向 Recordset 物件。

  • Command.Execute 方法允許您使用參數化指令，以便在重覆使用時有較高的效率。

  • 在另一方面，Open 方法允許您指定 CursorType (用來存取資料的策略與物件) 與 LockType (指定從其他使用者 isolation 的程度，以及指標是否支援 immediate 或 batch modes 的更新)。

  • 建議您詳細研究這些選項；其中包含了許多 Recordset 的功能。

此教學課程使用動態指標，批次處理對於 Recordset 所做的變更。因此，請使用以下程式碼：

Recordset rs = New ADODB.Recordset
rs.Open cmd, conn, adOpenDymanic, adLockBatchOptimistic

下一步 步驟 4


步驟 4：操控資料 (ADO 教學課程)

本步驟的工作

  • 建立連接至資料來源。

  • 您可以選擇性地建立物件，以代表 SQL 查詢指令。

  • 您可以選擇性地以 SQL 指令的變數參數指定數值。

  • 執行指令。若指令傳回整列資料，則將資料列儲存在儲存物件。

  • 您可以選擇性地巡覽、檢視、操控，與編輯資料。

  • 若合適時，以儲存物件中的變更來更新資料。您可以選擇性地在交易中嵌入更新資訊。

  • 若使用交易，則須接受或拒絕交易期間所做的變更。結束交易。

討論

Recordset 物件方法與屬性主要是用來檢視、巡覽，與操控 Recordset 的資料列。

Recordset 可視為資料列的陣列。您在某一時間所能檢視與操控的資料列為目前資料列，而您在 Recordset 中的位置為目前資料列位置。當您移至其他資料列時，該資料列即成為目前資料列。

有數種方法可以顯性的方式在 Recordset 移動或 "巡覽" (Move 方法)。有些方法 (Find 方法) 則是在其作業中，連帶產生移動的功能。除此之外，設定特定屬性 (Bookmark 屬性) 也可改變資料列位置。

Filter 屬性可用來控制您所能存取的資料列 (也就是您看得到的資料列)。Sort 屬性控制您在 Recordset 中巡覽資料列的次序。

Recordset 具有 Fields 集合物件，這是一組 Field 物件的集合，以資料列來代表欄位或資料欄。從 Field 物件的 Value 屬性，指定或取回欄位的資料。您可以選擇是否要以整批的方式 (GetRows 與 Update 方法) 來存取欄位資料。

在此教學課程中，您將會：

  • 取得區域號碼為 "415"，且局號以 "5" 為開頭的電話號碼，然後將區域號碼改為虛構的 "777"。

  • 設定 au_lname Field 物件 Properties 集合物件的 Optimize 屬性，以改進排序與篩選的效能。

  • 根據作者姓氏來 排序 Recordset。

  • 篩選 Recordset，使可存取資料列 (也就是看得見的資料列) 作者的區域號碼為 "415"，局號則以 "5" 為開頭。

使用 Move 方法，在排序、篩選過的 Recordset 中，從頭巡覽到底。當 Recordset EOF 屬性指示您已到達最後一列資料，即停止巡覽。在 Recordset 中移動時，顯示作者的姓氏與名字，以及原始的電話號碼，然後將 phone 欄位中的區域號碼改為 "777" (在 phone 欄位中的電話號碼是以 "aaa xxx-yyyy" 的形式來表示，其中 aaa 代表區域號碼，xxx 則是局號)。

rs("au_lname").Properties("Optimize") = TRUE
rs.Sort = "au_lname ASC"
rs.Filter = "phone LIKE '415 5*'"
rs.MoveFirst
Do While Not rs.EOF
    Debug.Print "Name: " & rs("au_fname") & " " rs("au_lname") & _
        "Phone: "rs("phone") & vbCr
    rs("phone") = "777" & Mid(rs("phone"), 5, 11)
    rs.MoveNext
Loop

下一步 步驟 5


步驟 5：更新資料 (ADO 教學課程)

本步驟的工作

  • 建立連接至資料來源。

  • 您可以選擇性地建立物件，以代表 SQL 查詢指令。

  • 您可以選擇性地以 SQL 指令的變數參數指定數值。

  • 執行指令。若指令傳回整列資料，則將資料列儲存在儲存物件。

  • 您可以選擇性地巡覽、檢視、操控，與編輯資料。

  • 若合適時，以儲存物件中的變更來更新資料。您可以選擇性地在交易中嵌入更新資訊。

  • 若使用交易，則須接受或拒絕交易期間所做的變更。結束交易。

討論

您剛剛已經變更過 Recordset 中的數列資料。ADO 支援兩種有關資料列新增、刪除，與修改的作法。

第一種作法在變更資料時，不會立即應用至 Recordset；而是存在內部的複製暫存區。若您決定放棄所做的變更，則複製暫存區中的修改將廢棄不用。若決定保留變更，則複製暫存區的修改即套用至 Recordset。

第二種作法則是在宣告資料列工作完成時 (也就是即時模式)，立即將變更傳送至資料來源，或是集合所有資料列集的變更，在宣告完成資料列集時套用 (也就是批次模式)。這些模式是由 CursorLocation 與 LockType 屬性所掌控。

在即時模式，每次啟動 Update 方法即將變更傳送至資料來源。在批次模式，每次啟動 Update 或移動目前資料列位置時，將變更儲存至 Recordset，但只有 UpdateBatch 方法會將變更傳送到資料來源。您若是以批次模式開啟 Recordset，即以批次模式來更新。

注意 有一個 Update 的便捷表單，可在單一步驟中，將變更套用至欄位，或將變更陣列套用至欄位陣列，然後執行更新。

您可以選擇性地在交易中執行更新。實際上，您會使用交易來確認數個相依的作業皆成功地執行，否則即取消所有的作業。在此例中，交易則非必要。

交易通常會長時間配置在資料來源，並掌控有限的資源。因此，建議交易應該要愈短愈好 (這就是此教學課程不在您連接時立即開始交易的原因)。

在此教學課程，請在一個交易中集合您的批次更新：

conn.BeginTrans
rs.UpdateBatch
...

下一步 步驟 6


步驟 6：結束更新 (ADO 教學課程)

本步驟的工作

  • 建立連接至資料來源。

  • 您可以選擇性地建立物件，以代表 SQL 查詢指令。

  • 您可以選擇性地以 SQL 指令的變數參數指定數值。

  • 執行指令。若指令傳回整列資料，則將資料列儲存在儲存物件。

  • 您可以選擇性地巡覽、檢視、操控，與編輯資料。

  • 若合適時，以儲存物件中的變更來更新資料。您可以選擇性地在交易中嵌入更新資訊。

  • 若使用交易，則須接受或拒絕交易期間所做的變更。結束交易。

討論

假若批次更新在結束產生錯誤，則必須根據錯誤的特性與嚴重性，以及應用程式的邏輯來決定解決的方法。不過，若資料庫與其他使用者共用，則常見的典型錯誤是有其他人在您之前修改了欄位。這類錯誤稱為衝突。ADO 會偵測此狀況並回報錯誤。

在此教學課程中，這個步驟有兩部份：若無更新錯誤，則認可交易。如此即結束更新。

如果有錯誤，則進入錯誤處理的程序。以 adFilterConflictingRecords 常數來篩選 Recordset，以便只顯示衝突的資料列。解決錯誤的策略即列印出作者的姓氏與名字 (au_fname 與 au_lname)。然後復原交易，放棄已成功更新的部份。如此即結束更新。

...
conn.CommitTrans
...
On Error
rs.Filter = adFilterConflictingRecords
rs.MoveFirst
Do While Not rs.EOF
    Debug.Print "Conflict: Name: " & rs("au_fname") " " & rs("au_lname")
    rs.MoveNext
Loop
conn.Rollback
Resume Next
...

教學課程到此結束。


ADO 教學課程 (VB)

Public Sub main()

Dim conn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset
' Step 1
conn.Open "DSN=pubs;uid=sa;pwd=;database=pubs"
' Step 2
Set cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * from authors"
' Step 3
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenStatic, adLockBatchOptimistic
' Step 4
rs("au_lname").Properties("Optimize") = True
rs.Sort = "au_lname"
rs.Filter = "phone LIKE '415 5*'"
rs.MoveFirst
Do While Not rs.EOF
    Debug.Print "Name: " & rs("au_fname") & " "; rs("au_lname") & _
        "Phone: "; rs("phone") & vbCr
    rs("phone") = "777" & Mid(rs("phone"), 5, 11)
    rs.MoveNext
Loop

' Step 5
conn.BeginTrans

'Step 6, part A
On Error GoTo ConflictHandler
rs.UpdateBatch
On Error GoTo 0

conn.CommitTrans

Exit Sub

'Step 6, part B
ConflictHandler:

rs.Filter = adFilterConflictingRecords
rs.MoveFirst
Do While Not rs.EOF
    Debug.Print "Conflict: Name: " & rs("au_fname"); " " & rs("au_lname")
    rs.MoveNext
Loop
conn.Rollback
Resume Next

End Sub

Visual Basic 教學課程到此結束。


ADO 教學課程 (VC++)

此教學課程是有關新的 Microsoft (R) Visual C++ (R) Extensions。VC++ Extensions 刪除使用累贅的 VARIANT 資料型態。

此教學課程也使用 #import 指令，它將 ADO typelib 轉換為前置資料檔。前置資料檔可使部份 ADO 功能轉換成用法與外觀相似的 Microsoft Visual Basic 功能。

注意 此範例所發佈與使用的聯結巨集已經與第一次所使用的不同。請參見 header 檔 (icrsint.h)，取得目前的巨集定義。

#define INITGUID
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
#include "icrsint.h"

void dump_com_error(_com_error &e)
    {
    printf("Error\n");
    printf("\a\tCode = %08lx\n", e.Error());
    printf("\a\tCode meaning = %s", e.ErrorMessage());
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    printf("\a\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);
    }

class CCustomRs :
    public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_lname,
            sizeof(m_szau_lname), lau_lnameStatus, false)
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_fname,
            sizeof(m_szau_fname), lau_fnameStatus, false)
    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szphone,
            sizeof(m_szphone),    lphoneStatus,    true)
END_ADO_BINDING()

public:
    CHAR    m_szau_lname[41];
    ULONG    lau_lnameStatus;
    CHAR    m_szau_fname[41];
    ULONG    lau_fnameStatus;
    CHAR    m_szphone[12];
    ULONG    lphoneStatus;
};

VOID    main()
    {
    HRESULT                hr;
    IADORecordBinding    *picRs = NULL;

    ::CoInitialize(NULL);

    try
        {
        _ConnectionPtr pConn("ADODB.Connection.1.5");
        _RecordsetPtr pRs("ADODB.Recordset.1.5");
        CCustomRs rs;

//STEP 1: open the connection

        pConn->Open("dsn=pubs;", "sa", "", adConnectUnspecified);

//STEP 2: Create a command

// Step 3: Execute the command

        pRs->Open("select * from authors"            _variant_t(pConn),
            adOpenDynamic, adLockOptimistic, adCmdText);

        if (FAILED(hr = pRs->QueryInterface(__uuidof(IADORecordBinding),
                (LPVOID*)&picRs)))
            _com_issue_error(hr);

        if (FAILED(hr = picRs->BindToRecordset(&rs)))
            _com_issue_error(hr);

// Step 4: Manipulate the data

        pRs->Fields->GetItem("au_lname")->Properties->GetItem("Optimize")->Value = true;
        pRs->Sort = "au_lname ASC";
        pRs->Filter = "phone LIKE '415 5*'";

        pRs->MoveFirst();
        while (VARIANT_FALSE == pRs->EndOfFile)
            {
            printf("\a\tName: %s\t %s\tPhone: %s\n",
                (rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
                (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""),
                (rs.lphoneStatus == adFldOK ? rs.m_szphone   : ""));

            if (rs.lphoneStatus == adFldOK)
                memcpy(rs.m_szphone, "777", 3);

            if (FAILED(hr = picRs->Update(&rs)))
                _com_issue_error(hr);

        // Change the current row of the Recordset.
        // Recordset data for the new current row will automatically be
        // extracted and placed in the CCustomRs C++ instance variables.

            pRs->MoveNext();
            }
        pRs->Filter = (long) adFilterNone;

// Step 5: Update the data

        pConn->BeginTrans();
        try
            {
            pRs->UpdateBatch(adAffectAll);

            // Step 6, part A: Conclude the update
            pConn->CommitTrans();
            }

        catch (_com_error)
            {
            // Step 6, part B: Conclude the update
            pRs->Filter = (long) adFilterConflictingRecords;
            pRs->MoveFirst();
            while (VARIANT_FALSE == pRs->EndOfFile)
                {
                printf("\a\tConflict: Name = %s\t %s\n",
                    (rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
                    (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""));
                pRs->MoveNext();
                }
            pConn->RollbackTrans();
            }
        }

    catch (_com_error &e)
        {
        dump_com_error(e);
        }
    try
            {
            pRs->UpdateBatch(adAffectAll);

            // Step 6, part A: Conclude the update
            pConn->CommitTrans();
            }

        catch (_com_error)
            {
            // Step 6, part B: Conclude the update
            pRs->Filter = (long) adFilterConflictingRecords;
            pRs->MoveFirst();
            while (VARIANT_FALSE == pRs->EndOfFile)
                {
                printf("\a\tConflict: Name = %s\t %s\n",
                    (rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
                    (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""));
                pRs->MoveNext();
                }
            pConn->RollbackTrans();
            }
        }

    CoUninitialize();
    }

VC++ 教學課程到此結束。


ADO 教學課程 (VJ++)

此教學課程是有關新的 ADO/WFC。

ASCimport com.ms.wfc.data.*;

/**
* ADOTutorial:
* Purpose: Demonstrates the usage of Ado in Java.
*          opens a recordset through a command object
*          and illustrates update within a transaction
*/
public class ADOTutorial
{
    public static String strConn = "Driver={SQL Server};SERVER=JDO_ODIN;DATABASE=JetQA;UID=testmod;PWD=testmod;";//odbc type conn string

    public static void main(String args[] )
    {
        try
        {
            Connection conn = new Connection();
            Command cmd = new Command();
            Recordset rs = new Recordset();

            int actErrorNum = 0;
            Field fld;
            AdoProperties fldProps;

// STEP1: Open the connection
            conn.open(strConn);

// STEP 2: Create a command

cmd.setActiveConnection(conn);

            cmd.setCommandText("SELECT * from authors");

//Step 3: Open the recordset with the source as a command object

                        rs.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rs.setCursorType(AdoEnums.CursorType.DYNAMIC);
            rs.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rs.open (cmd);

// STEP 4: Manipulate the data
            fldProps  = rs.getField("au_lname").getProperties();

                             fldProps.getItem("Optimize").setBoolean(true);

            rs.setSort("au_lname");

            rs.setFilter("phone like '415*'");

            rs.moveFirst();

            while ( !rs.getEOF())

            {
                StringBuffer strBuf = new StringBuffer();
                System.out.println( " Name: " + rs.getField("au_fname").getString() +
                    "  " + rs.getField("au_lname").getString() +
                    "   Phone : " + rs.getField("phone").getString() );

                //change the area code 415 to 779 for the field
                fld =  rs.getField("phone");

                strBuf.append( fld.getString());

                strBuf.setCharAt(0, '7');
                strBuf.setCharAt(1, '7');
                strBuf.setCharAt(2,  '9');

                //set the field to the new value
                fld.setString(strBuf.toString());

                rs.moveNext();

            }

// STEP5: Update the set field values
            conn.beginTrans();

                 //STEP6 Part A: Conclude the Update
            try
            {

                rs.updateBatch();
                conn.commitTrans();

            }
// STEP6: Conclude the Update

            catch(com.ms.wfc.data.AdoException ex)
            {

              //error has occured we have to rollback
              //transaction
                rs.setFilter(new Integer                                (AdoEnums.FilterGroup.CONFLICTINGRECORDS));
                rs.moveFirst();

                while(!rs.getEOF())
                {
                    //print conflicting records
                    System.out.println(" Conflict : Name : "+ rs.getField("au_fname").getString() + " " +
                        rs.getField("au_lname").getString() );

                    rs.moveNext();
                }
                conn.rollbackTrans();
            }
               System.out.println("type any character to continue...");
           System.in.read();

        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

VJ++ 教學課程到此結束。


RDS 教學課程

此教學課程教您使用 RDS 程式設計模式來查詢與更新資料來源。首先，教學課程會說明完成此工作所需的步驟。接著，教學課程會重覆以 Microsoft (R) Visual Basic (R)，Scripting Edition；與Microsoft(R) Visual J++ (TM)，ADO for Windows Foundation Classes (ADO/WFC) 等程式語言來進行。

由於以下兩項因素，此教學課程以不同的語言來撰寫程式碼：

  • RDS 的說明文件假設讀者以 Visual Basic 來撰寫程式。如此可便於 Visual Basic 的程式設計師使用說明文件，不過對使用其他語言的程式設計師則無甚幫助。

  • 若您無法確定某一 RDS 功能，而您略通其他語言，則查看同一功能在其他語言的表示方法，也許有助於解決您的問題。

教學課程的呈現方式

此教學課程是根據 RDS 程式設計模式。它個別討論程式設計的每個步驟。除此之外，它還以 Visual Basic 程式碼片段來說明每個步驟。

程式碼範例會以其他語言來重覆表示，並附上基本的討論資訊。在程式設計語言教學課程中的每個步驟，都標示程式設計模式與說明的教學課程中的相關步驟。請使用步驟的編號，來參照教學課程中的討論資訊。

RDS 程式設計模式說明如下。請利用它作為教學課程的藍圖。

RDS 物件程式設計模式

  • 指定在伺服器上所要啟動的程式，並設法 (proxy) 從用戶端參照至伺服器。

  • 啟動伺服器程式。將參數傳至識別資料來源與發出指令的伺服器程式。

  • 伺服器通常利用 ADO 從資料來源取得 Recordset 物件。您可以選擇讓 Recordset 物件在伺服器上處理。

  • 伺服器程式將最終的 Recordset 傳回用戶端應用程式。

  • 在用戶端，可選擇將 Recordset 物件放入表單，以便利用視覺控制的方式來處理。

  • 對 Recordset 物件所做的變更會送回伺服器，並用來更新資料來源。

下一步 步驟 1


步驟 1：指定伺服器程式 (RDS 教學課程)

本步驟的工作

  • 指定在伺服器上所要啟動的程式，並取得 proxy 。

  • 將參數傳至識別資料來源與發出指令的伺服器程式。

  • 伺服器通常利用 ADO 從資料來源取得 Recordset 物件。

  • 伺服器程式將最終的 Recordset 傳回用戶端應用程式。

  • 在用戶端，可選擇將 Recordset 物件放入表單，以便利用視覺控制的方式來處理。

  • 對 Recordset 物件所做的變更會送回伺服器，並用來更新資料來源。

討論

在大多數的一般狀況下，請使用 RDS.DataSpace 物件 CreateObject 方法來指定預設的 RDSServer.DataFactory 伺服器程式，或指定自訂的伺服器程式 (business 物件)。伺服器程式會在伺服器上啟動，並傳回伺服器程式或 proxy 的引用。

此教學課程使用預設的伺服器程式：

Sub RDSTutorial1()
Dim DS as New RDS.DataSpace
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
...

下一步 步驟 2


步驟 2：啟動伺服器程式 (RDS 教學課程)

本步驟的工作

  • 指定在伺服器上所要啟動的程式，並取得 proxy 。

  • 將參數傳至識別資料來源與發出指令的伺服器程式。

  • 伺服器通常利用 ADO 從資料來源取得 Recordset 物件。

  • 伺服器程式將最終的 Recordset 傳回用戶端應用程式。

  • 在用戶端，可選擇將 Recordset 物件放入表單，以便利用視覺控制的方式來處理。

  • 對 Recordset 物件所做的變更會送回伺服器，並用來更新資料來源。

討論

在用戶端 proxy 上啟動方法時，實際在伺服器上的程式會執行方法。在此步驟，您將會在伺服器上執行查詢。

A 部份 若在此教學課程中您不是使用 RDSServer.DataFactory，則執行此步驟最簡單的方法是利用 RDS.DataControl 物件。RDS.DataControl 結合建立 proxy 的前一步驟，以及本步驟的發出查詢。

設定 RDS.DataControl 物件的 Server 屬性，指定要啟動的伺服器程式所在位置；Connect 屬性指定連接字串，以存取資料來源；SQL 屬性指定查詢指令文字。然後發出 Refresh 方法，使伺服器程式連接資料來源、取回查詢所指定的資料列，並將 Recordset 物件傳回用戶端。

此教學課程不使用 RDS.DataControl，但使用 RDS.DataControl 時，則如下所示：

Sub RDSTutorial2A()
Dim DC as New RDS.DataControl
DC.Server = "http://yourServer"
DC.Connect = "DSN=pubs"
DC.SQL = "SELECT * FROM authors"
DC.Refresh
...

此教學課程不會以 ADO 物件來啟動 RDS，不過若是如此執行時，則如下所示：

Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM authors", "Provider=MS Remote;Data Source=pubs;Remote Server=http://YourServer"

B 部份 執行此步驟的一般方法是啟動 RDSServer.DataFactory 物件 Query 方法。此方法會利用連接字串來連接資料來源，以及利用指令文字來指定資料來源所傳回的資料列。

此教學課程使用 RDSServer.DataFactory Query 方法：

Sub RDSTutorial2B()
Dim DS as New RDS.DataSpace
Dim DF
Dim RS as ADODB.Recordset
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query ("DSN=pubs", "SELECT * FROM authors")
...

下一步 步驟 3


步驟 3：伺服器取得 Recordset (RDS 教學課程)

本步驟的工作

  • 指定在伺服器上所要啟動的程式，並取得 proxy 。

  • 將參數傳至識別資料來源與發出指令的伺服器程式。

  • 伺服器通常利用 ADO 從資料來源取得 Recordset 物件。

  • 伺服器程式將最終的 Recordset 傳回用戶端應用程式。

  • 在用戶端，可選擇將 Recordset 物件放入表單，以便利用視覺控制的方式來處理。

  • 對 Recordset 物件所做的變更會送回伺服器，並用來更新資料來源。

討論

伺服器程式使用連接字串與指令文字，在資料來源中查詢所要的資料列。ADO 通常用來取回此 Recordset，不過其他 OLE DB 之類的 Microsoft 資料存取介面也能執行相同的工作。有關查詢如何執行的詳細說明，請參閱 ADO 教學課程。

自訂的伺服器程式如下所示：

Public Function ServerProgram(conn as String, qry as String) as Object
Dim rs as New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open cn, qry, adOpenUnspecified, adLockUnspecified, _
  adCmdUnspecified
Set ServerProgram = rs
End Function

下一步 步驟 4


步驟 4：伺服器傳回 Recordset (RDS 教學課程)

本步驟的工作

  • 指定在伺服器上所要啟動的程式，並取得 proxy 。

  • 將參數傳至識別資料來源與發出指令的伺服器程式。

  • 伺服器通常利用 ADO 從資料來源取得 Recordset 物件。

  • 伺服器程式將最終的 Recordset 傳回用戶端應用程式。

  • 在用戶端，可選擇將 Recordset 物件放入表單，以便利用視覺控制的方式來處理。

  • 對 Recordset 物件所做的變更會送回伺服器，並用來更新資料來源。

討論

RDS 將取回的 Recordset 物件轉換成表單，以便送回用戶端 (也就是它會引導 Recordset)。實際轉換的表單與傳送的方法必須考慮伺服器位於 Internet 或 intranet、區域網路，或是動態連結程式庫。不過，這些細節不是那麼重要；最重要的是 RDS 可將 Recordset 送回用戶端。

在用戶端，會收到傳回的 Recordset 物件，並指定本區變數。

Sub RDSTutorial4()
Dim DS as New RDS.DataSpace
Dim RS as New ADODB.Recordset    'Optionally, ADOR.Recordset
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query("DSN=pubs", "SELECT * FROM authors")
...

下一步 步驟 5


步驟 5：DataControl 可供使用 (RDS 教學課程)

本步驟的工作

  • 指定在伺服器上所要啟動的程式，並取得 proxy 。

  • 將參數傳至識別資料來源與發出指令的伺服器程式。

  • 伺服器通常利用 ADO 從資料來源取得 Recordset 物件。

  • 伺服器程式將最終的 Recordset 傳回用戶端應用程式。

  • 在用戶端，可選擇將 Recordset 物件放入表單，以便利用視覺控制的方式來處理。

  • 對 Recordset 物件所做的變更會送回伺服器，並用來更新資料來源。

討論

傳回的 Recordset 物件可供使用。您可以如其他 recordset 一樣地檢視、巡覽或編輯傳回的 recordset。您在 recordset 上所能執行的動作因環境而異。Microsoft Visual Basic 與 Visual C++ 具有視覺化的控制項，可直接使用 Recordset，或藉由資料控制項間接地使用 Recordset。

例如，若是要在 Microsoft (R) Internet Explorer 顯示網頁，您可以在視覺化控制項中顯示 Recordset 物件資料。在網頁上的視覺化控制無法直接存取 Recordset 物件，不過可經由 RDS.DataControl 來存取 (也就是連結至) Recordset 物件。當 RDS.DataControl 的 SourceRecordset 屬性設為 Recordset 物件時，即可由視覺化控制項來使用。

(視覺化控制物件必須將其 DATASRC 參數設定為 RDS.DataControl，以及 DATAFLD 屬性設定為 Recordset 物件欄位 (資料欄))。

在此教學課程中，則是設定 SourceRecordset 屬性。

Sub RDSTutorial5()
Dim DS as New RDS.DataSpace
Dim RS as New ADODB.Recordset    'Optionally, ADOR.Recordset
Dim DC as New RDS.DataControl
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query ("DSN=pubs", "SELECT * FROM authors")
DC.SourceRecordset = RS            'Visual controls can now bind to DC.
...

下一步 步驟 6


步驟 6：將變更傳送至伺服器 (RDS 教學課程)

本步驟的工作

  • 指定在伺服器上所要啟動的程式，並取得 proxy 。

  • 將參數傳至識別資料來源與發出指令的伺服器程式。

  • 伺服器通常利用 ADO 從資料來源取得 Recordset 物件。

  • 伺服器程式將最終的 Recordset 傳回用戶端應用程式。

  • 在用戶端，可選擇將 Recordset 物件放入表單，以便利用視覺控制的方式來處理。

  • 對 Recordset 物件所做的變更會送回伺服器，並用來更新資料來源。

討論

若編輯了 Recordset 物件，任何的變更 (也就是新增、改變，或刪除資料列) 皆可送回伺服器。

注意 RDS 預設可利用 ADO 物件與 Microsoft OLE DB Remoting Provider 以隱性的方式來啟動。查詢可傳回 recordset，且編輯過的 recordset 可更新資料來源。此教學課程不會以 ADO 物件來啟動 RDS，不過若是如此執行時，則如下所示：

Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM authors", "Provider=MS Remote;Data Source=pubs;Remote Server=http://YourServer"
...            'Edit the recordset
rs.UpdateBatch    'The equivalent of SubmitChanges
...

A 部份 假設在此例中，您只使用過 RDS.DataControl，且 Recordset 物件目前與RDS.DataControl 關聯。若 Server 與 Connect 屬性設定正確，SubmitChanges 方法將以 Recordset 物件中的變更來更新資料來源。

Sub RDSTutorial6A()
Dim DC as New RDS.DataControl
Dim RS as New ADODB.Recordset    'Optionally, ADOR.Recordset
DC.Server = "http://yourServer"
DC.Connect = "DSN=pubs"
DC.SQL = "SELECT * FROM authors"
DC.Refresh
...
Set RS = DC.Recordset
...                                    'Edit the Recordset
...
DC.SubmitChanges
...

B 部份 另一種替代方法是以 RDSServer.DataFactory 物件來更新伺服器，指定連接與 Recordset 物件。

Sub RDSTutorial6B()
Dim DS as New RDS.DataSpace
Dim RS as New ADODB.Recordset    'Optionally, ADOR.Recordset
Dim DC as New RDS.DataControl
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query ("DSN=pubs", "SELECT * FROM authors")
DC.SourceRecordset = RS            'Visual controls can now bind to DC.
...                                    'Edit the Recordset
blnStatus = DF.SubmitChanges "DSN=pubs", RS

教學課程到此結束。


RDS 教學課程 (VBScript)

此部份以 Microsoft Visual Basic，Scripting Edition 重述 RDS 教學課程。

在此教學課程中，RDS.DataControl 與 RDS.DataSpace 是在設計階段建立的，也就是以如下所示的方法以物件標記來定義：<OBJECT>...</OBJECT>。您也可以在執行階段以 Server.CreateObject 方法來建立。例如，RDS.DataControl 物件可以如下所示的方法來建立：

Set DC = Server.CreateObject("RDS.DataControl")

<!-- RDS.DataControl -->
<OBJECT
ID="DC1" CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E33">
</OBJECT>

<!-- RDS.DataSpace -->
<OBJECT
ID="DS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<SCRIPT LANGUAGE="VBScript">

Sub RDSTutorial()
Dim DF1 as Object

步驟 1—指定伺服器程式

VBScript 能存取 Active Server Pages 可用的 VBScript Request.ServerVariables 方法，找到 IIS Web 伺服器的名稱：

"http://<%=Request.ServerVariables("SERVER_NAME")%>"

不過，在此教學課程中，則使用假想的伺服器名稱 "yourServer"。

注意 請留意 ByRef 引數的資料型態。VBScript 不允許您指定變數型態，因此您必須傳送 Variant。當使用 HTTP 時，RDS 允許您傳送 Variant 至一個以 RDS.DataSpace 物件 CreateObject 方法來啟動 non-Variant 的方法。使用 DCOM 或進行中的伺服器時，須使用戶端與伺服器端的資料型態符合，否則會收到 "Type Mismatch" (資料型態不合) 的錯誤。

Set DF1 = DS1.CreateObject("RDSServer.DataFactory", "http://yourServer")

步驟 2a—以 RDS.DataControl 啟動伺服器程式

此範例僅為註解，示範 RDS.DataControl 的預設的功能為執行指定的查詢。

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DC1">
<PARAM NAME="SQL" VALUE="SELECT * FROM authors">
<PARAM NAME="Connect" VALUE="DSN=Pubs;">
<PARAM NAME="Server" VALUE="http://YourServer/">
</OBJECT>
...
<SCRIPT LANGUAGE="VBScript">

Sub RDSTutorial2A()
Dim RS as New ADODB.Recordset
DC1.Refresh
Set RS = DC1.Recordset
...

步驟 2b—以 RDSServer.DataFactory 啟動伺服器程式

步驟 3—伺服器取得 Recordset

步驟 4—伺服器傳回 Recordset

Set RS = DF1.Query("DSN=pubs", "SELECT * FROM authors")

步驟 5—利用視覺化控制項使 DataControl 可供使用

' Assign the returned recordset to the DataControl.

DC1.SourceRecordset = RS

步驟 6a—以 RDS.DataControl 將變更傳送至伺服器

此範例僅為註解，示範 RDS.DataControl 如何執行更新。

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DC1">
<PARAM NAME="SQL" VALUE="SELECT * FROM authors">
<PARAM NAME="Connect" VALUE="DSN=Pubs;">
<PARAM NAME="Server" VALUE="http://YourServer/">
</OBJECT>
...
<SCRIPT LANGUAGE="VBScript">

Sub RDSTutorial6A()
Dim RS as New ADODB.Recordset
DC1.Refresh
...
Set RS = DC1.Recordset
' Edit the Recordset object...
' The SERVER and CONNECT properties are already set from Step 2A.
Set DC1.SourceRecordset = RS
...
DC1.SubmitChanges

步驟 6b—以 RDSServer.DataFactory 將變更傳送至伺服器

DF.SubmitChanges "DSN=pubs", RS

End Sub
</SCRIPT>
</BODY>
</HTML>

教學課程到此結束。


RDS 教學課程 (VJ++)

ADO/WFC 不完全依照 RDS 物件模式，也就是它不會建置 DataControl 物件。ADO/WFC只會建置用戶端類別 - DataSpace。

DataSpace類別會建立一種方法 - createObject，它會傳回 ObjectProxy 物件。DataSpace 類別也會建置 InternetTimeout 屬性。

ObjectProxy 類別會建置一種方法 - call，它會呼叫任何伺服器端商業物件。

教學課程由此開始。

import com.ms.wfc.data.*;
public class RDSTutorial
{
public void tutorial()
{

// Step 1: Specify a server program

ObjectProxy obj =
DataSpace.createObject(
"RDSServer.DataFactory",
"http://YourServer");

// Step 2: Server returns a Recordset

Recordset rs = (Recordset) obj.call(
"Query",
new Object[] {"DSN=pubs", "SELECT * FROM authors"});

// Step 3: Changes are sent to the server

...                                // Edit Recordset
obj.call(
"SubmitChanges",
new Object[] {"DSN=pubs", rs});
return;
}
}

教學課程到此結束。


建立一個簡單的 Remote Data Service 應用程式

您可以使用 RDS.DataControl 物件來建立一個簡單的 Active Server Pages 檔案，以存取資料庫。

此教學課程原則上會儘量採用最精簡的程式碼，而在設計人員手冊中，會提供更多有關使用 RDS.DataControl 的資訊。此教學課程會讓您連接至 Microsoft (R) Access 資料庫、在資料連結方格中顯示結果集，並新增功能以巡覽 Recordset。下列程序概要說明建立此簡單應用程式所需的步驟。

  1. 指定資料庫。

  2. 插入方格與 RDS.DataControl 物件。

  3. 新增 HTML 控制項。

  4. 新增程式碼以傳送查詢至資料庫。

  5. 新增程式碼以送出變更至資料庫。

  6. 新增程式碼以便在顯示的 Recordset 中移動。

  7. 檢視程式碼執行結果。

若要檢視此樣本應用程式的最終版本，可至 http://<webservername>/MSADC/Samples/ADCTest.asp，<webservername> 是您的 Web 伺服器名稱。


指定資料庫 (RDS)

在建立 .asp 檔案前，您必須在 [控制台] 的 ODBC 中指定資料庫。此範例會讓您使用 Remote Data Service 所提供的 Microsoft (R) Access 資料庫。

  8. 在 Web 伺服器上，開啟 [控制台]。

  9. 按兩下 [ODBC] 圖示，然後按一下 [系統資料來源名稱]。

    共有兩種類型的資料來源：只有您才能使用的 [使用者]，以及所有使用此電腦人員皆可使用的 [系統]。Web 伺服器所使用的資料來源必須是 [系統] 資料來源。

  10. 按一下 [新增]，選擇 [Microsoft Access Driver]，然後按一下 [完成]。

  11. 在 [資料來源名稱] 方塊中輸入 [AdvWorks]，按一下 [選取]。選擇 C:\Program Files\Common Files\System\MSADC\Samples\AdvWorks.mdb 檔案，然後按一下 [確定]。

  12. 按一下 [確定]，關閉對話方塊。

下一步


插入方格與 DataControl 物件 (RDS)

  13. 用文字編輯器開啟 C:\Program Files\Common Files\System\MSADC\Samples\Tutorial 資料夾中的 Tutorial.asp 檔。

  14. 搜尋 "Tutorial: RDS.DataControl Object"。複製下列 script，並貼至註解下方。
    <OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
  ID=ADC HEIGHT=1 WIDTH = 1>
</OBJECT>
  15. 搜尋 "Tutorial: Data Bound Grid Control"。複製下列 script，並貼至註解下方。
    <BR>
<Center>
<OBJECT ID="GRID" WIDTH=600 HEIGHT=200 Datasrc="#ADC"
 CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/ssdatb32.cab"
 CLASSID="CLSID:AC05DC80-7DF1-11d0-839E-00A024A94B3A">
<PARAM NAME="_Version"      VALUE="131072">
<PARAM NAME="BackColor"   VALUE="-2147483643">
<PARAM NAME="BackColorOdd"  VALUE="-2147483643">
<PARAM NAME="ForeColorEven" VALUE="0">
<PARAM NAME="AllowAddNew" VALUE="TRUE">
<PARAM NAME="AllowDelete" VALUE="TRUE">
<PARAM NAME="AllowUpdate" VALUE="TRUE">
</OBJECT>
<BR>

    在方格控制項 OBJECT 標籤的 DATASRC 參數代表資料來源為 RDS.DataControl 物件 ADC。如此可連結傳回的 Recordset，並在 RDS.DataControl 取得 Recordset 時，使方格顯示資料。AllowAddNew、AllowDelete 與 AllowUpdate 參數可讓使用者在方格中新增、改變，與刪除記錄。

下一步


新增 HTML 控制項 (RDS)

  16. 搜尋 "Tutorial: HTML Controls to Get Recordsets"。複製下列 script，並貼至註解下方。
    <BR>
<table>
<tr><td>RDS Server:<td><INPUT NAME=Server SIZE=70>
<tr><td>Connection:<td><INPUT NAME=Connect SIZE=70>
<tr><td>Query:<td><INPUT NAME=SQL SIZE=70>
</table>

    如此可新增文字方塊，讓使用者指定 SQL 查詢以傳送至資料庫 (指定於資料來源名稱)，將中斷的 Recordset 傳回用戶端。

  17. 搜尋 "Tutorial: HTML Controls to Navigate the Recordset and Run the Query"。複製下列 script，並貼至註解下方。
    <BR>
<BR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run!" >
<INPUT TYPE=BUTTON NAME="First" VALUE="First" >
<INPUT TYPE=BUTTON NAME="Next" VALUE="Next" >
<INPUT TYPE=BUTTON NAME="Prev" VALUE="Previous" >
<INPUT TYPE=BUTTON NAME="Last" VALUE="Last" >
<INPUT TYPE=BUTTON NAME="Submit" VALUE="Submit Changes" >
</CENTER>

    [First]、[Next]、[Previous]，與 [Last] 按鈕可讓使用者在顯示的 Recordset 中移動。

下一步


新增程式碼以傳送查詢至資料庫 (RDS)

搜尋 "Tutorial: Send a Query to the Database"。複製下列 script，並貼至註解下方。

SUB Run_OnClick
    ADC.Server = Server.Value
    ADC.Connect = Connect.Value
    ADC.SQL = SQL.Value

    ADC.Refresh
END SUB

注意 當您經由 Connect 屬性指定資料來源時，通常是提供資料來源名稱、使用者 ID 與密碼 (例如，"DSN=SalesDB;UID=Manager;PWD=secret;")。使用 Microsoft Access 資料庫時，則不用指定使用者 ID (UID) 或密碼 (PWD)。

下一步


新增程式碼以送出變更至資料庫 (RDS)

搜尋 "Tutorial: Submit Changes to the Database"。複製下列 script，並貼至註解下方。

SUB Submit_OnClick  ' Submit Changes button clicked.
  ADC.SubmitChanges ' Send changes to the DBMS.
  ADC.Refresh       ' Refresh the recordset.
End Sub

當 ADC.SubmitChanges 執行時，Remote Data Service 會包裝所有更新的資訊，並經由 HTTP 傳送給伺服器。更新的原則是全有或全無；亦即如果部份更新失敗，則不做任何的變更，並傳回狀態訊息。

下一步


新增程式碼以便在顯示的 Recordset 中移動 (RDS)

您可以在 RDS.DataControl 物件中，以 Move 方法配合使用 Recordset，以便在網頁資料連結控制項中所顯示的資料記錄中移動。例如，假若您利用連結 RDS.DataControl 物件的方式，在方格中顯示 Recordset。您可以放入 [First]、[Last]、[Next]，與 [Previous] 按鈕，讓使用者利用按鈕，移至所顯示 Recordset 的第一筆、最後一筆、下一筆，或前一筆記錄。方法是使 [First]、[Last]、[Next]，與 [Previous] 按鈕的 [OnClick] 程序中，呼叫 RDS.DataControl 物件中對應的 MoveFirst、MoveLast、MoveNext 與MovePrevious 方法。

搜尋 "Tutorial: Move Through the Displayed Recordset"。複製下列 script，並貼至註解下方。

SUB First_OnClick
    ADC.Recordset.MoveFirst
END SUB

SUB Next_OnClick
    If ADC.Recordset.EOF Then    'cannot move beyond bottom record
        ADC.Recordset.MoveFirst
        Exit Sub
    End If

    ADC.Recordset.MoveNext
END SUB

SUB Prev_OnClick
    If ADC.Recordset.BOF Then    'cannot move beyond top record
        ADC.Recorset.MoveFirst    'Get out of BOF buffer
        ADC.Recordset.MoveLast
        Exit Sub
    End If
    ADC.Recordset.MovePrevious
END SUB

SUB Last_OnClick
    ADC.Recordset.MoveLast
END SUB

下一步


檢視程式碼執行結果 (RDS)

  18. 以文字檔格式儲存對 Tutorial.asp 檔所做的變更，並離開文字編輯器。請確認文字編輯器沒有取代 .asp 延伸檔名。.asp 檔案為 Active Server Pages 的 script 檔。

  19. 若要確認您所建立的 ASP 網頁功能正常無誤，請將瀏覽器指向 http://<webservername>/MSADC/Samples/Tutorial/Tutorial.asp，<webservername> 請以您實際的 Web 伺服器名稱來取代。

    注意 您必須指向該位址才能存取 ASP 網頁。若使用 [檔案] 中的 [開啟舊檔] 指令，或是按兩下 .asp 檔，則無法正確開啟 ASP 網頁。

載入網頁後，按一下 [執行!]，將資料填入方格中。您可以變更查詢或其他參數，再按一下 [執行!]，以檢視其他資料。


教學課程: 通訊錄

教學課程：通訊錄

此樣本應用程式教您如何使用 Remote Data Service 來建立線上公司通訊錄，這是一個簡單、可聯繫資料的 Web 應用程式。此教學程式適用於 Microsoft (R) Visual Basic (R) Scripting Edition (VBScript) 與 ActiveX 的程式設計師，可學習如何以聯繫資料的 ActiveX 控制項配合使用 Remote Data Service，也適用於資深的應用程式設計師，學習建立以資料為中心的 Web 應用程式。

此教學課程假設您已了解如何使用基本的 HTML 配置標記，以及利用 ActiveX 控制項來撰寫程式。

[通訊錄] 教學課程帶領您執行下列工作：

  • 確認您的設備符合系統需求，可執行此應用程式。

  • 設定環境，以連接至資料庫，並執行 SQL 查詢以複製樣本資料。

  • 在網頁上設定 HTML 架構，並撰寫 VBScript 程式碼，以處理使用者事件。

通訊錄簡介

[通訊錄] 樣本應用程式為線上的通訊錄，可用來在 intranet 上發行目錄。通訊錄可讓使用者在一個或多個欄位中輸入搜尋字串，以查詢員工資訊。為了讓您了解 Remote Data Service 的基本功能，此樣本應用程式會儘量保持在小型規模，只使用必要的物件與搜尋欄位。

此應用程式的使用者介面包含下列部份：

  • 文字方塊，可做為員工各類資訊的搜尋欄位。

  • 指令按鈕，可建立查詢、清除搜尋欄位、更新資料庫中的員工資訊，或取消被擱置的變更。

  • 試算表樣式的方格，可顯示搜尋結果，並可經由非視覺化的 RDS.DataControl 資料聯結物件，聯結至後方的資料庫。

  • 按鈕，可讓您在方格中所顯示的資料列中移動。


執行通訊錄樣本應用程式

若要快速設定好並執行 [通訊錄] 應用程式，請遵循下列步驟。

若要執行此應用程式

  1. 確認您符合系統需求。

  2. 設定 ODBC 系統 DSN。

  3. 執行 SQL script，以便將資料載入您的 Microsoft SQL Server 資料庫。

  4. 確認 Microsoft (R) SQL Server (TM) 為執行狀態。按一下 [開始]，指向 [程式集]，指向 [Microsoft SQL Server 6.5]，然後按一下 [SQL Service Manager]。若停止燈為綠色，則代表 SQL Server 為執行狀態。若不是綠色，按一下 [開始/繼續]。

  5. 在 Microsoft (R) Internet Explorer 4.0 或更新的版本中，輸入以下位址：

    http://webserver/msadc/samples/AddressBook/AddrBook.asp

    webserver 為 Remote Data Service 伺服器元件，以及您建立系統 DSN 所在的 Web 伺服器名稱。

  6. 您可以在 [通訊錄] 樣本應用程式中嘗試各種不同的用法，例如根據 e-mail 名稱尋找個人、列出所有職稱為 "程式管理員" 的人員，或編輯與更新現有的記錄。按一下 [尋找]，以所有可用的名稱來填入資料方格。


通訊錄應用程式的系統需求

若要安裝 [通訊錄] 樣本應用程式，您必須要符合以下軟體與資料庫需求。

軟體需求

執行此 Web 應用程式的伺服器電腦軟體需求為：

  • Microsoft (R) Windows NT (R) Server x86 version 4.0 Service Pack 3 或更新的版本。

  • Microsoft (R) Internet Information Server (IIS) 3.0 或更新的版本，其中包含 Active Server Pages。

  • Remote Data Service 的伺服器端 DLLs (Remote Data Service 安裝程式會自動為您設定此項)。

執行此 Web 應用程式的用戶端電腦軟體需求為：

  • Microsoft (R) Internet Explorer 4.0 或更新的版本。

  • Microsoft (R) Windows NT (R) Workstation 或 Microsoft (R) Windows (R) 95。

  • Remote Data Service 的用戶端 DLLs 必須安裝在用戶端電腦。此項已包含在 Internet Explorer 4.0 的安裝程序中。

資料庫需求

若要使用此樣本，您必須有：

  • 可運作的 Microsoft SQL Server version 6.5 資料庫。

  • 資料庫的存取權限。

  • 資料庫的寫入權限，以便將樣本資料輸入資料庫。

  • 經由 [企業管理員] 或 ISQL 工具程式來認證輸入的資料。

若無此權限，則您的資料庫管理員必須重新設定系統，並提供您資料庫的存取權限，或是為您設定資料庫。

若您符合這些資料庫需求，請遵循 "執行通訊錄 SQL Script" 與 "設定通訊錄的 ODBC 連結"中的指示。


執行通訊錄 SQL Script

您必須使用 ISQL 指令列工具程式，或是 SQL Server 企業管理員來執行 SQL script，以便能：

  • 在預設的裝置上建立 AddrBookDB 新資料庫。

  • 連結正確的資料庫 (AddrBookDB；若您重新命名資料庫，請務必修改 ODBC 連結 DSN 設定中的資料庫名稱)。

  • 建立 [員工] 表格。

  • 以樣本資料填入表格。

  • 執行簡單的 SELECT 敘述，確認輸入的資料庫表格。

  • 設定名為 "ADCDemo" 的使用者帳號，密碼為 "ADCDemo"。

您必須執行所提供的 SQL script 檔案 (Sampleemp.sql) 以建立並填入 [員工] 表格。根據預設，[員工] 表格是在此電腦 SQL 伺服器上新建立的 AddrBookDB 資料庫中產生。

若要執行 Sampleemp.sql script

  1. 按一下 [開始]，指向 [程式集]，然後指向 [Microsoft SQL Server 6.5]。按一下 [SQL 企業管理員]。

  2. 從 [工具] 功能表中，選擇 [SQL 查詢工具]。

  3. 按一下 [載入 SQL Script] 按鈕 (在工具列上的開啟資料夾)，並移至 Program Files\Common Files\System\MSADC\Samples\AddressBook。

  4. 選擇 Sampleemp.sql 檔案。按一下 [開啟]。按一下 [執行查詢] 按鈕 (工具列上的綠色箭頭)。

  5. 執行後，關閉 [查詢] 與 [企業管理員] 視窗。


設定通訊錄的 ODBC 連接

在 Remote Data Service 伺服器元件所要安裝的 Web 伺服器上，您必須設定 ODBC 系統資料來源名稱 (DSN)。

此設定假設 [員工] 表格已建立在此電腦 SQL Server 上的 AddrBookDB 資料庫，SQL Server 執行 SQL script 以便在 Web 伺服器上運作。若要使用其他資料庫，或在不同伺服器上執行的其他 SQL Server，您必須修改 [ODBC SQL Server 設定] 對話方塊中的 [伺服器] 與 [資料庫名稱] 輸入值。您若在此處修改，則也必須在 AddrBook 網頁上做一些小修改。

若要設定 Windows NT (R) 用戶端的 DSN

  6. 在 Web 伺服器上，按一下 [開始]，指向 [設定]，然後按一下 [控制台]。

  7. 在 [控制台] 中，按兩下 [ODBC] 圖示。

  8. 在 [系統 DSN] 標籤，按一下 [新增]。

  9. 在 [建立新資料來源] 方塊中，選擇 [SQL Server]，按一下 [完成]。

  10. 遵循 "建立新資料來源至 SQL Server" 精靈的指示。若需協助，請按一下精靈對話方塊中的 [說明]。

  11. 完成時，按一下 [確定]，回到 [ODBC 資料來源管理員] 對話方塊。按一下 [關閉]，結束 ODBC 設定。

若要設定 Windows 95 用戶端的 DSN

  12. 在 Web 伺服器上，按一下 [開始]，指向 [設定]，然後按一下 [控制台]。

  13. 在 [控制台] 中，按兩下 [ODBC] 圖示。

  14. 按一下 [系統 DSN]。

  15. 在 [系統資料來源] 方塊中，按一下 [新增]，選擇 [SQL Server]，按一下 [確定]。

  16. 遵循先前 Windows NT 用戶端程序的步驟 5 與步驟 6。


通訊錄樣本應用程式碼概觀

[通訊錄] 應用程式的程式碼可整理為下列幾個區段。每個區段代表一組應用程式主要元件、顯示元件的原始碼，並說明程式碼的功能。

每個區段也包含 VBScript 程式碼，可回應滑鼠按鍵之類的使用者事件。[通訊錄] 應用程式的VBScript 部份可將搜尋字串組合成查詢、傳送要求至伺服器、指定在何處顯示從伺服器接收的結果，與處理所有的按鈕按鍵事件。

程式碼區段 | 說明
HTML 架構 | 包含應用程式碼的 HTML 骨架。
文字方塊 | 可做為員工各類資訊的搜尋欄位。
指令按鈕 | 建立查詢、清除搜尋欄位、更新資料庫中的員工資訊，或取消被擱置的變更。
試算表樣式方格 | 顯示搜尋結果，並可經由非視覺化的 RDS.DataControl 資料聯結物件，聯結至後方的資料庫。
RDS.DataControl 資料聯結物件 | 將來自 Microsoft SQL Server 資料庫的資料聯結至用戶端 HTML 網頁的方格。
巡覽按鈕 | 用來巡覽顯示在方格中的資料列。
VBScript 初始化程式碼 | 初始化資料方格欄行首與方格標題。

[通訊錄] 樣本應用程式的架構，可讓您學習如何按部就班地建立一個簡單的 Remote Data Service Web 應用程式。為了便於呈現，教學課程省略重覆的程式碼，而且不會每次都說明程式碼在程式中的作用。若要檢視 [通訊錄] 應用程式的完整原始碼，請按此處。

請利用記事本之類的文字編輯器，將教學課程中的程式碼複製並貼至您的專案中。將專案儲存為 Files\Common Files\System\Msadc\Samples\Tutorial 目錄下的 Tutorial2.asp 檔案。若要檢視，請在 Internet Explorer 4.0 中輸入 http://webserver/msadc/samples/Tutorial/Tutorial2.asp

webserver 為執行 Internet Information Server 與 ASP 的 Windows NT (R) Web 伺服器指定的名稱。


通訊錄的 HTML 架構

建立 Remote Data Service 應用程式的第一步是設定標準的 HTML Web 網頁架構。HTML 骨架包含按鈕、文字方塊，與可聯繫資料控制項等應用程式物件的程式碼。

下列程式碼片段顯示 [通訊錄] 應用程式的 HTML 骨架。此部份包含了標準的 HTML 行首與網頁結構標記、識別應用程式的註解，與網頁文字、字型、色彩資訊。

註解加在應用程式物件 (例如按鈕、文字方塊，與可聯繫資料控制項) 所在的位置。您可以在這些位置加上自己的應用程式元件。按一下這些預留位置註解，可顯示應用程式此部份的說明。

注意 大多數常用的 HTML 標記，以及定義網頁背景屬性的標記不會在此定義。SCRIPT 標記表示控制項會傳送到 script 語言，在此例中即是 VBScript。

<HTML>
<HEAD>
<TITLE>Corporate Address Book</TITLE>
</HEAD>

<!--
    Purpose:    To provide a company directory search service for Web users.
    Written By:    Microsoft Remote Data Service Team, Microsoft Corp.
    Date:        April, 1997
-->

<BODY BACKGROUND="Arcadia.gif" LANGUAGE="VBScript" onload="Load">
<tr>
    <td align="center" width="40%">
    <table border="2" cellpadding="7" cellspacing="7">
    <tr>
      <td width="100%"><font color="#160B5A"><font
      size="4"><strong>Arcadia Bay Corporate Phone Directory</strong></font></font></td>
    </tr>
    </table>
    </td>
</tr>

<hr>
<h2><font color = "#160B5A">Search Parameters</h2>
<h5><font color = "#160B5A">Please enter one or more search patterns and press FIND to search.</h5>

<PRE>First Name
<!-- HTML CODE FOR TEXT BOXES GOES HERE -->

<!-- HTML CODE FOR COMMAND BUTTONS GOES HERE-->
<hr>
<h2><font color = "#400040">Search Results</h2>
</B>
<br>
<!-- HTML CODE FOR DATA GRID GOES HERE -->
<!-- HTML CODE FOR NAVIGATION BUTTONS GOES HERE -->

<!-- CODE FOR RDS.DATACONTROL OBJECT GOES HERE -->

<SCRIPT Language="VBScript">

<!-- VBSCRIPT CODE FOR INITIALIZING CLEARING TEXT BOXES, SUBMITTING A QUERY, NAVIGATING THROUGH THE DISPLAYED RECORDSET, SAVING CHANGES TO A RECORD, AND CANCELING ANY PENDING CHANGES GOES HERE. -->
</SCRIPT>

<BR>
<font color = "#400040">This site powered by Microsoft Remote Data Service. </font>
</BODY>
</HTML>


通訊錄文字方塊

[通訊錄] 應用程式包含四個文字方塊，可輸入搜尋片語 (例如，[First Name] 方塊)。下列 HTML 碼定義文字方塊物件：

<PRE> First Name   <INPUT NAME=SFirst SIZE=30> </PRE>

<PRE> Last Name  <INPUT NAME=SLast  SIZE=30> </PRE>

<PRE> Title    <INPUT NAME=STitle SIZE=30> </PRE>

<PRE> E-mail Alias <INPUT NAME=SEmail SIZE=30> </PRE>

內建的 INPUT 控制項會建立至 HTML。NAME 參數定義程式碼所呼叫的項目。例如，VBScript 程式碼可檢查 [First Name] 方塊中文字的 SFirst.Value。SIZE 參數可讓您以字元為單位，調整文字方塊的長度。


通訊錄資料聯結物件

[通訊錄] 應用程式使用 RDS.DataControl 物件，將 SQL Server 資料庫的資料聯結至應用程式用戶端 HTML 網頁的視覺物件 (在此例中為方格顯示)。事件驅動的 VBScript 程式邏輯使用 RDS.DataControl 來：

  • 查詢資料庫、傳送更新資料至資料庫與重新整理資料方格。

  • 讓使用者移至資料方格中的第一筆、下一筆、前一筆或最後一筆記錄。

以下程式碼定義 RDS.DataControl 元件：

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=SControl Width=1 Height=1>
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
</OBJECT>

OBJECT 標記定義程式中的 RDS.DataControl 元件。標記包含兩類參數：

  • 與一般性 OBJECT 標記關聯的標記。

  • 針對 RDS.DataControl 物件的標記。

一般性 OBJECT 標記參數

下表說明與 OBJECT 標記關聯的參數。

參數 | 說明
CLASSID | 一個獨特的 128 位元數字，用來讓系統識別嵌入物件的類型。此識別項是由本區電腦的系統註冊區所管理 (有關 RDS.DataControl 物件的類別 ID，請參閱 RDS.DataControl Object)。
ID | 定義可作用在整份文件的嵌入物件識別項，可用來在程式碼中識別嵌入物件。

RDS.DataControl 標記參數

下表說明針對 RDS.DataControl 物件的參數 (有關 RDS.DataControl 物件參數的完整清單與應用的時機，請參閱 RDS.DataControl 物件)。

參數 | 說明
SERVER | 若使用 HTTP，則參數值為前面加上 HTTP:// 的伺服器電腦名稱。
CONNECT | 此 VALUE 的第一部份代表指向資料來源的 [系統 DSN]；第二與第三部份指定存取資料來源所需的使用者 ID 與密碼 (例如，"DSN=ADCDEMO;UID=adcdemo;PWD=adcdemo;")。若需協助，您的系統資料庫管理員可提供相關資訊。
SQL | 設定或傳回用來取回 Recordset 的查詢字串。


通訊錄指令按鈕

[通訊錄] 應用程式包含下列指令按鈕：

  • 尋找按鈕，可送出查詢至資料庫。

  • 清除按鈕，在開始新的搜尋前，清除文字方塊。

  • 更新員工個人資料按鈕，儲存對員工記錄所做的變更。

  • 取消變更按鈕，放棄所做的變更。

尋找按鈕

以下 HTML 敘述定義了 [尋找] 按鈕。此 HTML 敘述會出現在程式的 VBScript 區段之前。請複製此控制項，並貼至 HTML 指令按鈕的註解下方。

<INPUT TYPE=BUTTON NAME="Find"     VALUE="Find">

Find_OnClick Sub 程序

按一下 [尋找] 按鈕可啟動 VBScript Find_OnClick Sub 程序，以建立並傳送 SQL 查詢。完成專案時，按一下此按鈕可填寫資料方格。

建立 SQL 查詢

Find_OnClick Sub 程序的第一部份建立 SQL 查詢，藉由附加文字字串至全域 SQL SELECT 敘述的方式，一次建立一個片語。它一開始是設定 SQL SELECT 敘述的 myQuery 變數，該敘述可要求資料來源表中的全部資料列。請複製此程式碼，並貼至開放 SCRIPT 標記下方。

Sub Find_OnClick

myQuery = "Select FirstName, LastName, Title, Type, Email, " _
    & "ManagerEmail, Building, Room, Phone from Employee"

接下來，Sub 程序掃描 [通訊錄] 中四個輸入方塊中的每個方塊。請複製此程式碼，並貼至 Find 副程式內。

    If (SFirst.Value <> "") Then
        myQuery = myQuery + " where FirstName like '" + SFirst.Value + "%'"
    End If

    IF (SLast.Value <> "") Then
        myQuery = myQuery + " where LastName like '" + SLast.Value + "%'"
    End If

    If (STitle.Value <> "") Then
        myQuery = myQuery + " where Title like '" + STitle.Value + "%'"
    End If

    If (SEmail.Value <> "") Then
        myQuery = myQuery + " where Email like '" + SEmail.Value + "%'"
    End If

每個 If 敘述會掃描相關文字方塊中的文字。若文字方塊中有文字，則執行 Then 敘述，將含有引號的文字附加至包含在 myQuery 變數中的全域 SELECT 敘述。由於程式以 like 來建立 SQL 敘述，因此查詢為子字串搜尋，而非完整比對。

例如，若 [Last Name] 方塊中為 "Berge"，而 [Title] 方塊中為 "Program Manager"，則 SQL 敘述 (myQuery 的值) 將讀取：

Select FirstName, LastName, Title, Email, Building, Room, Phone from Employee where lastname like 'Berge%' and title like 'Program Manager%'

若查詢成功，則姓氏中包含 "Berge" (例如 Berge 與 Berger) 且職稱中包含 "Program Manager" (例如，Program Manager 與 Advanced Technologies) 的所有人員，都會顯示在資料方格中。

準備與傳送查詢

Find_OnClick Sub 程序的最後一部份包含兩個敘述。第一個敘述指定 RDS.DataControl 物件的 SQL 查詢屬性等於動態建立的 SQL 查詢。第二個敘述則使 RDS.DataControl 物件 (SControl) 查詢資料庫，然後在方格中顯示查詢的新結果。請複製此程式碼，並貼至 Find 副程式。

    SControl.SQL = myQuery
    SControl.Refresh
End Sub

清除按鈕

以下 HTML 敘述定義了 [清除] 按鈕。此 HTML 敘述會出現在程式的 VBScript 區段之前。請複製此程式碼，並貼至 [尋找 HTML] 按鈕的下方。

<INPUT TYPE=BUTTON NAME="Clear"     VALUE="Clear">

INPUT 標記定義了按鈕、選項按鈕、核選方塊，或文字等元素。您可以使用 TYPE 參數來指定元素，在此例中為按鈕。NAME 參數定義程式碼中所要呼叫的按鈕。VALUE 參數指定 (清除) 按鈕所要顯示在網頁上的標籤。

Clear_OnClick Sub 程序

按一下 [清除] 按鈕，啟動 VBScript Clear_OnClick Sub 程序。請複製此程式碼，並貼至 SCRIPT 與 /SCRIPT 標記之間。

Sub Clear_OnClick
    SFirst.Value=""
    SLast.Value=""
    STitle.Value=""
    SEmail.Value=""
End Sub

執行 Sub 程序時，會初始化四個 HTML 輸入方塊中的每個方塊，方塊則是以 ID 標記的 NAME 參數來識別。.Value 屬性代表顯示在網頁上的文字方塊物件中的字元。程序在準備新搜尋時，會取代所有字串長度為零 ("") 的文字。

更新員工個人資料按鈕

以下程式碼定義了 [更新員工個人資料] 按鈕。此 HTML 敘述會出現在程式的 VBScript 區段之前。請複製此 HTML 控制項，並貼至 [清除] 按鈕的下方。

<INPUT TYPE=BUTTON NAME="Update"     VALUE="Update Profile">

INPUT 標記定義了按鈕、選項按鈕、核選方塊，或文字等元素。NAME 參數定義程式碼中所要呼叫的按鈕。您可以使用 TYPE 參數來指定元素，在此例中為按鈕。VALUE 參數指定 (更新員工個人資料) 按鈕的標籤。

Update_OnClick Sub 程序

按一下 [更新員工個人資料] 按鈕，啟動 VBScript Update_OnClick Sub 程序，它會執行 RDS.DataControl 物件的 (SControl) SubmitChanges 與 Refresh 方法。請複製此程式碼，並貼至 SCRIPT 與 /SCRIPT 標記之間。

Sub Update_OnClick
    SControl.SubmitChanges
    SControl.Refresh
End Sub

SControl.SubmitChanges 執行時，程式會包裝所有的更新資訊，並經由 HTTP 傳送至伺服器。更新的原則是全有或全無；亦即如果部份更新失敗，則不做任何的變更，並傳回狀態訊息。Remote Data Service 在 SubmitChanges 後並不需要 SControl.Refresh，但可確保重新整理資料。

取消變更按鈕

以下程式碼敘述定義了 [取消變更] 按鈕。此 HTML 敘述會出現在程式的 VBScript 區段之前。請複製此 HTML 控制項，並貼至 [更新] 按鈕的下方。

<INPUT TYPE=BUTTON NAME="Cancel"     VALUE="Cancel Changes">

Cancel_OnClick Sub 程序

按一下 [取消變更] 按鈕，啟動 VBScript Cancel_OnClick Sub 程序，它會執行 RDS.DataControl 物件的 (SControl) CancelUpdate 方法。請複製此程式碼，並貼至 SCRIPT 與 /SCRIPT 標記之間。

Sub Cancel_OnClick
      SControl.CancelUpdate
End Sub

當 SControl.CancelUpdate 執行時，會放棄自上次查詢或更新算起，使用者在資料方格上對員工記錄所做的任何變更，並回復原來的值。


通訊錄資料方格

方格控制項為試算表樣式的物件。[通訊錄] 應用程式用它來顯示查詢所傳回的資料。

以下 HTML 敘述定義了方格控制項。請複製此程式碼，並貼至相關的註解下。

<OBJECT CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/ssdatb32.cab"
    ID=GRID1
DATASRC=#SControl
HEIGHT=125
WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="BackColor"   VALUE="-2147483643">
    <PARAM NAME="BackColorOdd"  VALUE="-2147483643">
    <PARAM NAME="ForeColorEven" VALUE="0">
</OBJECT>
<HR>

OBJECT 標記定義了方格控制項元件。標記中包含參數，可允許您設定方格大小、在資訊更新或刪除時改變顯示的資料，以及根據查詢結果動態地改變資料列數。其他參數則設定方格控制項的色彩屬性。

下表說明 OBJECT 標記相關的參數。

參數 | 說明
CLASSID | 一個獨特的 128 位元數字，用來讓系統識別嵌入物件的類型。此識別項是由本區電腦的系統註冊區所管理。它是此 Sheridan 方格控制項所特有的。
CODEBASE | 當呼叫物件的來源檔不在用戶端電腦時，指定來源檔的位置。 在此例中，CODEBASE 指定包含 Sheridan ActiveX (R) 控制項的 .cab 檔案位置。程式使用 Active Server Pages script (<% 與 %> 符號之間的程式碼) 來要求 URL 的伺服器名稱部份。
ID | 定義可作用在整份文件的嵌入物件識別項。
DATASRC | 識別用來聯結資料方格至後方資料的資料來源 (在此例中，SControl 為 RDS.DataControl 物件)。
WIDTH 與 HEIGHT | 以像素為單位，指定控制項的長寬尺寸。

在 [通訊錄] 應用程式中，方格物件使用數個額外的參數來啟動編輯功能。若沒有這些指定項，方格只能顯示可編輯資料的唯讀、靜態的檢視。下表列出此樣本應用程式中，方格控制項的編輯參數設定。

參數 | 參數值 | 說明
AllowAddNew | TRUE | 允許現有資料顯示至新增的記錄。
AllowDelete | TRUE | 允許現有資料顯示至移除的記錄。
AllowUpdate | TRUE | 允許變更方格中的儲存格。

BackColor、BackColorEven，與 BackColorOdd 參數將方格設定為白色背景與黑色文字。


通訊錄巡覽按鈕

[通訊錄] 應用程式在網頁底部顯示巡覽按鈕。您可以選擇第一列或最後一列資料，或是選擇目前選取區域相鄰的資料列，利用巡覽按鈕來巡覽方格顯示中的資料。

以下程式碼定義了巡覽按鈕。這些 HTML 敘述會出現在程式的 VBScript 區段之前。請複製此控制項，並貼至相關註解標記。

<INPUT TYPE=BUTTON NAME="First"         VALUE="First">
<INPUT TYPE=BUTTON NAME="Prev"         VALUE="Previous">
<INPUT TYPE=BUTTON NAME="Next"        VALUE="Next">
<INPUT TYPE=BUTTON NAME="Last"        VALUE="Last">

HTML 使用 INPUT 標記來定義按鈕、選項按鈕、核選方塊，或文字之類的表單元素。您可以使用 TYPE 參數來指定表單元素的類型，在此例中為按鈕。NAME 參數定義程式碼中所要呼叫的按鈕。VALUE 參數指定按鈕 ([First]、[Previous]、[Next]，與 [Last]) 在網頁上顯示時的標籤。

使用者按一下按鈕時即產生事件，VBScript 則啟動相關的巡覽 Sub 程序。

巡覽 Sub 程序

[通訊錄] 應用程式包含數個程序，可讓使用者按一下 [First]、[Previous]、[Next]，與 [Last] 按鈕，即可在資料中移動。若要啟動移動功能，可指定各種移動類型的 RDS.DataControl 物件 (SControl) 方法。每個巡覽按鈕使用不同的方法。

例如，按一下 [First] 按鈕可啟動 VBScript First_OnClick Sub 程序。程序會執行 MoveFirst 方法，將第一列資料設定為目前的選取區域。按一下 [Last] 按鈕，則啟動 Last_OnClick Sub 程序，呼叫 MoveLast 方法，將最後一列資料設定為目前的選取區域。其餘的巡覽按鈕原理類似。請複製此程式碼，並貼至 SCRIPT 與 /SCRIPT 標記之間。

' Move to the first record in the bound recordset.
Sub First_OnClick
    SControl.Recordset.MoveFirst
End Sub

' Move to the next record from the current position
' in the bound recordset.
Sub Next_OnClick
    If SControl.Recordset.EOF Then    'cannot move beyond bottom record
        SControl.Recordset.MoveFirst
        SControl.Recordset.MoveNext
        Exit Sub
    End If

    SControl.Recordset.MoveNext

End Sub

' Move to the previous record from the current position in the bound
' recordset.
Sub Prev_OnClick
    If SControl.Recordset.BOF Then    'cannot move beyond top record
        SControl.Recordset.MoveLast    'Get out of BOF buffer
        SControl.Recordset.MovePrevious
        Exit Sub
    End If
    SControl.Recordset.MovePrevious

End Sub

' Move to the last record in the bound recordset.
Sub Last_OnClick
    SControl.Recordset.MoveLast
End Sub


VBScript 初始化程式碼

[通訊錄] 應用程式的 VBScript 區段首先會宣告 myQuery 變數。此變數將包含由搜尋欄位中的文字所動態建立的 SQL 查詢，並傳送給資料庫。隨後，Find_OnClick Sub 程序則設定此變數的值。

Dim myQuery

其餘的初始化則包含在 Load Sub 程序中。這些包括在資料方格中加入標題。WHERE 子句不會取出任何記錄，只提供資料欄行首。請複製此程式碼，並貼至 SCRIPT 與 /SCRIPT 標記之間。

Sub Load
    Grid1.Caption = "Arcadia Bay Corporate Phone Directory"

    ' Initialize the data grid with column names only.
    SControl.SQL = "Select FirstName, LastName, Title, Email, " _
        & "Building, Room, Phone from Employee where 2 < 1"
    SControl.Refresh
End Sub


通訊錄應用程式原始碼

以下程式碼為 [通訊錄] 樣本應用程式的完整原始碼。

<HTML>
<HEAD>
<TITLE>Corporate Address Book</TITLE>
</HEAD>

<!--
    Purpose:    To provide a company directory search service for Web users.
    Written By:    Microsoft Remote Data Service Team, Microsoft Corp.
    Date:    April, 1997
-->

<BODY BACKGROUND="Arcadia.gif" LANGUAGE="VBScript" onload="Load">
<tr>
    <td align="center" width="40%">
        <table border="2" cellpadding="7" cellspacing="7">
            <tr>
                <td width="100%"><font color="#160B5A"><font
                size="4"><strong>Arcadia Bay Corporate Phone
                Directory</strong></font></font></td>
            </tr>
        </table>
        </td>
</tr>

<hr>
<h2><font color = "#160B5A">Search Parameters</h2>
<h5><font color = "#160B5A">Please enter one or more search patterns and press FIND to search.</h5>

<FONT COLOR = "#160B5A"><B>

<PRE> First Name   <INPUT NAME=SFirst SIZE=30> </PRE>

<PRE> Last Name  <INPUT NAME=SLast  SIZE=30> </PRE>

<PRE> Title    <INPUT NAME=STitle SIZE=30> </PRE>

<PRE> E-mail Alias <INPUT NAME=SEmail SIZE=30> </PRE>

<!--
    Command button options:
    -----------------------
    Find        Submit a search request to the database.
    Clear        Clear the QBE fields (labor saving function only).
    Update Profile    Send updated "address profile" back to the database.
    Cancel Changes    Undo all changes since the last Update Profile.
-->

<INPUT TYPE=BUTTON NAME="Find"     VALUE="Find">
<INPUT TYPE=BUTTON NAME="Clear"     VALUE="Clear">
<INPUT TYPE=BUTTON NAME="Update"     VALUE="Update Profile">
<INPUT TYPE=BUTTON NAME="Cancel"     VALUE="Cancel Changes">

<hr>
<h2><font color = "#400040">Search Results</h2>
</B>
<br>

<!--
    This Sheridan DataGrid control (SGrid) is initialized to
    allow changes to the data - these changes will be saved
    to the database when the Update Profile button is pressed.
-->

<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/ssdatb32.cab"
    ID=GRID1
    datasrc=#SControl
    HEIGHT=125
    WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="BackColor"   VALUE="-2147483643">
    <PARAM NAME="BackColorOdd"  VALUE="-2147483643">
    <PARAM NAME="ForeColorEven" VALUE="0">
</OBJECT>

<br>
<br>
<INPUT TYPE=BUTTON NAME="First"     VALUE="First">
<INPUT TYPE=BUTTON NAME="Prev"     VALUE="Previous">
<INPUT TYPE=BUTTON NAME="Next"    VALUE="Next">
<INPUT TYPE=BUTTON NAME="Last"    VALUE="Last">
<hr>

<!-- Non-visual controls - RDS.DataControl -->

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=SControl
    WIDTH=1 HEIGHT=1>
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
</OBJECT>

<!-- VBS scripting for composing queries, updating profiles, and retrieving search results. -->

<SCRIPT LANGUAGE="VBScript">

Dim myQuery

Sub Load
    Grid1.CAPTION = "Arcadia Bay Corporate Phone Directory"

    'Initialize data grid with column names only.
    SControl.SQL = "Select FirstName, LastName, Title, Email, Building, Room, Phone from Employee where 2 < 1"
    SControl.Refresh

End Sub

'Implement "Clear" button - clears all of the QBE fields in preparation for a new "Find."

Sub Clear_OnClick
    SFirst.Value=""
    SLast.Value=""
    STitle.Value=""
    SEmail.Value=""
End Sub

'Implement "Find" button - composes a dynamic SQL query to be processed by the database and returns matching records to be bound to the SGrid object.

Sub Find_OnClick

    myQuery = "Select FirstName, LastName, Title, Type, Email, ManagerEmail, Building, Room, Phone from Employee"

    'Check QBE fields and compose a dynamic SQL query.

    IF (SFirst.Value <> "") THEN
        myQuery = myQuery + " where FirstName like '" + SFirst.Value + "%'"
    End IF

    IF (SLast.Value <> "") THEN
        myQuery = myQuery + " where LastName like '" + SLast.Value + "%'"
    End IF

    IF (STitle.Value <> "") THEN
        myQuery = myQuery + " where Title like '" + STitle.Value + "%'"
    End IF

    IF (SEmail.Value <> "") THEN
        myQuery = myQuery + " where Email like '" + SEmail.Value + "%'"
    End IF

    'Set the new query and then refresh the SControl so that the new results are displayed.

    SControl.SQL = myQuery
    SControl.Refresh

End Sub

'Navigation subroutines - based on currency changes to RDS.DataControl (SControl).

'Move to the first record in the bound recordset.

Sub First_OnClick
      SControl.Recordset.MoveFirst
End Sub

'Move to the next record from the current position in the bound recordset.

Sub Next_OnClick
    If SControl.Recordset.EOF Then    'cannot move beyond bottom record
        SControl.Recordset.MoveFirst
        SControl.Recordset.MoveNext
        Exit Sub
    End If

    SControl.Recordset.MoveNext

End Sub

'Move to the previous record from the current position in the bound recordset.

Sub Prev_OnClick
If SControl.Recordset.BOF Then    'cannot move beyond top record
        SControl.Recordset.MoveLast    'Get out of BOF buffer
        SControl.Recordset.MovePrevious
        Exit Sub
    End If
    SControl.Recordset.MovePrevious
End Sub

'Move to the last record in the bound recordset.

Sub Last_OnClick
      SControl.Recordset.MoveLast
End Sub

'Submit edits made and pull a clean copy of the new data.

Sub Update_OnClick
      SControl.SubmitChanges
    SControl.Refresh    ' A Refresh is not required in ADC 1.5 after a SubmitChanges, but it ensures fresh data.
End Sub

'Cancel edits and restore original values.

Sub Cancel_OnClick
      SControl.CancelUpdate
End Sub

</SCRIPT>

<BR>
<font color = "#400040">This site powered by Microsoft Remote Data Service. </font>
</BODY>
</HTML>


Remote Data Service的範例應用程式

Remote Data Service 包含了幾個範例應用程式，它們是非常有用的學習工具。透過文件，您可以找到範例程式碼與描述程式設計技術的應用程式。您可以複製它們的任何部份到您自己的應用程式中，並且依您所需來修改。

Remote Data Service 提供下列強調如何使用此技術來產生 intranet 與 Internet 應用程式的範例應用程式。如果您已經安裝應用程式，範例將在下列的位置中可用。如果您尚未安裝應用程式，您可以從 MSDN (TM)中安裝它們。

範例應用程式 | 路徑 | 說明
ADCTest | Installed to <device>:\Program Files\Common Files\System\MSADC\ Samples\adctest.aspFiles\Common Files\System\MSADC\Samples\tutorial\tutorial.asp. | 一個簡單的 .asp 檔案讓您可以驗證您的 Remote Data Service 安裝。
Address Book | Installed to <device>:\Program Files\Common Files\System\MSADC\Samples\ AddressBook\addrbook.asp. Files\Common Files\System\MSADC\Samples\AddressBook\addrbook.asp. | 一個簡單的公司目錄應用程式。 若需關於此應用程式的詳細資訊，請參閱 Address Book 範例應用程式。
Selector | Installed to <device>:\Program Files\Common Files\System\MSADC\Samples\ SelectorFiles\Common Files\System\MSADC\Samples\Selector\SampStart.asp | 縣市如何在用戶端用戶端客戶端、中間與資料來源層建置不同的 Remote Data Service。

注意 Selector 無法在 Alpha 平台上執行。

這些範例是以 .asp 格式提供 (您的主機伺服器名稱會自動被提供)，但您可以輕鬆地修改它們成可執行的 .htm 網頁。

要修改範例以 .htm 格式執行

  1. 在文字編輯器如中開啟 .asp 檔案。

  2. 以您網路伺服器機器名稱取代字串 <%=Request.ServerVariables("SERVER_NAME")%>。

    注意 除非另外說明，在範例中使用的公司、名稱與資料是虛構的。

    注意 當安裝樣本應用程式時，會建立帳號 adcdemo。當執行樣本應用程式時，可能會出現登入失敗的訊息；如果發生此狀況，只需要重設使用者名稱與密碼到測驗帳號資訊即可。


RDS 開發者手冊

Remote Data Service 開發者手冊

Remote Data Service (RDS) 是設計用來建立以資料為中心的 Web 應用程式。它結合了現有的技術，例如 ActiveX (R)、Microsoft (R) Internet Information Server (IIS)、Microsoft (R) Visual Basic (R)、Scripting Edition、Jscript(TM) 以及 OLE DB，並介紹一些創新的功能，如增強的網頁資料連結、用戶端快取，以及建立自訂 business 物件的能力。

在 RDS 應用程式中，您可以使用許多相關的技術。開發者手冊說明了三層的 RDS 應用程式中的各個部分，並提供程式碼範例來說明如何使用這些技術。

本節包含以下的資訊：

  • 認識 Remote Data Service 應用程式

  • 開發 Remote Data Service 應用程式

  • Remote Data Service 的疑難排除


認識 Remote Data Service 應用程式

以下章節說明 Remote Data Service 技術的架構及各個元件。它表示 RDS 用戶端及伺服器端元件如何搭配使用，以便：

  • 將資料透過網際網路或企業網路傳送到您的網頁上。

  • 讓更新的資訊經由網路傳回，並合併到您的資料庫中。

本節包含下列的資訊：

  • 三層的應用程式

  • Remote Data Service 應用程式的使用方式

  • 相關的技術


三層的應用程式

若要使用 Remote Data Service 技術，您必須先了解三層的主從架構模式。此模式將用主從架構系統的各個元件分為三層：

  • 用戶端層—也就是本端電腦，Web 瀏覽器或 (非 Web 應用程式) 獨立編譯的前端應用程式在本端電腦上所顯示的網頁，可自遠端資料源顯示及操作資料。

  • 中間層—Microsoft (R) Windows NT (R) Server 電腦，可管理納入公司業務規則的各個元件。中間層元件可以是在網際網路資訊伺服器上執行的現有伺服器頁面命令集，或 (非 Web 應用程式) 已編譯的可執行程式。

  • 資料源層—負責資料庫管理系統 (DBMS) 的電腦，如 Microsoft (R) SQL Server (TM) 資料庫 (在雙層的應用程式中，中間層及資料源層為一合併的階層)。

這些階層不一定會對應到網路上的實際位置。例如，這三層可能只存在於兩部電腦中。其中一台是以 Microsoft (R) Internet Explorer 4.0 作為瀏覽器的 Microsoft (R) Windows (R) 95 電腦。第二台則是同時執行網際網路資訊伺服器及 Microsoft SQL Server 的 Windows NT Server 電腦。以此種方式設計的應用程式可讓您在網路上配置程序及資料時，提供較大的彈性，以獲得最佳化的效能及簡便的維護。


Remote Data Service 應用程式的使用方式

建立 Remote Data Service 應用程式時，您可以將應用程式劃分為兩個或三個邏輯層。以下的說明表示以 Web 為架構的 RDS 應用程式如何處理使用者需求來顯示資料庫中的資訊。用戶端的元件通常是由 Internet Explorer 瀏覽器管理，並使用 HTTP 與伺服器元件通訊。Internet Explorer 4.0 已經包含了 RDS 用戶端元件，因此可簡化您的配置。

每當使用者輸入一項需求時，用戶端的 RDS 元件便會將此查詢傳送到 Web 伺服器。伺服器端的 RDS 元件會處理該項需求，並將其傳送至 DBMS。DBMS 便會回應這項需求，並將此資料傳回。Web 伺服器上的 RDS 元件會將該資料轉換成 ADO Recordset 物件。該資料轉換後，便會傳輸到用戶端，並透過網路傳回用戶端電腦。這個資料可以用資料專屬控制項顯示，如文字方塊或格線，可藉由 RDS.DataControl 物件來界定此資料。一個 RDS.DataControl 可將資料連線到許多可聯繫資料的控制項。

所產生的資料可在用戶端電腦上快取，以減少與 Web 連線的數目，並讓使用者更易於處理資料。唯一需要到伺服器上呼叫的物件就是 business 物件 (如資料伺服器的更新或新資料的要求)。


相關的技術

還有許多其他的技術會與 Remote Data Service 互動，或用在其執行上。

OLE DB 有關使用 OLE DB 的其他資訊，請參閱 OLE DB 網站：http://www.microsoft.com/data/。

Internet Information Server 有關 Microsoft (R) Internet Information Server (IIS) 或 Active Server Pages (ASP) 的其他資訊，請參閱 IIS 網站：http://www.microsoft.com/iis。有關連接共用區的資訊，請參閱如下：

  • 連接共用區選項

Microsoft Transaction Server 有關 Microsoft (R) Transaction Server (R) 的其他資訊，請參閱 MTS 網站：http://www.microsoft.com/transaction/。有關 Microsoft Transaction Server 中，business 物件的其他資訊，請參閱如下：

  • Microsoft Transaction Server Resource Dispensers

Microsoft SQL Server 有關 Microsoft SQL Server 的其他資訊，請參閱 SQL Server 網站：http://www.microsoft.com/sql/。有關以 RDS 使用 SQL Server 的資訊，請參閱如下：

  • 連接共用區的效能及穩定性

  • 確定足夠的 TempDB 空間

  • 最小化記錄檔空間的使用

Microsoft Internet Explorer 有關 Microsoft Internet Explorer 的其他資訊，請參閱 Internet Explorer 網站：http://www.microsoft.com/ie/ 以及 Microsoft Internet Client SDK 網站：http://www.microsoft.com/msdn/sdk/inetsdk/asetup/。有關資料連結及連結控制項的資訊，請參閱如下：

  • 透過連結控制項顯示資料

Microsoft Windows NT Server 有關 Microsoft Windows NT Server 及 NT Security 的其他資訊，請參閱 NT 網站：http://www.microsoft.com/ntserver/。有關 NT Security 及 RDS 的資訊，請參閱如下：

  • 安全性及 Web 伺服器


連接共用區選項

如果您打算使用 ODBC 資料源，您可以使用 Internet Information Server (IIS) 中的連接共用區選項來達到高效能的用戶端負載處理。連接共用區是一個用於連接的資源管理員，可維護常用連接的開放狀態。

若要啟用連接共用區，請參閱網際網路資訊伺服器的文件。

請注意，啟用連接共用區可能會使 Web 伺服器產生其他限制，如 Microsoft Internet Information Server 的文件所述。


Microsoft Transaction Server Resource Dispensers

在三層的環境中，如果您在中間層使用 Microsoft Transaction Server，用戶端就可以共用資料庫連線。您可以使用 RDSServer.DataFactory 物件或建立可供用戶端設定 ODBC 連線的 ActiveX 元件 DLL 來共用資料庫。執行 RDSServer.DataFactory 或 Transaction Server 執行期環境中的自訂 business 物件時，共用結構就會發生作用。您只需要以百餘種資料庫連線 (而不需使用千餘種)，就可以支援上千個用戶端。這就是 Microsoft Transaction Server 中，ODBC 資源分配程式的其中一個特色。

在 Microsoft Transaction Server 中執行 business 物件

Business 物件可以是執行檔 (.exe) 或動態連結程式庫 (.dll)。您用來執行 business 物件的組態可視該物件是 .dll 或 .exe 檔案而有所不同：

  • 以 .exe 檔案建立的 business 物件可透過 DCOM 呼叫。如果您透過 IIS 來使用這些 business 物件，它們便屬於另一種資料的排列，這種排列方式會降低用戶端的效能。

  • 以 .dll 檔案建立的 business 物件可經由 IIS (以及 HTTP) 使用，或只經由 Microsoft Transaction Server 在 DCOM 上使用。business 物件 DLL 必須在 IIS 電腦上登錄，才能經由 IIS 提供存取。RDSServer.DataFactory 物件是 Remote Data Service 所提供的預設 business 物件 DLL，它同時也和本節中所提到的條件相同 (有關如何設定 DLL 在 DCOM 上執行的步驟，請參閱下一節《使 DLL 在 DCOM 上執行》)。

藉由執行 RDSServer.DataFactory 物件或 MTS 執行期環境中的自訂 business 物件，您也可以使用 MTS 資料分配程式來增進效能及規模。由於這些 business 物件稱為 ADO，或稱為 ODBC，所以您可以善加利用 MTS ODBC 資源分配程式。

資源分配程式可自動聚集和回收資源。因此，當 RDSServer.DataFactory 或您自訂的 business 物件中斷資料庫連線時，該連線就會回到共用區。再次建立連線時，您必須使用相同的資料庫連線。不用建立新的連線，ODBC 資源分配程式就會重複使用共用區的連線，如此便可以節省時間及伺服器資源。

註解 當中間層的 business 物件以 Microsoft Transaction Server 元件來執行 (使用 GetObjectContext、SetComplete，以及 SetAbort) 時，它們可以使用 Transaction Server 內容物件，透過多重用戶端呼叫來維持其狀態。這個分析藍本適用於通常建立於信用用戶端及伺服器 (企業網路) 間的 DCOM。在這種情況下，用戶端的 RDS.DataSpace 物件及 CreateObject 方法可用交易內容物件及 CreateInstance 方法 (由 ITransactionContext 介面所提供) 取代，並以 Microsoft Transaction Server 執行。


連接共用區的效能及穩定性

若要確保連接共用區的穩定性，並提供額外的效能增益，您必須設定 Microsoft SQL Server，才能使用 TCP/IP Socket 網路程式庫。

若要達成這個目的，您必須：

  • 設定 SQL Server 電腦來使用 TCP/IP Sockets

  • 設定 Web 伺服器來使用 TCP/IP Sockets


確定足夠的 TempDB 空間

處理的 Recordset 物件必須在 SQL Server 上處理空間時，如果發生錯誤，您就必須增加 TempDB 的大小 (有些查詢需要暫時的處理空間，例如，包含 ORDER BY 子句的查詢需要一種 Recordset，這種 Recordset 需要一些暫存的空間)。

重要事項 一旦暫存空間擴充後，就不容易再縮小，因此，請在執行此動作前，先詳閱此程序。

在 SQL Server 上增加 TempDB 空間

  16. 啟動 Microsoft (R) SQL Server Enterprise Manager，開啟伺服器的樹狀結構，然後再開啟資料庫裝置的樹狀結構。

  17. 選取要擴充的 (實際的) 裝置，如主要部分，然後連按兩下該裝置來開啟 [編輯資料庫裝置] 對話方塊。

    這個對話方塊可顯示目前資料庫所使用的空間大小。

  18. 在 [大小] 捲動方塊中，將該裝置增加到想要的數量 (例如，50 MB 的硬碟空間)。

  19. 按一下 [立即變更] 來增加 (邏輯) TempDB 可以擴充的空間數量。

  20. 開啟伺服器上的資料庫樹狀結構，然後連按兩下 TempDB 來開啟 [編輯資料庫] 對話方塊。[資料庫] 索引標籤會列出目前配置給 TempDB ([資料大小]) 的空間數量。此預設值為 2 MB。

  21. 在 [大小] 群組下，按一下 [擴充]。此圖顯示每個實際裝置上的可用及配置空間。茶色的長條表示可用空間。

  22. 選取 [記錄裝置]，如主要部分，來顯示 [大小 (MB)] 方塊中的可用大小。

  23. 按一下 [立即擴充] 來配置 TempDB 資料庫的空間。

    [編輯資料庫] 對話方塊會顯示新配置的 TempDB 大小。

請參閱 有關本主題的其他資訊，請搜尋 Microsoft SQL Server Enterprise Manager 說明檔中的「擴充資料庫對話方塊」。


最小化記錄檔空間的使用

如果 SQL Server 資料庫上有大量的活動，記錄檔就會快速填滿 (因此伺服器會停止作用)。您可以將記錄檔設定為 Truncate on Checkpoint 來大量延長資料庫記錄檔的壽命。

啟用 Truncate on Checkpoint

  24. 執行 Microsoft SQL Server Enterprise Manager。

  25. 開啟伺服器的樹狀結構。

  26. 開啟資料庫的樹狀結構。

  27. 連按兩下可啟用此功能的資料庫名稱。

  28. 在 [資料庫] 索引標籤上按一下 [刪減]。

  29. 在 [選項] 索引標籤上選取 Truncate Log on Checkpoint，然後按一下 [確定]。

請參閱 有關 Truncate on Checkpoint 功能的其他資訊，請參閱 Microsoft SQL Server 文件。


透過連結控制項顯示資料

連結控制項為資料專屬的控制項，在資料庫中您可藉由這些控制項存取資訊。控制項連結到 RDS.DataControl物件時，Remote Data Service 會從現有資料庫資料錄中提供資料欄值到該控制項。接連著，控制項會顯示資料給您並接受您所做的變更。

藉由 Internet Explorer 4.0，您可以連結到簡單的 HTML 控制項。其他的 ActiveX 資料專屬的控制項可從第三者中獲得，如 Sheridan。

與 Internet Explorer 4.0 資料連結的兩項主要關聯是：資料源及使用者。資料使用者藉由參閱資料源指定連結。若要達成此目的，您的資料使用者 (如文字方塊或格線等控制項) 需指定資料的來源及被連結的資料型態。

大部分的控制項是以下列的資料專屬 <物件> 標記參數來標明。這些參數為 HTML 資料連結副檔名，可在 Internet Explorer 4.0 使用。

參數 | 說明
DATASRC | 表示資料連結的資料源 (RDS.DataControl 物件)。
DATAFLD | 表示一個資料集的資料行。
DATAFORMATAS | (選項) 表示被連結的資料型態。

您可以給特定資料欄一個以上的連結控制項，但是，您不需要在資料表中提供一個連結控制項給每一個資料欄。

當您存取您的網頁前端時，RDS.DataControl 與資料庫便一起運作，讓您存取一個 Recordset。接著，您可以使用 RDS.DataControl 物件上的 MoveFirst, MoveLast, MoveNext, and MovePrevious 巡覽按鈕巡覽 Recordset。您也可以藉由使用 RDS.DataControl 物件上的 SubmitChanges 方法傳送更新資料到資料庫。


安全性及 Web 伺服器

如果您是在您的 Internet Web 伺服器使用 RDSServer.DataFactory 物件，切記如此做會產生一項潛在的安全性危機。因為，外部使用者若取得正確的資料源名稱 (DSN)，使用者 ID 以及密碼資訊便可以寫些程式頁來傳送任何查詢到該資料源。如果您要更嚴格的限制資料源的存取，有一個選項是用來移除註冊和刪除 RDSServer.DataFactory 物件 (msadcf.dll)，它不是以強制格式的查詢方式來使用自訂 business 物件。下一個章節將說明如何執行這個部分。

用戶端人格化及安全性

如果您的 IIS Web 伺服器 Password Authentication 屬性是設定為 Windows NT Challenge/Response，那麼 business 物件就會在用戶端的安全範圍內啟動。此為 RDS 1.5 的一項新功能，該項功能可透過 HTTP 讓用戶端人格化。以這種模式運作時，登錄到 Web 伺服器 (IIS) 的用戶端電腦是以使用者 ID 和密碼來執行，而不是用 anonymous。若 ODBC DSNs 設定為使用信用連結，那麼資料庫存取 (如 SQL Server) 也會在用戶端的安全範圍內啟動。但這只有在資料庫是和 IIS 屬於同一台電腦時才會作用；用戶端的證明身份便不會被帶到另一台電腦上。

例如，有一用戶端，名為 John Doe，以使用者 ID 是「JohnD」，密碼為「secret」登錄到某一部用戶端電腦上。他在一個以瀏覽器為架構的應用程式中執行存取 RDSServer.DataFactory物件，並藉由在 IIS 電腦中的「MySever」 執行 SQL 查詢以建立一個 ADOR.Recordset。MyServer 是建構來使用 「Windows NT Challenge/Response」密碼認證， 它的 ODBC DSN已經選取為「使用信用連接」，而且該部伺服器也包含 SQL Server 資料源。Web 伺服器接收到一項需求時，它會詢問用戶端的使用者 ID 及密碼。如此，該項需求便以「JohnD/Secret」登錄到MyServer 而非 IUSER_MyServer (當 Anonymous 密碼認證啟用時，此為預設值)。同樣地，登錄到 SQL Server 時，便使用「JohnD/Secret」。

因此，IIS NT Challenge/Response 認證模式可在沒有即時表明使用者 ID 以及密碼資訊需要登錄到資料庫狀況下建立 HTML 頁面。如果 IIS 基本認證已經使用，那麼便需要即時表明使用者 ID 了。

密碼認證

RDS 可以和 IIS Web 伺服器通訊，並在三種密碼認證中的任何一種模式下執行：Anonymous、Basic 或 NT Challenge/Response。這些設定定義 Web 伺服器控制項是如何透過它來存取，例如，需要用戶端電腦在 NT Web 伺服器上表明存取權。


開發 Remote Data Service 應用程式

當撰寫 web-based 的資料存取程式時，如果您想使用伺服端的資料，並想要利用 Remote Data Service 資料連結及遙控 (binding 及 remoting) 功能的話，您就必須充分了解如何使用相關的各種元件 (components)。

前一節認識 Remote Data Service 應用程式裡面，我們介紹了三層 (three-tiered) 的 RDS 應用程式，並且解釋了用戶端與伺服端如何藉由資料的傳送來彼此溝通。

本節將介紹以下列主題及其相關資料:

  • 由用戶端取得一個 Recordset

  • 傳送一個更新的 Recordset 到中間層

  • 定義一個 Recordset


由用戶端取得一個 Recordset

利用 RDS，透過以下三種方法，您可將伺服端的資料回傳到用戶端，您可以:

  • 利用 (RDS).DataControl 方法及屬性來自動呼叫 RDSServer.DataFactory 物件

  • 直接呼叫 RDSServer.DataFactory 物件

  • 寫一個用戶自訂的 ActiveX DLL 來執行資料存取的工作

本節將一一介紹如何利用這些方法來傳送 Recordset。


由用戶端取得一個 Recordset

利用 RDS.DataControl 物件來取得 Recordset

您可以藉由設定 RDS.DataControl 的 Connect、Server 及 SQL 屬性，來打開一個未連結的 Recordset。

以下的程式碼將示範如何在設計時設定這些屬性：

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="ADC1">
    <PARAM NAME="SQL" VALUE="Select * from Products">
    <PARAM NAME="Connect" VALUE="DSN=AdvWorks;">
    <PARAM NAME="Server" VALUE="http://SalesWeb/">
</OBJECT>

對 RDS.DataControl 的屬性設定完成後，再呼叫 Refresh 方法，系統將自動呼叫 RDSServer.DataFactory 物件，同時 Remote Data Service 會回傳一個 Recordset 合到用戶端，這也就是說您不需要直接使用 RDSServer.DataFactory，萬一您有需要使用該物件時，請參照《利用 RDSServer.DataFactory 物件來取得 Recordset》。


利用 RDSServer.DataFactory 物件來取得 Recordset

Remote Data Service 包含了一個稱之為 RDSServer.DataFactory 伺服端 business 物件 (ActiveX (R) DLL)。藉由該物件，您可以對資料源端直接下命令，並透過網際網路或企業網路，將結果回傳，RDSServer.DataFactory 是標準的 ActiveX DLL 配備，因此只要寫一點點程式您就可以在您的網頁上提供動態的資料。

以下的例子將示範如何從 VBScript 網頁中呼叫 RDSServer.DataFactory 物件，您將利用用戶端的 RDS.DataSpace 物件，建立一個伺服端的 RDSServer.DataFactory 物件，

<HTML>
<HEAD></HEAD>
<BODY>

<!-- RDS.DataControl -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=ADC1>
</OBJECT>
<!-- RDS.DataSpace -->
<OBJECT ID="ADS1" WIDTH=1 HEIGHT=1
  CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>
.
.
.
<SCRIPT LANGUAGE="VBScript">
Option Explicit
Sub Window_OnLoad()
  Dim ADF1, myRS
  Set ADF1 = ADS1.CreateObject("RDSServer.DataFactory", _
  "http://<%=Request.ServerVariables("SERVER_NAME")%>")
  Set myRS = _
  ADF1.Query("DSN=pubs;UID=sa;PWD=permission;", _
  "Select * From Authors")
  ' Assign the returned recordset to SourceRecordset.
  ADC1.SourceRecordset = myRS
End Sub
</SCRIPT>
</BODY>
</HTML>


利用用戶自訂 business 物件來取得一個 Recordset

如果您不想使用 RDSServer.DataFactory 物件來將 Recordset 物件傳送到用戶端，您也可以建立自己的用戶自訂 business 物件，並在伺服端執行，利用 Microsoft (R) Visual Basic (R) Microsoft (R) Visual C++ (R) 可自動建立通用物件的工具，或是 Active Server Pages scripting code 所產生的伺服端 HTML 網頁來建立 DLL (dynamic-link library)，用戶端及網頁前端的應用程式呼叫 business 物件來執行所需的函數，而在中間層的 business 物件接著便與後端的資料庫進行溝通。

用戶自訂的 DLLs 的方法，可超過在 RDSServer.DataFactory ActiveX DLL 所簡單定義的方法，這些方法並不一定必須是與資料存取相關，例如可能只是包含一些商業規則的確認。本節包含以下相關資訊:

  • 利用用戶自訂的 ActiveX DLL 寫程式來傳送 Recordset 物件


利用用戶自訂的 ActiveX DLL 寫程式來傳送 Recordset 物件

以下的 Microsoft (R) Visual Basic (R)、Scripting Edition 用戶端程式碼，除了使用一個用戶自訂的 business 物件外，與前一個 RDSServer.DataFactory 碼執行相同的工作，在本例的 MyCustomBusinessObject 中，您將繼續使用用戶端的 RDS.DataSpace 物件來建立一個伺服端的 business 物件。

<HTML>
<HEAD></HEAD>
<BODY>

<!-- RDS.DataControl -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=ADC1>
</OBJECT>
<!-- RDS.DataSpace -->
<OBJECT ID="ADS1" WIDTH=1 HEIGHT=1
  CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>
.
.
.
<SCRIPT LANGUAGE="VBScript">
Option Explicit
Sub GetRecords()
  Dim objMyCustomBusinessObject, myRS
  Set objMyCustomBusinessObject = _
  ADS1.CreateObject("MyCustomBusinessObject", _
  "http://<%=Request.ServerVariables("SERVER_NAME")%>")
  ' Assume MyCustomBusinessObject has a method called
  ' GetData that takes connection string and SQL
  ' parameters.
  Set myRS = _
  objCustomBusinessObject.GetData _
  ("DSN=pubs;UID=sa;PWD=permission;", _
  "Select * From Authors")
  ' Assign the returned recordset to SourceRecordset.
  ADC1.SourceRecordset = myRS
End Sub
</SCRIPT>
</BODY>
</HTML>

假設您是使用 Visual Basic 來建立位於中間層的 MyCustomBusinessObject ActiveX DLL，而 MyCustomBusinessObject 類別中 GetData 方法的程式碼可能如下。請注意，您可直接使用 ActiveX (R) Data Objects (ADO)。

' Returns an ADO resultset.
Public Function GetData(szCnStr As String, szSQL _
  As String) As Object

  Dim cn As New ADODB.Connection
  Dim rs As New ADODB.Recordset

  cn.Open szCnStr
  ' The ADODB.Recordset should generate Recordset
  ' objects that can be disconnected and later
  ' reconnected to process batch updates.
  rs.CursorLocation = adUseClientBatch
  ' Using the Unspecified parameters, an ADO/R
  ' recordset is returned.
  rs.Open szSQL, cn, _
  adOpenUnspecified, adLockUnspecified, _
  adCmdUnspecified
  Set GetData = rs
End Function

秘訣

  • 記得在試圖傳送 Recordset 物件前，先在您的伺服端組件放一個簡單的方法來作的單純功能測試。

  • 在使用 Internet Explorer 測試您伺服端的組件前，先建立一個簡單的用戶端應用程式來測試

  • 利用用戶端測試用 Web 伺服器，會使得您的應用程式開發變的較為容易，反之您就必須每次將重新編譯的 .dll 複製並註冊到伺服端。

  • 傳給 business 物件的 DSN 必須是伺服端系統的 DSN，如果其不存在或未被適當的的設定，則您的組件就無法順利啟動，因此可利用如 MSQuery 等其他 ODBC 應用程式來測試伺服端系統的，以確保 DSN 已被適當的的設定，

  • 如果使用者自訂 business 物件之方法名稱不超過 255 個字元，便可使其與 RDS 所支援的所有協定相容(HTTP, HTTPS, DCOM, 及 running in-process)。

  • 如果您使用 Visual Basic 並以早期方法 (early binding) 連結 ADOR 1.0 type 程式庫來建立使用者自訂 business 物件，則您必須使用ADOR 2.0 type 程式庫重新編譯您的使用者自訂 business 物件。


傳送更新之 Recordset 到中間層

您可以利用以下的方法，將 Recordset 從用戶端的電腦，傳送到中間層及資料庫伺服器:

  • 透過 RDS.DataControl 物件

  • 透過 ADO 及中間層的使用者自訂 business 物件


使用 RDS.DataControl 來傳送更新中斷之 Recordset 物件到中間層

資料連結型的控制 (Data-bound controls) 讓使用者可以透過更視覺化的方法對資料錄進行編輯、新增或刪除，所有資料的更動將一直儲存在用戶端，直到使用者確認或取消這個更新的動作，

一般說來，您會將 grid 控制 (control) 與 RDS.DataControl 物件連結在一起，然後透過使用者介面對用戶端的 Recordset，加以新增、編輯和刪除。在對用戶端的資料更新完畢後，您需要利用 RDS.DataControl 物件的 SubmitChanges 方法，將修改過的資料儲存到資料庫。透過 SubmitChanges 方法可將用戶端位於暫存區，等待更新的 Recordset 送到 RDS.DataControl 物件中 Connect 屬性所標示的 OLE DB 資料源。

以下的範例程式將示範如何達到這個目的:

Sub Update_OnClick
    ADC1.SubmitChanges
End Sub

只有變更過的資料錄會被傳送並修改，而且不是一個接著一個傳送，就是全部都未傳送。

您也可以用 Cancel 按鈕來取消對所作的 Recordset 變更：

Sub Cancel_OnClick
    ADC1.CancelUpdate
End Sub

註解

  • 在使用 RDS.DataControl 物件的 SubmitChanges 方法前，必須先將 Connect、 Server 及 SQL 屬性設定好，因為當重新連結資料源時，這些屬性將會被用到。

  • 如果您在為同樣的 Recordset 物件呼叫 SubmitChanges 後，呼叫 CancelUpdate 方法，則呼叫 CancelUpdate 會失敗，這是因為更新已經被確認過了。


使用 ADO 來傳送 Recordset 物件到中間層

您可以利用 ADOR.Recordset 物件，從用戶端的網頁到中間層 business 物件，來排列 Recordset，舉例來說，如果使用者連結到一個虛擬商場並選擇購買一些商品，利用 RDS.DataControl 物件及儲存於緩衝區內的 Recordset，我們便可以使其所選擇的商品，呈現在虛擬的購物車上，當客戶按下確認採購的按鍵時，我們便建立一個 ADOR.Recordset 物件並 將當作是一個參數，將其傳送給應用程式伺服器的 business 函數 (ApplyUpdates)，這將使的該 Recordset 透過伺服器進行排列 (marshal)，而這個 ApplyUpdates business 函數則會連結上銷售資料庫，並更新資料。

' Code on a client Web page.
Sub PurchaseItem_OnClick
    Set rst = ADC1.Recordset

' The following option tells the recordset to only send
' back changed records when updating. This makes the roundtrips
' more lightweight.
    rst.MarshalOptions = adMarshalModifiedOnly

' Call the ApplyUpdates function on the MyObj
' business object and pass the ador.Recordset
' object as an input parameter.
    MyObj.ApplyUpdates rst

End Sub

' VB code in the business object.
' ApplyUpdates is a method in a
' middle-tier business object.
Sub ApplyUpdates(rst As ADOR.Recordset)

    rst.ActiveConnection =  _
        "DSN=SalesDB;UID=SMgr;PWD=password"

' Save the changed records.
    rst.UpdateBatch

End Sub


定義一個 Recordset

您可以建立一個 ADODB.Recordset 物件，並設定資料行資訊，然後便可將資料插入這個 Recordset 物件中;而資料列集緩衝區內的資料就會被插入。

下面的範例程式將示範如何使用 RDSServer.DataFactory 來定義一個 Recordset，您也可以利用 RDS.DataControl 物件做同樣的事。

Sub RsDefineShape()

    Dim vntRecordShape(3)
    Dim vntField1Shape(3)
    Dim vntField2Shape(3)
    Dim vntField3Shape(3)
    Dim vntField4Shape(3)

    ' For each field, specify the name,
    ' type, size, and nullability.

    vntField1Shape(0) = "Name"    ' Column name.
    vntField1Shape(1) = CInt(129)    ' Column type.
    vntField1Shape(2) = CInt(40)    ' Column size.
    vntField1Shape(3) = False        ' Nullable?

    vntField2Shape(0) = "Age"
    vntField2Shape (1) = CInt(3)
    vntField2Shape (2) = CInt(-1)
    vntField2Shape (3) = True

    vntField3Shape (0) = "DateOfBirth"
    vntField3Shape (1) = CInt(7)
    vntField3Shape (2) = CInt(-1)
    vntField3Shape (3) = True

    vntField4Shape (0) = "Balance"
    vntField4Shape (1) = CInt(6)
    vntField4Shape (2) = CInt(-1)
    vntField4Shape (3) = True

    ' Put all fields into an array of arrays.
    vntRecordShape(0) = vntField1Shape
    vntRecordShape(1) = vntField2Shape
    vntRecordShape(2) = vntField3Shape
    vntRecordShape(3) = vntField4Shape

    ' Use the RDSServer.DataFactory to create an empty
    ' recordset. It takes an array of variants where
    ' every element is itself another array of
    ' variants, one for every column required in the
    ' recordset.
    ' The elements of the inner array are the column's
    ' name, type, size and nullability.

    Dim NewRs

    ' You could just use the RDS.DataControl object
    ' instead of the RDSServer.DataFactory object. In
    ' that case, the following code would be Set NewRS
    ' = ADC1.CreateRecordset(vntRecordShape)
    Set NewRS = ADF.CreateRecordset(vntRecordShape)

    Dim fields(3)
    fields(0) = vntField1Shape(0)
    fields(1) = vntField2Shape (0)
    fields(2) = vntField3Shape (0)
    fields(3) = vntField4Shape (0)

    ' Populate the new recordset with data values.
    Dim fieldVals(3)

    ' Use AddNew to add the records.
    fieldVals(0) = "Joe"
    fieldVals(1) = 5
    fieldVals(2) = CDate(#1/5/96#)
    fieldVals(3) = 123.456
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Mary"
    fieldVals(1) = 6
    fieldVals(2) = CDate(#6/5/96#)
    fieldVals(3) = 31
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Alex"
    fieldVals(1) = 13
    fieldVals(2) = CDate(#1/6/96#)
    fieldVals(3) = 34.0001
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Susan"
    fieldVals(1) = 13
    fieldVals(2) = CDate(#8/6/96#)
    fieldVals(3) = 0.0
    NewRS.AddNew fields, fieldVals

    NewRS.MoveFirst

    ' Set the newly created and populated Recordset to
    ' the SourceRecordset property of the
    ' RDS.DataControl to bind to visual controls.
    Set ADC1.SourceRecordset = NewRS

End Sub


Remote Data Service 疑難排除

以下章節主要在探討遇到某些特定的錯誤時，應採取什麼動作。

  • "Internet Server 錯誤：拒絕存取"

  • 執行範例程式時出現 "無法預期的錯誤" 訊息

  • 搭配使用 RDS.DataControl 和 Sheridan Combo Box 控制項

  • 可重覆讀取的隔離層 (Isolation Level) 所引發的死結

  • RDS.DataControl 和多個 Recordset 要求

  • 過期的 Class IDs


" Internet Server 錯誤：拒絕存取"

如果您得這樣的錯誤訊息，通常它的意思是指 Microsoft (R) Internet Information Server (IIS) 傳回了下列這樣的狀態：

HTTP_STATUS_DENIED 401

首先要確定 IIS 對所存取的目錄擁有適當的許可權。不管 IIS Web 伺服器是正在執行下面這三種密碼認証模式中的哪一種，RDS 1.5 都可以跟它進行溝通。這三種密碼認証模式分別是：Anonymous 模式，Basic 模式，和 NT Challenge/Response 模式。跟之前的版本不一樣的是，Allow Anonymous 的設定已經不再需要了。如果擁有資料源的電腦是 Windows NT (R) 的話，那 Web 伺服器也必須要擁有適當的許可權才行。


執行範例程式時出現 "無法預期的錯誤" 訊息

伺服器查核表

  • 如果您重新安裝 IIS 的話，就必須在裝完 IIS 之後重新安裝 Remote Data Service。

  • 如果您目前正在使用 Microsoft SQL Server 當作您後端的資料源的話，必須使用 Microsoft SQL Server 6.5、Service Pack 2 或更新的版本。

  • 確定 ODBC DSNs 是 System DSNs 而不是 User DSNs。Anonymous 使用者經由 IIS 登錄時只能看到 System DSNs 而已。

  • 檢查看看您的 WWW 服務所使用匿名使用者帳號是不是您的網域底下的一個使用者，這個網域擁有所有相關伺服器和目錄的 NTFS 權限。最後，確認一下這個匿名使用者帳號的密碼是不是過期了。

  • 因為 Remote Data Service 安裝在 C:\Program Files\Common Files\System\MSADC 目錄下，所以請使用 IIS Service Manager 來檢查 Anonymous 使用者是否可以存取這個目錄。它應該具有 Read 和 Execute 的權限。

  • 如果您在使用 Remote Data Service DLLs 和一些範例程式有問題時，可以使用 Regsvr32.exe 來將 DLL 重新註冊一次。

  • 如果您正在撰寫您自己的 business 物件，那請將您的 Active Server Pages script 檔案 (.asp) 放在一個目錄。這個目錄必須讓 Anonymous 使用者 (在 IIS 裡) 擁有 Execute 的權利。


搭配使用 DataControl 和 Sheridan Combo Box 控制項

Sheridan combo box 有兩個可以跟 RDS.DataControl 產生關聯的屬性。只讓 combo box 和 RDS.DataControl 產生關聯並不會自動讓 "Text" 這個屬性也跟著變化。"Text" 是一個沒有辦法跟別的物件產生關聯的屬性，它只會顯示目前選取的項目。因此，即使在 Refresh 方法被呼叫之後，很有可能它還顯示著之前的舊資料。

一個解決的方法就是使用下面這兩個 Microsoft (R) Visual Basic (R) 所示範的方法一樣。這兩種方法都可以在 Refresh 被呼叫後把 Text 這個屬性的內容清除掉。在這些範例裡頭，SSCombo 是Sheridan combo box 控制項的名字。

Sub SSCombo_InitColumnProps()
    SSCombo.Text=""
End Sub

Sub Refresh_OnClick
    ADC1.Refresh
    SSCombo.Text=""
End Sub


可重覆讀取的隔離層 (Isolation Level) 所引發的死結

如果一個自訂 business 物件利用可重複讀取的隔離層 (isolation level) 來存取 SQL Server，而且在同一個交易過程中又有兩個用戶端的程式同時呼叫這個 business 物件，要求查詢並更新的話，那麼就可能引發死結 (deadlock)。Remote Data Service 可以允許其中一個程序在設定的時間過後來解除這個死結，但是，這樣一來，解除死結的程序就沒辦法幫它的用戶端執行更新的動作了。

您可以在 Web 伺服器中增加一個註冊區 (Registry entry) 來修改在多少時間後去解除死結。預設值是 30 秒 (或是 30,000 毫秒)。

修改等待時間值的方式

  1. 從 [開始] 選擇 [執行]。

  2. 鍵入 [RegEdit] 並按 [確定]。

  3. 在登錄編輯器裡面，找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters 機碼。

  4. 選擇 [Parameters] 機碼。從 [編輯] 功能表移到 [新增]，並選擇 [DWORD 值]。

  5. 在 [名稱] 欄位裡鍵入 [ADCUpdateTimeout] 並按 Enter。

  6. 在新增出來的註冊區裡按兩下。在 [編輯 DWORD 值] 對話方塊裡，以毫秒為單位在 [數值資料] 裡輸入新的值。這個值必須大於或等於 0。


DataControl 和多個 Recordset 要求

RDS.DataControl 和多個 Recordset 要求

如果您查詢了好幾個結果，但是通常只有第一個 Recordset 會傳回來。而如果您需要多個結果的話，就可以把每一個結果都指定給它們自己的 RDS.DataControl。一個查詢多個結果的例子如後 "Select * from Authors, Select * from Topics"。


過期的 Class ID

如果您收到 RDS.DataSpace 或 RDS.DataControl 物件未載入的錯誤訊息，首先確定您使用的 class ID 是否正確。從 1.0 版到 1.1 版，這兩個物件的 class ID 已經有所更動了。它們的正確 class ID 如下表所示。

物件 | Class ID
RDS.DataControl | BD96C556-65A3-11D0-983A-00C04FC29E33
RDS.DataSpace | BD96C556-65A3-11D0-983A-00C04FC29E36


ADO 程式範例

使用下列程式範例，學習如何使用 ADO 物件、方法、與屬性。

注意 請將 Sub 至 End Sub 間所有的程式範例都貼到您的程式編輯器。如果只使用部份範例或遺失段落格式，則可能無法正確執行程式。

  • ADO 物件範例

  • ADO 方法範例

  • ADO 屬性範例


ADO 物件範例

使用下列程式範例，學習如何使用 ADO 物件。

注意 請將 Sub 至 End Sub 間所有的程式範例都貼到您的程式編輯器。如果只使用部份範例或遺失段落格式，則可能無法正確執行程式。

  • RDS.DataControl 物件範例 (VBScript)

  • RDS.DataSpace Object 與 CreateObject 方法範例 (VBScript)

  • RDSServer.DataFactory Object、Query 方法、與 CreateObject 方法範例 (VBScript)


DataControl 物件範例 (VBScript)

下面的程式碼會顯示如何在設計階段設定 RDS.DataControl 參數，並以名為 ADCDemo 的 ODBC 資料來源將其連結至一個資料感知的控制項。若您遵循指引，ADCDemo 會安裝在您的伺服器上，做為 SQL 伺服器 ODBC 資料來源。請在一般的 HTML 文件中，剪下並貼上介於 <Body></Body> 標記間的程式碼，並將其命名為 ADCapi1.asp。ASP script 將會識別您的伺服器。

<Center><H2>RDS API Code Examples</H2>
<HR><BR>
<H3>Remote Data Service</H3>
<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
</OBJECT>
<!-- Remote Data Service with Parameters set at Design Time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
</OBJECT><BR><HR></Center>

下面的範例將會顯示如何在執行階段設定必要的 RDS.DataControl 參數。若要測試這個範例，請在一般 HTML 文件中，剪下並貼上介於 <Body></Body> 標記間的程式碼，並將其命名為 ADCapi2.asp。ASP script 將會識別您的伺服器。

<Center><H2>RDS API Code Examples </H2>
<HR><BR>
<H3>Remote Data Service Run Time</H3>
<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="Remote Data Service Run Time">
</OBJECT>

<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
    </OBJECT>
<HR>
<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
<Input Size=70 Name="txtConnect" Value="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
<BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Fill Grid with these values or change them to see data from another ODBC data source on your server</H4>
</Center>
<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub Run_OnClick
    ADC.Server = txtServer.Value
    ADC.SQL = txtSQL.Value
    ADC.Connect = txtConnect.Value
    ADC.Refresh
End Sub
-->
</Script>


DataSpace 物件及 CreateObject 方法範例 (VBScript)

下面的範例將會顯示如何使用 RDS.DataSpace 的 CreateObject 方法與預設的 RDSServer.DataFactory business 物件。若要測試這個範例，請在一般 HTML 文件中，剪下並貼上介於 <Body></Body> 標記間的程式碼，並將其命名為 ADCapi8.asp。ASP script 將會識別您的伺服器。

<Center><H2>RDS API Code Examples </H2>
<HR><H3>Using Query Method of RDSServer.DataFactory</H3>

<!-- RDS.DataSpace  ID ADS1-->
<OBJECT ID="ADS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl with parameters set at run time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
</OBJECT>

<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="RDSServer.DataFactory Run Time">
</OBJECT>
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Click Run. The CreateObject Method of the RDS.DataSpace Object Creates an instance of the RDSServer.DataFactory.
The Query Method of the RDSServer.DataFactory is used to bring back a Recordset. </H4>
</Center>
<Script Language="VBScript">
<!--
Dim ADF
Dim strServer
Dim strConnect
Dim strSQL
strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
strConnect = "dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;"
strSQL = "Select * from Employee"

Sub Run_OnClick()
    Dim objADORs        'Create Recordset Object
Set ADF = ADS1.CreateObject("RDSServer.DataFactory", strServer)                'Get Recordset
Set objADORs = ADF.Query(strConnect, strSQL)
' Use  RDS.DataControl to bind Recordset to Data
' Aware Grid Control

    ADC.SourceRecordset = objADORs

End Sub
-->
</Script>

下面的範例將會顯示如何使用 CreateObject 方法來建立稱之為 VbBusObj.VbBusObjCls 的自訂 business 物件。這個範例也將會使用 Active Server Pages scripting 來識別 Web 伺服器名稱。若要參考完整的範例，請以範例應用程式選取器自 Client Tier column 選取 "VBScript in Internet Explorer"，及自 Middle Tier column 選取 “Custom Visual Basic Business Object”。

Sub Window_OnLoad()
    strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
    Set BO = ADS1.CreateObject("VbBusObj.VbBusObjCls", strServer)
    txtConnect.Value = "dsn=pubs;uid=sa;pwd=;"
    txtGetRecordset.Value = "Select * From authors for Browse"
End Sub


DataFactory 物件、Query 方法、與 CreateObject 方法範例 (VBScript)

此範例會使用 RDS.DataSpace 物件的 CreateObject 方法建立 RDSServer.DataFactory 物件。若要測驗此範例，請剪下 <Body></Body> 標記間的程式碼，並貼到一般 HTML 文件內，並將其命名為 ADCapi7.asp。ASP script 將會辨識您的伺服器。

<Center><H2>RDS API Code Examples</H2>
<HR><H3>Using Query Method of RDSServer.DataFactory</H3>

<!-- RDS.DataSpace  ID ADS1-->
<OBJECT ID="ADS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl with parameters
set at run time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
</OBJECT>

<Object classid ="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables _
    ("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE=" RDSServer.DataFactory Run Time">
</OBJECT>
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Click Run. The CreateObject Method of the
RDS.DataSpace Object Creates an instance of the
RDSServer.DataFactory.
The Query Method of the RDSServer.DataFactory is used
to bring back a Recordset. </H4>
</Center>
<Script Language="VBScript">
<!--
Dim ADF
Dim strServer
Dim strConnect
Dim strSQL

strServer = "http://<%=Request.ServerVariables _
("SERVER_NAME")%>"
strConnect = "dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;"
strSQL = "Select * from Employee"

Sub Run_OnClick()
' Create RDSServer.DataFactory Object
    Dim objADORs
' Get Recordset
Set ADF = ADS1.CreateObject("RDSServer.DataFactory", strServer)
Set objADORs = ADF.Query(strConnect, strSQL)
' Set parameters of RDS.DataControl at Run Time
    ADC.Server = strServer
    ADC.SQL = strSQL
    ADC.Connect = strConnect
    ADC.Refresh
End Sub
-->
</Script>


ADO 方法範例

使用下列主題，學習如何使用 ADO 方法。

注意 請從 Sub 到 End Sub，將整個程式範例貼到您的程式編輯器。如果僅使用部份範例或段落格式遺失，則可能無法正確執行範例。

  • AddNew 方法範例

  • Append 與 CreateParameter 方法範例

  • AppendChunk 與 GetChunk 方法範例

  • BeginTrans、CommitTrans、與 RollbackTrans 方法範例

  • Cancel 方法範例

  • Cancel 方法範例 (VBScript)

  • CancelUpdate 方法範例 (VBScript)

  • Clone 方法範例 (Visual Basic)

  • ConvertToString 方法範例 (VBScript)

  • CreateRecordset 方法範例 (VBScript)

  • Delete 方法範例

  • Execute、Requery、與 Clear 方法範例

  • GetRows 方法範例

  • Move 方法範例

  • MoveFirst、MoveLast、MoveNext、與 MovePrevious 方法範例

  • NextRecordset 方法範例

  • Open 與 Close 方法範例

  • OpenSchema 方法範例

  • Refresh 方法範例 (Visual Basic)

  • Refresh 方法範例 (VBScript)

  • Resync 方法範例

  • SubmitChanges 方法範例 (VBScript)

  • Supports 方法範例

  • Update 與 CancelUpdate 方法範例

  • UpdateBatch 與 CancelBatch 方法範例

AddNew 方法範例

此範例使用 AddNew 方法，依據指定的名稱，建立新的紀錄。

Public Sub AddNewX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strID As String
    Dim strFirstName As String
    Dim strLastName As String
    Dim booRecordAdded As Boolean

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=;"
    cnn1.Open strCnn

    ' Open Employee table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Get data from the user. The employee ID must be formatted as
    ' first, middle, and last initial, five numbers, then M or F to
    ' signify the gender. For example, the employee id for Bill Sornsin
    ' would be "B-S55555M".
    strID = Trim(InputBox("Enter employee ID:"))
    strFirstName = Trim(InputBox("Enter first name:"))
    strLastName = Trim(InputBox("Enter last name:"))

    ' Proceed only if the user actually entered something
    ' for both the first and last names.
    If (strID <> "") And (strFirstName <> "") _
        And (strLastName <> "") Then

        rstEmployees.AddNew
        rstEmployees!emp_id = strID
        rstEmployees!fname = strFirstName
        rstEmployees!lname = strLastName
        rstEmployees.Update
        booRecordAdded = True

        ' Show the newly added data.
        MsgBox "New record: " & rstEmployees!emp_id & " " & _
            rstEmployees!fname & " " & rstEmployees!lname

    Else
        MsgBox "Please enter an employee ID, " & _
            "first name, and last name."
    End If

    ' Delete the new record because this is a demonstration.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strID & "'"

    rstEmployees.Close
    cnn1.Close

End Sub

VBScript 版本

下列是使用 VBScript 撰寫，用於 Active Server Page (ASP) 的相同範例。若要檢視此全功能性範例，您必須使用安裝 IIS 時的資料來源 AdvWorks.mdb (位於 C:\InetPub\ASPSamp\AdvWorks)，建立稱為 AdvWorks 的系統資料來源名稱 (Data Source Name，DSN)。這是一個 Microsoft Access 資料庫檔案。請使用 [尋找] 來尋找檔案 Adovbs.inc 並將其置於您計畫使用的目錄下。剪下及貼上下列程式碼至 [記事本] 或其它文字編輯器，並儲存為 AddNew.asp。您可以在任何客戶端瀏覽器上檢視結果。

若要練習此範例，在 HTML 表單新增虛構的新紀錄。請按一下 [新增]。請參見 Delete 方法範例來移除不要的紀錄。

<!-- #Include file="ADOVBS.INC" -->
<% Language = VBScript %>
<HTML><HEAD><TITLE>ADO Open Method</TITLE>
</HEAD><BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center><H3>ADO AddNew Method</H3>
<!-- ADO Connection Object used to create recordset-->
<%
'Create and Open Connection Object
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "AdvWorks"
'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConnection
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open

%>
<!-- If this is first time page is open, Form collection will be empty when data is entered.

run AddNew method-->
<% If Not IsEmpty(Request.Form) Then
    If Not Request.Form("CompanyName") = "" Then
        RsCustomerList.AddNew
        RsCustomerList("CompanyName") = Request.Form("CompanyName")
        RsCustomerList("ContactLastName") = Request.Form("LastName")
        RsCustomerList("ContactFirstName") = Request.Form("FirstName")
        RsCustomerList("PhoneNumber") = Request.Form("PhoneNumber")
        RsCustomerList("City") = Request.Form("City")
        RsCustomerList("StateOrProvince") = Request.Form("State")
        RsCustomerList.Update
        RsCustomerList.MoveFirst

    End If
End If
%>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Customer Table-->

<TR><TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Company Name</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Contact Name</FONT></TD>
<TD ALIGN=CENTER WIDTH=150 BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Phone Number</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>City</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>State/Province</FONT></TD></TR>
<!--Display ADO Data from Customer Table one row on each pass through recordset-->
<% Do While Not RsCustomerList.EOF %>
  <TR><TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RSCustomerList("CompanyName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
   <%= RScustomerList("PhoneNumber")%>
 </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("City")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("StateOrProvince")%>
  </FONT></TD></TR>
<!-- Next Row = Record Loop and add to row html table-->
<%
RScustomerList.MoveNext
Loop
%>

</TABLE><HR>
<!-- Form to enter new record posts variables back to this page -->
<Table>
<Form Method = Post Action="AddNew.asp" Name=Form>
<TR><TD><P>Company Name:</TD>
<TD><Input Type="Text" Size="50" Name="CompanyName" Value = ""></P></TD>
<TR><TD><P>Contact First Name:</TD>
<TD><Input Type="Text" Size="50" Name="FirstName" Value = ""></P></TD>
<TR><TD><P>Contact Last Name:</TD>
<TD><Input Type="Text" Size="50" Name="LastName" Value = ""></P></TD>
<TR><TD><P>Contact Phone:</TD>
<TD><Input Type="Text" Size="50" Name="PhoneNumber" Value = ""></P></TD>
<TR><TD><P>City:</TD>
<TD><Input Type="Text" Size="50" Name="City" Value = ""></P></TD>
<TR><TD><P>State / Province:</TD>
<TD><Input Type="Text" Size="5" Name="State" Value = ""></P></TD>
<TR><TD><Input Type="Submit" Value="Add New "><Input Type="Reset" Value="Reset Form">
</Form></Table></Center></FONT>
<%'Show location of DSN data source
Response.Write(OBJdbConnection)
%>
<Script Language = "VBScript">
Sub Form_OnSubmit
    MsgBox "Sending New Record to Server",,"ADO-ASP _Example"
End Sub
</Script>
</BODY></HTML>


AddNew Method Example

AddNew 方法範例

此範例使用 AddNew 方法，依據指定的名稱，建立新的紀錄。 Public Sub AddNewX()

Public Sub AddNewX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strID As String
    Dim strFirstName As String
    Dim strLastName As String
    Dim booRecordAdded As Boolean

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=;"
    cnn1.Open strCnn

    ' Open Employee table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Get data from the user. The employee ID must be formatted as
    ' first, middle, and last initial, five numbers, then M or F to
    ' signify the gender. For example, the employee id for Bill Sornsin
    ' would be "B-S55555M".
    strID = Trim(InputBox("Enter employee ID:"))
    strFirstName = Trim(InputBox("Enter first name:"))
    strLastName = Trim(InputBox("Enter last name:"))

    ' Proceed only if the user actually entered something
    ' for both the first and last names.
    If (strID <> "") And (strFirstName <> "") _
        And (strLastName <> "") Then

        rstEmployees.AddNew
        rstEmployees!emp_id = strID
        rstEmployees!fname = strFirstName
        rstEmployees!lname = strLastName
        rstEmployees.Update
        booRecordAdded = True

        ' Show the newly added data.
        MsgBox "New record: " & rstEmployees!emp_id & " " & _
            rstEmployees!fname & " " & rstEmployees!lname

    Else
        MsgBox "Please enter an employee ID, " & _
            "first name, and last name."
    End If

    ' Delete the new record because this is a demonstration.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strID & "'"

    rstEmployees.Close
    cnn1.Close

End Sub

VBScript 版本

下列是使用 VBScript 撰寫，用於 Active Server Page (ASP) 的相同範例。 若要檢視此全功能性範例，您必須使用安裝 IIS 時的資料來源 AdvWorks.mdb (位於 C:\InetPub\ASPSamp\AdvWorks)，建立稱為 AdvWorks 的系統資料來源名稱 (Data Source Name，DSN)。這是一個 Microsoft Access 資料庫檔案。請使用 [尋找] 來尋找檔案 Adovbs.inc 並將其置於您計畫使用的目錄下。剪下及貼上下列程式碼至 [記事本] 或其它文字編輯器，並儲存為 AddNew.asp。您可以在任何客戶端瀏覽器上檢視結果。

若要練習此範例，在 HTML 表單新增虛構的新紀錄。請按一下 [新增]。請參見 Delete 方法範例來移除不要的紀錄。

<!-- #Include file="ADOVBS.INC" -->
<% Language = VBScript %>
<HTML><HEAD><TITLE>ADO Open Method</TITLE>
</HEAD><BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center><H3>ADO AddNew Method</H3>
<!-- ADO Connection Object used to create recordset-->
<%
'Create and Open Connection Object
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "AdvWorks"
'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConnection
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open

%>
<!-- If this is first time page is open, Form collection will be empty when data is entered.

run AddNew method-->
<% If Not IsEmpty(Request.Form) Then
    If Not Request.Form("CompanyName") = "" Then
        RsCustomerList.AddNew
        RsCustomerList("CompanyName") = Request.Form("CompanyName")
        RsCustomerList("ContactLastName") = Request.Form("LastName")
        RsCustomerList("ContactFirstName") = Request.Form("FirstName")
        RsCustomerList("PhoneNumber") = Request.Form("PhoneNumber")
        RsCustomerList("City") = Request.Form("City")
        RsCustomerList("StateOrProvince") = Request.Form("State")
        RsCustomerList.Update
        RsCustomerList.MoveFirst

    End If
End If
%>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Customer Table-->

<TR><TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Company Name</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Contact Name</FONT></TD>
<TD ALIGN=CENTER WIDTH=150 BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Phone Number</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>City</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>State/Province</FONT></TD></TR>
<!--Display ADO Data from Customer Table one row on each pass through recordset-->
<% Do While Not RsCustomerList.EOF %>
  <TR><TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RSCustomerList("CompanyName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
   <%= RScustomerList("PhoneNumber")%>
 </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("City")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("StateOrProvince")%>
  </FONT></TD></TR>
<!-- Next Row = Record Loop and add to row html table-->
<%
RScustomerList.MoveNext
Loop
%>

</TABLE><HR>
<!-- Form to enter new record posts variables back to this page -->
<Table>
<Form Method = Post Action="AddNew.asp" Name=Form>
<TR><TD><P>Company Name:</TD>
<TD><Input Type="Text" Size="50" Name="CompanyName" Value = ""></P></TD>
<TR><TD><P>Contact First Name:</TD>
<TD><Input Type="Text" Size="50" Name="FirstName" Value = ""></P></TD>
<TR><TD><P>Contact Last Name:</TD>
<TD><Input Type="Text" Size="50" Name="LastName" Value = ""></P></TD>
<TR><TD><P>Contact Phone:</TD>
<TD><Input Type="Text" Size="50" Name="PhoneNumber" Value = ""></P></TD>
<TR><TD><P>City:</TD>
<TD><Input Type="Text" Size="50" Name="City" Value = ""></P></TD>
<TR><TD><P>State / Province:</TD>
<TD><Input Type="Text" Size="5" Name="State" Value = ""></P></TD>
<TR><TD><Input Type="Submit" Value="Add New "><Input Type="Reset" Value="Reset Form">
</Form></Table></Center></FONT>
<%'Show location of DSN data source
Response.Write(OBJdbConnection)
%>
<Script Language = "VBScript">
Sub Form_OnSubmit
    MsgBox "Sending New Record to Server",,"ADO-ASP _Example"
End Sub
</Script>
</BODY></HTML>


Append 與 CreateParameter 方法範例

此範例使用 Append 與 CreateParameter 方法來執行帶有輸入參數的預存程序。

Public Sub AppendX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Open connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn
    cnn1.CursorLocation = adUseClient

    ' Open command object with one parameter.
    Set cmdByRoyalty = New ADODB.Command
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc

    ' Get parameter value and append parameter.
    intRoyalty = Trim(InputBox("Enter royalty:"))
    Set prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", _
        adInteger, adParamInput)
    cmdByRoyalty.Parameters.Append prmByRoyalty
    prmByRoyalty.Value = intRoyalty

    ' Create recordset by executing the command.
    Set cmdByRoyalty.ActiveConnection = cnn1
    Set rstByRoyalty = cmdByRoyalty.Execute

    ' Open the Authors table to get author names for display.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "authors", cnn1, , , adCmdTable

    ' Print current data in the recordset, adding
    ' author names from Authors table.
    Debug.Print "Authors with " & intRoyalty & " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print "    " & rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


AppendChunk 與 GetChunk 方法範例

此範例使用 AppendChunk 與 GetChunk 方法，運用其它記錄的資料，填滿影像區域。

Public Sub AppendChunkX()

    Dim cnn1 As ADODB.Connection
    Dim rstPubInfo As ADODB.Recordset
    Dim strCnn As String
    Dim strPubID As String
    Dim strPRInfo As String
    Dim lngOffset As Long
    Dim lngLogoSize As Long
    Dim varLogo As Variant
    Dim varChunk As Variant

    Const conChunkSize = 100

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open the pub_info table.
    Set rstPubInfo = New ADODB.Recordset
    rstPubInfo.CursorType = adOpenKeyset
    rstPubInfo.LockType = adLockOptimistic
    rstPubInfo.Open "pub_info", cnn1, , , adCmdTable

    ' Prompt for a logo to copy.
    strMsg = "Available logos are : " & vbCr & vbCr
    Do While Not rstPubInfo.EOF
        strMsg = strMsg & rstPubInfo!pub_id & vbCr & _
            Left(rstPubInfo!pr_info, InStr(rstPubInfo!pr_info, ",") - 1) & _
            vbCr & vbCr
        rstPubInfo.MoveNext
    Loop
    strMsg = strMsg & "Enter the ID of a logo to copy:"
    strPubID = InputBox(strMsg)

    ' Copy the logo to a variable in chunks.
    rstPubInfo.Filter = "pub_id = '" & strPubID & "'"
    lngLogoSize = rstPubInfo!logo.ActualSize
    Do While lngOffset < lngLogoSize
        varChunk = rstPubInfo!logo.GetChunk(conChunkSize)
        varLogo = varLogo & varChunk
        lngOffset = lngOffset + conChunkSize
    Loop

    ' Get data from the user.
    strPubID = Trim(InputBox("Enter a new pub ID:"))
    strPRInfo = Trim(InputBox("Enter descriptive text:"))

    ' Add a new record, copying the logo in chunks.
    rstPubInfo.AddNew
    rstPubInfo!pub_id = strPubID
    rstPubInfo!pr_info = strPRInfo

    lngOffset = 0 ' Reset offset.
    Do While lngOffset < lngLogoSize
        varChunk = LeftB(RightB(varLogo, lngLogoSize - lngOffset), _
            conChunkSize)
        rstPubInfo!logo.AppendChunk varChunk
        lngOffset = lngOffset + conChunkSize
    Loop
    rstPubInfo.Update

     ' Show the newly added data.
    MsgBox "New record: " & rstPubInfo!pub_id & vbCr & _
        "Description: " & rstPubInfo!pr_info & vbCr & _
        "Logo size: " & rstPubInfo!logo.ActualSize

    ' Delete new record because this is a demonstration.
    rstPubInfo.Requery
    cnn1.Execute "DELETE FROM pub_info " & _
        "WHERE pub_id = '" & strPubID & "'"

    rstPubInfo.Close
    cnn1.Close

End Sub


BeginTrans、CommitTrans 與 RollbackTrans 方法範例

此範例變更資料庫 Titles table 中所有心理學書籍的書籍類別。在 BeginTrans 方法後，會開始進行隔離所有對 Titles table 變更的交易，而 CommitTrans 方法會儲存這些變更。您可以使用 Rollback 方法來復原您使用 Update 方法所儲存的變更。

Public Sub BeginTransX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim strTitle As String
    Dim strMessage As String

    ' Open connection.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Open Titles table.
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenDynamic
    rstTitles.LockType = adLockPessimistic
    rstTitles.Open "titles", cnn1, , , adCmdTable

    rstTitles.MoveFirst
    cnn1.BeginTrans

    ' Loop through recordset and ask user if she wants
    ' to change the type for a specified title.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
            "Change type to self help?"

            ' Change the title for the specified
            ' employee.
            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
                rstTitles.Update
            End If
        End If

            rstTitles.MoveNext
    Loop

    ' Ask if the user wants to commit to all the
    ' changes made above.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        cnn1.CommitTrans
    Else
        cnn1.RollbackTrans
    End If

    ' Print current data in recordset.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original data because this
    ' is a demonstration.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    rstTitles.Close
    cnn1.Close

End Sub


Cancel 方法範例

此範例使用 Cancel 方法，在連結忙碌時，取消在連結物件上所執行的指令。

Public Sub CancelX()

    Dim cnn1 As ADODB.Connection
    Dim strCnn As String
    Dim strCmdChange As String
    Dim strCmdRestore As String
    Dim booChanged As Boolean

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Define command strings.
    strCmdChange = "UPDATE titles SET type = 'self_help' " & _
        "WHERE type = 'psychology'"
    strCmdRestore = "UPDATE titles SET type = 'psychology' " & _
        "WHERE type = 'self_help'"

    ' Begin a transaction, then execute a command asynchronously.
    cnn1.BeginTrans
    cnn1.Execute strCmdChange, , adAsyncExecute

    ' do something else for a little while – this could be changed
        For i = 1 To 10
            i = i + i
            Debug.Print i
        Next i

    ' If the command has NOT completed, cancel the execute
    ' and roll back the transaction. Otherwise, commit the
    ' transaction.
    If CBool(cnn1.State And adStateExecuting) Then
        cnn1.Cancel
        cnn1.RollbackTrans
        booChanged = False
        MsgBox "Update canceled."
    Else
        cnn1.CommitTrans
        booChanged = True
        MsgBox "Update complete."
    End If

    ' If the change was made, restore the data
    ' because this is a demonstration.
    If booChanged Then
        cnn1.Execute strCmdRestore
        MsgBox "Data restored."
    End If

    cnn1.Close

End Sub


Cancel 方法範例 (VBScript)

下列範例顯示如何在 VBScript 程式碼中讀取執行階段的 Cancel 方法。

<Script Language="VBScript">
<!--
Sub cmdCancelAsync
ADC.Cancel
' Terminates currently running AsyncExecute,
' ReadyState property set to adcReadyStateLoaded,
' Recordset set to Nothing
End Sub
-->
</Script>


CancelUpdate 方法範例 (VBScript)

若要測試此範例，請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 ADCapi6.asp。ASP script 會辨識您的伺服器。

<Center><H2>RDS API Code Examples</H2>
<HR><H3>Remote Data Service SubmitChanges and CancelUpdate Methods</H3>

<!-- RDS.DataControl with parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
</OBJECT>

<Object classid="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="Remote Data Service Run Time">
</OBJECT>
<HR>
<INPUT TYPE=BUTTON NAME="SubmitChange" VALUE="Submit-Changes"><INPUT TYPE=BUTTON NAME="CancelChange" VALUE="Cancel-Update"><BR>
<H4>Add a new person or alter a current entry on the grid. Move off that Row. <BR>
Submit the Changes to your DBMS or cancel the updates. </H4>
</Center>
<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub SubmitChange_OnClick
    ADC.SubmitChanges
    ADC.Refresh
End Sub

Sub CancelUpdate_OnClick
    ADC.CancelUpdate
End Sub
-->
</Script>


Clone 方法範例 (Visual Basic)

此範例使用 Clone 方法來建立 Recordset 的複本，然後讓使用者獨立地放置每一複本的紀錄指標。

Public Sub CloneX()

    Dim arstStores(1 To 3) As ADODB.Recordset
    Dim intLoop As Integer
    Dim strSQL As String
    Dim strCnn As String
    Dim strMessage As String
    Dim strFind As String

    ' Assign SQL statement and connection string to variables.
    strSQL = "SELECT stor_name FROM Stores " & _
        "ORDER BY stor_name"
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

    ' Open recordset as a static cursor type recordset.
    Set arstStores(1) = New ADODB.Recordset
    arstStores(1).CursorType = adOpenStatic
    arstStores(1).LockType = adLockBatchOptimistic
    arstStores(1).Open strSQL, strCnn, , , adCmdText

    ' Create two clones of the original Recordset.
    Set arstStores(2) = arstStores(1).Clone
    Set arstStores(3) = arstStores(1).Clone

    Do While True

        ' Loop through the array so that on each pass,
        ' the user is searching a different copy of the
        ' same Recordset.
        For intLoop = 1 To 3

            ' Ask for search string while showing where
            ' the current record pointer is for each Recordset.
            strMessage = _
                "Recordsets from stores table:" & vbCr & _
                "  1 - Original - Record pointer at " & _
                arstStores(1)!stor_name & vbCr & _
                "  2 - Clone - Record pointer at " & _
                arstStores(2)!stor_name & vbCr & _
                "  3 - Clone - Record pointer at " & _
                arstStores(3)!stor_name & vbCr & _
                "Enter search string for #" & intLoop & ":"
            strFind = Trim(InputBox(strMessage))
            If strFind = "" Then Exit Do

            ' Find the search string; if there's no
            ' match, jump to the last record.
            arstStores(intLoop).Filter = "stor_name >= '" & strFind & "'"
            If arstStores(intLoop).EOF Then
                arstStores(intLoop).Filter = adFilterNone
                arstStores(intLoop).MoveLast
            End If

        Next intLoop

    Loop

    arstStores(1).Close
    arstStores(2).Close
    arstStores(3).Close

End Sub

VBScript 版本

下列是使用 VBScript 撰寫，用於 Active Server Page (ASP) 的相同範例。若要檢視此全功能性範例，您必須使用安裝 IIS 時的資料來源 AdvWorks.mdb (位於 C:\InetPub\ASPSamp\AdvWorks)，建立稱為 AdvWorks 的系統資料來源名稱 (Data Source Name，DSN)。這是一個 Microsoft Access 資料庫檔案。請使用 [尋找] 來尋找檔案 Adovbs.inc 並將其置於您計畫使用的目錄下。剪下及貼上下列程式碼至 [記事本] 或其它文字編輯器，並儲存為 Clone.asp。您可以在任何客戶端瀏覽器上檢視結果。

若要練習此範例，請將 RsCustomerList.Source = "Customers" 這行變更為 RsCustomerList.Source = "Products"，以便計算較大的資料表。

<!-- #Include file="ADOVBS.INC" -->
<% Language = VBScript %>
<HTML><HEAD>
<TITLE>ADO Clone Method</TITLE>
</HEAD><BODY> <Center>
<H3>ADO Clone Method</H3>
<!--- ADO Connection Object used to create recordset-->
<%
'Create and open Connection object
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "AdvWorks"
'Create and open Recordset object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConnection
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open
%>
<HR>
<!-- Loop through Customers Table, adding 1 to the Counter variable each pass -->
<%
    Set MyRecordset = RSCustomerList.Clone
    Counter = 0
    Do Until MyRecordset.EOF
        Counter = Counter + 1
        MyRecordset.MoveNext
    Loop
%>
<!-- Display Results -->
<H3>There Are <%=Counter %> Records in the Customers Table</H3>
<BR><HR>
<H4>Location of DSN Datbase</H4>
<%' Show location of DSN data source
Response.Write(OBJdbConnection)
%>
<HR></Center></BODY></HTML>


ConvertToString 方法範例 (VBScript)

Sub QueryRecordset_OnClick()
    Dim objADORs
        strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
        Set ADF = ADS1.CreateObject _
        ("RDSServer.DataFactory", strServer)
    Set objADORs = ADF.Query _
    (txtConnect.Value,txtQueryRecordset.Value)

ADF.ConvertToString(objADORs)

End Sub


CreateRecordset 方法範例 (VBScript)

此程式碼範例會在伺服器端建立 ADODB.Recordset。其會有兩欄，每欄各有四列。

Sub CreateARecordSet
    Dim ColInfo(1), c0(3), c1(3)

    c0(0) = "Name"            ' Column name.
    c0(1) = CInt(129)        ' Column type (129 = adChar).
    c0(2) = CInt(40)        ' Column size.
    c0(3) = False            ' Is the column nullable?

    c1(0) = "Age"            ' Column name.
    c1(1) = CInt(3)        ' Column type (3 = adInteger).
    c1(2) = CInt(-1)        ' Column size.
    c1(3) = True            ' Is the column nullable?

    ' Add the columns to the recordset definition.
    ColInfo(0) = c0
    ColInfo(1) = c1

    ADC1.SourceRecordset = ADF1.CreateRecordset(ColInfo)
End Sub


Delete 方法範例

此範例使用 Delete 方法從 Recordset 移除指定的紀錄。

Public Sub DeleteX()

    Dim rstRoySched As ADODB.Recordset
    Dim strCnn As String
    Dim strMsg As String
    Dim strTitleID As String
    Dim intLoRange As Integer
    Dim intHiRange As Integer
    Dim intRoyalty As Integer

    ' Open RoySched table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstRoySched = New ADODB.Recordset
    rstRoySched.CursorLocation = adUseClient
    rstRoySched.CursorType = adOpenStatic
    rstRoySched.LockType = adLockBatchOptimistic
    rstRoySched.Open "SELECT * FROM roysched " & _
        "WHERE royalty = 20", strCnn, , , adCmdText

    ' Prompt for a record to delete.
    strMsg = "Before delete there are " & _
        rstRoySched.RecordCount & _
        " titles with 20 percent royalty:" & vbCr & vbCr
    Do While Not rstRoySched.EOF
        strMsg = strMsg & rstRoySched!title_id & vbCr
        rstRoySched.MoveNext
    Loop
    strMsg = strMsg & vbCr & vbCr & _
        "Enter the ID of a record to delete:"
    strTitleID = UCase(InputBox(strMsg))

    ' Move to the record and save data so it can be restored.
    rstRoySched.Filter = "title_id = '" & strTitleID & "'"
    intLoRange = rstRoySched!lorange
    intHiRange = rstRoySched!hirange
    intRoyalty = rstRoySched!royalty

    ' Delete the record.
    rstRoySched.Delete
    rstRoySched.UpdateBatch

    ' Show the results.
    rstRoySched.Filter = adFilterNone
    rstRoySched.Requery
    strMsg = ""
    strMsg = "After delete there are " & _
        rstRoySched.RecordCount & _
        " titles with 20 percent royalty:" & vbCr & vbCr
    Do While Not rstRoySched.EOF
        strMsg = strMsg & rstRoySched!title_id & vbCr
        rstRoySched.MoveNext
    Loop
    MsgBox strMsg

    ' Restore the data because this is a demonstration.
    rstRoySched.AddNew
    rstRoySched!title_id = strTitleID
    rstRoySched!lorange = intLoRange
    rstRoySched!hirange = intHiRange
    rstRoySched!royalty = intRoyalty
    rstRoySched.UpdateBatch

    rstRoySched.Close

End Sub

VBScript 版本

下列是使用 VBScript 撰寫，用於 Active Server Page (ASP) 的相同範例。若要檢視此全功能性範例，您必須使用安裝 IIS 時的資料來源 AdvWorks.mdb (位於 C:\InetPub\ASPSamp\AdvWorks)，建立稱為 AdvWorks 的系統資料來源名稱 (Data Source Name，DSN)。這是一個 Microsoft Access 資料庫檔案。請使用 [尋找] 來尋找檔案 Adovbs.inc 並將其置於您計畫使用的目錄下。剪下及貼上下列程式碼至 [記事本] 或其它文字編輯器，並儲存為 Delete.asp。您可以在任何客戶端瀏覽器上檢視結果。

若要練習此範例，請先使用 AddNew 範例，新增一些記錄。然後嘗試將其刪除。您可以在任何客戶端瀏覽器上檢視結果。

<!-- #Include file="ADOVBS.INC" -->
<% Language = VBScript %>

<HTML>

<HEAD><TITLE>ADO Delete Method</TITLE>
</HEAD><BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center><H3>ADO Delete Method</H3>

<!--- ADO Connection Object used to create recordset-->
<%
'Create and Open Connection Object
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "AdvWorks"
'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConnection
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open
%>
<!-- Move to designated record and delete it -->
<%

If Not IsEmpty(Request.Form("WhichRecord")) Then
    'Get value to move from Form Post method
    Moves = Request.Form("WhichRecord")

    RsCustomerList.Move CInt(Moves)
    If Not RsCustomerList.EOF or RsCustomerList.BOF Then
        RsCustomerList.Delete 1
        RsCustomerList.MoveFirst

    Else
        Response.Write "Not a Valid Record Number"
        RsCustomerList.MoveFirst
    End If
End If

%>
<!-- BEGIN column header row for Customer Table-->

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0><TR>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Company Name</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Contact Name</FONT>
</TD>
<TD ALIGN=CENTER WIDTH=150 BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Phone Number</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>City</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>State/Province</FONT>
</TD></TR>

<!--Display ADO Data from Customer Table Loop through Recordset adding
One Row to HTML Table each pass-->
<% Do While Not RsCustomerList.EOF %>
  <TR><TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RSCustomerList("CompanyName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("PhoneNumber")%>
 </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("City")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("StateOrProvince")%>
  </FONT></TD>
  </TR>
<!-Next Row = Record Loop and add to html table-->
<%
RScustomerList.MoveNext
Loop
%>
</Table></Center></FONT>
<!-- Do Client side Input Data Validation Move to named record and Delete it -->

<Center>
<H4>Clicking Button Will Remove Designated Record</H4>
<H5>There are <%=RsCustomerList.RecordCount - 1%> Records in this Set</H5>
<Form Method = Post Action = "Delete.asp" Name = Form>
<Input Type = Text Name = "WhichRecord" Size = 3></Form>
<Input Type = Button Name = cmdDelete Value = "Delete Record"></Center>

</BODY>

<Script Language = "VBScript">

Sub cmdDelete_OnClick
If IsNumeric(Document.Form.WhichRecord.Value) Then
    Document.Form.WhichRecord.Value = CInt(Document.Form.WhichRecord.Value)
Dim Response
    Response = MsgBox("Are You Sure About Deleting This Record?", vbYesNo,  "ADO-ASP

Example")

    If Response = vbYes Then

    Document.Form.Submit

    End If
Else
    MsgBox "You Must Enter a Valid Record Number",,"ADO-ASP Example"
End If
End Sub

</Script>
</HTML>


Execute、Requery 與 Clear 方法範例

此範例示範從 Command 物件與 Connection 物件兩者執行階段的 Execute 方法。也使用 Requery 方法擷取 recordset 中目前的資料，並使用 Clear 方法清除 Errors 集合物件的內容。執行此程序需要有 ExecuteCommand 與 PrintOutput 程序。

Public Sub ExecuteX()

    Dim strSQLChange As String
    Dim strSQLRestore As String
    Dim strCnn As String
    Dim cnn1 As ADODB.Connection
    Dim cmdChange As ADODB.Command
    Dim rstTitles As ADODB.Recordset
    Dim errLoop As ADODB.Error

    ' Define two SQL statements to execute as command text.
    strSQLChange = "UPDATE Titles SET Type = " & _
        "'self_help' WHERE Type = 'psychology'"
    strSQLRestore = "UPDATE Titles SET Type = " & _
        "'psychology' WHERE Type = 'self_help'"

    ' Open connection.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Create command object.
    Set cmdChange = New ADODB.Command
    Set cmdChange.ActiveConnection = cnn1
    cmdChange.CommandText = strSQLChange

    ' Open titles table.
    Set rstTitles = New ADODB.Recordset
    rstTitles.Open "titles", cnn1, , , adCmdTable

    ' Print report of original data.
    Debug.Print _
        "Data in Titles table before executing the query"
    PrintOutput rstTitles

    ' Clear extraneous errors from the Errors collection.
    cnn1.Errors.Clear

    ' Call the ExecuteCommand subroutine to execute cmdChange command.
    ExecuteCommand cmdChange, rstTitles

    ' Print report of new data.
    Debug.Print _
        "Data in Titles table after executing the query"
    PrintOutput rstTitles

    ' Use the Connection object's execute method to
    ' execute SQL statement to restore data. Trap for
    ' errors, checking the Errors collection if necessary.
    On Error GoTo Err_Execute
    cnn1.Execute strSQLRestore, , adExecuteNoRecords
    On Error GoTo 0

    ' Retrieve the current data by requerying the recordset.
    rstTitles.Requery

    ' Print report of restored data.
    Debug.Print "Data after executing the query " & _
        "to restore the original information"
    PrintOutput rstTitles

    rstTitles.Close
    cnn1.Close

    Exit Sub

Err_Execute:

    ' Notify user of any errors that result from
    ' executing the query.
    If Errors.Count > 0 Then
        For Each errLoop In Errors
            MsgBox "Error number: " & errLoop.Number & vbCr & _
                errLoop.Description
        Next errLoop
    End If

    Resume Next

End Sub

Public Sub ExecuteCommand(cmdTemp As ADODB.Command, _
    rstTemp As ADODB.Recordset)

    Dim errLoop As Error

    ' Run the specified Command object. Trap for
    ' errors, checking the Errors collection if necessary.
    On Error GoTo Err_Execute
    cmdTemp.Execute
    On Error GoTo 0

    ' Retrieve the current data by requerying the recordset.
    rstTemp.Requery

    Exit Sub

Err_Execute:

    ' Notify user of any errors that result from
    ' executing the query.
    If Errors.Count > 0 Then
        For Each errLoop In Errors
            MsgBox "Error number: " & errLoop.Number & vbCr & _
                errLoop.Description
        Next errLoop
    End If

    Resume Next

End Sub

Public Sub PrintOutput(rstTemp As ADODB.Recordset)

    ' Enumerate Recordset.
    Do While Not rstTemp.EOF
        Debug.Print "  " & rstTemp!Title & _
            ", " & rstTemp!Type
        rstTemp.MoveNext
    Loop

End Sub

VBScript 版本

下列是使用 VBScript 撰寫，用於 Active Server Page (ASP) 的相同範例。若要檢視此全功能性範例，您必須使用安裝 IIS 時的資料來源 AdvWorks.mdb (位於 C:\InetPub\ASPSamp\AdvWorks)，建立稱為 AdvWorks 的系統資料來源名稱 (Data Source Name，DSN)。這是一個 Microsoft Access 資料庫檔案。請使用 [尋找] 來尋找檔案 Adovbs.inc 並將其置於您計畫使用的目錄下。剪下及貼上下列程式碼至 [記事本] 或其它文字編輯器，並儲存為 Execute.asp 。您可以在任何客戶端瀏覽器上檢視結果。

<!-- #Include file="ADOVBS.INC" -->
<HTML><HEAD>
<TITLE>ADO Execute Method</TITLE></HEAD>

<BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center><H3>ADO Execute Method</H3><H4>Recordset Retrieved Using Connection Object</H4>
<TABLE WIDTH=600 BORDER=0>
<TD VALIGN=TOP ALIGN=LEFT COLSPAN=3><FONT SIZE=2>

<!--- Recordsets retrieved using Execute method of Connection and Command Objects-->
<%
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "AdvWorks"
SQLQuery = "SELECT * FROM Customers"
'First Recordset RSCustomerList
Set RSCustomerList = OBJdbConnection.Execute(SQLQuery)

Set OBJdbCommand = Server.CreateObject("ADODB.Command")
OBJdbCommand.ActiveConnection = OBJdbConnection
SQLQuery2 = "SELECT * From Products"
OBJdbCommand.CommandText = SQLQuery2
Set RsProductList = OBJdbCommand.Execute

%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Customer Table-->

<TR><TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Company Name</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Contact Name</FONT>
</TD>
<TD ALIGN=CENTER WIDTH=150 BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>E-mail address</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>City</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>State/Province</FONT>
</TD></TR>

<!--Display ADO Data from Customer Table-->
<% Do While Not RScustomerList.EOF %>
  <TR>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RSCustomerList("CompanyName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>

  <%= RScustomerList("ContactLastName")%>
 </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("City")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("StateOrProvince")%>
  </FONT></TD>
  </TR>
<!-Next Row = Record Loop and add to html table-->
<%
RScustomerList.MoveNext
Loop
RScustomerList.Close

%>

</TABLE><HR>
<H4>Recordset Retrieved Using Command Object</H4>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Product List Table-->

<TR><TD ALIGN=CENTER BGCOLOR="#800000">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Product Type</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#800000">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Product Name</FONT>
</TD>
<TD ALIGN=CENTER WIDTH=350 BGCOLOR="#800000">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Product Description</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#800000">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Unit Price</FONT>
</TD></TR>

<!-- Display ADO Data Product List-->
<% Do While Not RsProductList.EOF %>
  <TR>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RsProductList("ProductType")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RsProductList("ProductName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
   <%= RsProductList("ProductDescription")%>
 </FONT></TD>

  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RsProductList("UnitPrice")%>
  </FONT></TD>

<!--  Next Row = Record -->
<%
RsProductList.MoveNext
Loop
'Remove objects from memory to free resources
RsProductList.Close
OBJdbConnection.Close
Set ObJdbCommand = Nothing
Set RsProductList = Nothing
Set OBJdbConnection = Nothing
%>
</TABLE></FONT></Center></BODY></HTML>


GetRows 方法範例

此範例使用 GetRows 方法從 Recordset 擷取特定數目的列，並用結果資料填滿陣列。有兩種狀況會使得 GetRows 方法傳回比想要的列數要少：已經到達 EOF、或 GetRows 嘗試擷取其它使用者刪除的紀錄。只有在第二種情況發生時函數會傳回 False。執行此程序需要用到 GetRowsOK 函數。

Public Sub GetRowsX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intRows As Integer
    Dim avarRecords As Variant
    Dim intRecord As Integer

    ' Open recordset with names and hire dates from employee table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "SELECT fName, lName, hire_date " & _
        "FROM Employee ORDER BY lName", strCnn, , , adCmdText

    Do While True
        ' Get user input for number of rows.
        strMessage = "Enter number of rows to retrieve."
        intRows = Val(InputBox(strMessage))

        If intRows <= 0 Then Exit Do

        ' If GetRowsOK is successful, print the results,
        ' noting if the end of the file was reached.
        If GetRowsOK(rstEmployees, intRows, _
                avarRecords) Then
            If intRows > UBound(avarRecords, 2) + 1 Then
                Debug.Print "(Not enough records in " & _
                    "Recordset to retrieve " & intRows & _
                    " rows.)"
            End If
            Debug.Print UBound(avarRecords, 2) + 1 & _
                " records found."

            ' Print the retrieved data.
            For intRecord = 0 To UBound(avarRecords, 2)
                Debug.Print "  " & _
                    avarRecords(0, intRecord) & " " & _
                    avarRecords(1, intRecord) & ", " & _
                    avarRecords(2, intRecord)
            Next intRecord
        Else
            ' Assuming the GetRows error was due to data
            ' changes by another user, use Requery to
            ' refresh the Recordset and start over.
            If MsgBox("GetRows failed--retry?", _
                    vbYesNo) = vbYes Then
                rstEmployees.Requery
            Else
                Debug.Print "GetRows failed!"
                Exit Do
            End If
        End If

        ' Because using GetRows leaves the current
        ' record pointer at the last record accessed,
        ' move the pointer back to the beginning of the
        ' Recordset before looping back for another search.
        rstEmployees.MoveFirst
    Loop

    rstEmployees.Close

End Sub

Public Function GetRowsOK(rstTemp As ADODB.Recordset, _
    intNumber As Integer, avarData As Variant) As Boolean

    ' Store results of GetRows method in array.
    avarData = rstTemp.GetRows(intNumber)
    ' Return False only if fewer than the desired
    ' number of rows were returned, but not because the
    ' end of the Recordset was reached.
    If intNumber > UBound(avarData, 2) + 1 And _
            Not rstTemp.EOF Then
        GetRowsOK = False
    Else
        GetRowsOK = True
    End If

End Function


Move 方法範例

此範例使用 Move 方法，依據使用者輸入，放置紀錄指標。

Public Sub MoveX()

    Dim rstAuthors As ADODB.Recordset
    Dim strCnn As String
    Dim varBookmark As Variant
    Dim strCommand As String
    Dim lngMove As Long

    ' Open recordset from Authors table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorType = adOpenStatic
    ' Use client cursor to allow use of
    ' AbsolutePosition property.
    rstAuthors.CursorLocation = adUseClient
    rstAuthors.Open "SELECT au_id, au_fname, au_lname, city, state " & _
        "FROM Authors ORDER BY au_lname", strCnn, , , adCmdText

    rstAuthors.MoveFirst

    Do While True
        ' Display information about current record and
        ' ask how many records to move.

        strCommand = InputBox( _
            "Record " & rstAuthors.AbsolutePosition & _
            " of " & rstAuthors.RecordCount & vbCr & _
            "Author: " & rstAuthors!au_fname & _
            " " & rstAuthors!au_lname & vbCr & _
            "Location: " & rstAuthors!City & _
            ", " & rstAuthors!State & vbCr & vbCr & _
            "Enter number of records to Move " & _
            "(positive or negative).")

        If strCommand = "" Then Exit Do

        ' Store bookmark in case the Move goes too far
        ' forward or backward.
        varBookmark = rstAuthors.Bookmark

        ' Move method requires parameter of data type Long.
        lngMove = CLng(strCommand)
        rstAuthors.Move lngMove

        ' Trap for BOF or EOF.
        If rstAuthors.BOF Then
            MsgBox "Too far backward! " & _
                "Returning to current record."
            rstAuthors.Bookmark = varBookmark
        End If
        If rstAuthors.EOF Then
            MsgBox "Too far forward! " & _
                "Returning to current record."
            rstAuthors.Bookmark = varBookmark
        End If
    Loop
    rstAuthors.Close

End Sub

VBScript 版本

下列是使用 VBScript 撰寫，用於 Active Server Page (ASP) 的相同範例。若要檢視此全功能性範例，您必須使用安裝 IIS 時的資料來源 AdvWorks.mdb (位於 C:\InetPub\ASPSamp\AdvWorks)，建立稱為 AdvWorks 的系統資料來源名稱 (Data Source Name，DSN)。這是一個 Microsoft Access 資料庫檔案。請使用 [尋找] 來尋找檔案 Adovbs.inc 並將其置於您計畫使用的目錄下。剪下及貼上下列程式碼至 [記事本] 或其它文字編輯器，並儲存為 Move.asp。您可以在任何客戶端瀏覽器上檢視結果。

嘗試輸入字母或非數字的符號，看看錯誤處理的運作。

<!-- #Include file="ADOVBS.INC" -->
<% Language = VBScript %>
<HTML><HEAD>
<TITLE>ADO Move Methods</TITLE></HEAD>
<BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center>
<H3>ADO Move Methods</H3>

<%
 'Create and Open Connection Object
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "AdvWorks"
'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConnection
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"

RsCustomerList.Open

'Check number of user moves this session.
'Increment by amount in Form.
Session("Clicks") = Session("Clicks") + Request.Form("MoveAmount")
Clicks = Session("Clicks")
' Move to last known recordset position plus amount passed
' by Form Post method.
RsCustomerList.Move CInt(Clicks)

'Error Handling
    If RsCustomerList.EOF Then
            Session("Clicks") = RsCustomerList.RecordCount
            Response.Write "This is the Last Record"
            RsCustomerList.MoveLast
        Else If RsCustomerList.BOF Then
            Session("Clicks") = 1
            RsCustomerList.MoveFirst
            Response.Write "This is the First Record"
        End If
    End If

%>

<H3>Current Record Number is <BR>
<% If Session("Clicks") = 0 Then
Session("Clicks") = 1
End If
Response.Write(Session("Clicks") )%> of <%=RsCustomerList.RecordCount%></H3>
<HR>

<Center><TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Customer Table-->

<TR>

<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Company Name</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Contact Name</FONT>
</TD>
<TD ALIGN=CENTER WIDTH=150 BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Phone Number</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>City</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>State/Province</FONT>
</TD>

</TR>

<!--Display ADO Data from Customer Table-->

  <TR>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RSCustomerList("CompanyName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>

  <%= RScustomerList("PhoneNumber")%>
 </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("City")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("StateOrProvince")%>
  </FONT></TD>
  </TR> </Table></FONT>

<HR>
<Input Type = Button Name = cmdDown  Value = "<  ">
<Input Type = Button Name = cmdUp Value = " >">
<H5>Click Direction Arrows for Previous or Next Record
<BR> Click Move Amount to use Move Method
Enter Number of Records to Move + or - </H5>

<Table>

<Form Method = Post Action="Move.asp" Name=Form>

<TR><TD><Input Type="Button" Name = Move Value="Move Amount "></TD><TD></TD><TD>
<Input Type="Text" Size="4" Name="MoveAmount" Value = 0></TD><TR>
</Form></Table></Center>

</BODY>

<Script Language = "VBScript">

Sub Move_OnClick
'  Make sure move value entered is an integer.
If IsNumeric(Document.Form.MoveAmount.Value)Then
    Document.Form.MoveAmount.Value = CInt(Document.Form.MoveAmount.Value)
    Document.Form.Submit
Else
    MsgBox "You Must Enter a Number", ,"ADO-ASP Example"
    Document.Form.MoveAmount.Value = 0
End If

End Sub

Sub cmdDown_OnClick

Document.Form.MoveAmount.Value = -1
Document.Form.Submit

End Sub

Sub cmdUp_OnClick

Document.Form.MoveAmount.Value = 1
Document.Form.Submit

End Sub

</Script>
</HTML>


MoveFirst、MoveLast、MoveNext 與 MovePrevious 方法範例

此範例使用 MoveFirst、MoveLast、MoveNext 與 MovePrevious 方法，依據提供的指令，移動 Recordset 的記錄指標。執行此程序需要 MoveAny 程序。

Public Sub MoveFirstX()

    Dim rstAuthors As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intCommand As Integer

    ' Open recordset from Authors table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorType = adOpenStatic
    ' Use client cursor to enable AbsolutePosition property.
    rstAuthors.CursorLocation = adUseClient
    rstAuthors.Open "authors", strCnn, , , adCmdTable

    ' Show current record information and get user's method choice.
    Do While True

        strMessage = "Name: " & rstAuthors!au_fName & " " & _
            rstAuthors!au_lName & vbCr & "Record " & _
            rstAuthors.AbsolutePosition & " of " & _
            rstAuthors.RecordCount & vbCr & vbCr & _
            "[1 - MoveFirst, 2 - MoveLast, " & vbCr & _
            "3 - MoveNext, 4 - MovePrevious]"
        intCommand = Val(Left(InputBox(strMessage), 1))
        If intCommand < 1 Or intCommand > 4 Then Exit Do

        ' Call method based on user's input.
        MoveAny intCommand, rstAuthors
    Loop
    rstAuthors.Close

End Sub

Public Sub MoveAny(intChoice As Integer, _
    rstTemp As Recordset)

    ' Use specified method, trapping for BOF and EOF.
    Select Case intChoice
        Case 1
            rstTemp.MoveFirst
        Case 2
            rstTemp.MoveLast
        Case 3
            rstTemp.MoveNext
            If rstTemp.EOF Then
                MsgBox "Already at end of recordset!"
                rstTemp.MoveLast
            End If
        Case 4
            rstTemp.MovePrevious
            If rstTemp.BOF Then
                MsgBox "Already at beginning of recordset!"
                rstTemp.MoveFirst
            End If
    End Select

End Sub

VBScript 版本

下列是使用 VBScript 撰寫，用於 Active Server Page (ASP) 的相同範例。若要檢視此全功能性範例，您必須使用安裝 IIS 時的資料來源 AdvWorks.mdb (位於 C:\InetPub\ASPSamp\AdvWorks)，建立稱為 AdvWorks 的系統資料來源名稱 (Data Source Name，DSN)。這是一個 Microsoft Access 資料庫檔案。請使用 [尋找] 來尋找檔案 Adovbs.inc 並將其置於您計畫使用的目錄下。剪下及貼上下列程式碼至 [記事本] 或其它文字編輯器，並儲存為 MoveOne.asp。您可以在任何客戶端瀏覽器上檢視結果。

嘗試移動超過 recordset 的上限或下限，看看錯誤處理的運作。

<!-- #Include file="ADOVBS.INC" -->
<% Language = VBScript %>
<HTML><HEAD>
<TITLE>ADO MoveNext MovePrevious MoveLast MoveFirst Methods</TITLE></HEAD>
<BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center>
<H3>ADO Methods<BR>MoveNext MovePrevious MoveLast MoveFirst</H3>
<!-- Create Connection and Recordset Objects on Server -->
<%
 'Create and Open Connection Object
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "AdvWorks"
'Create and Open Recordset Object
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConnection
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"

RsCustomerList.Open

' Check Request.Form collection to see if any moves are recorded

If Not IsEmpty(Request.Form("MoveAmount")) Then
'Keep track of the number and direction of moves this session

    Session("Moves") = Session("Moves") + Request.Form("MoveAmount")

    Clicks = Session("Moves")
' Move to last known position
    RsCustomerList.Move CInt(Clicks)
' Check if move is + or - and do error checking
        If CInt(Request.Form("MoveAmount")) = 1 Then

            If RsCustomerList.EOF Then
                Session("Moves") = RsCustomerList.RecordCount
                RsCustomerList.MoveLast
            End If

            RsCustomerList.MoveNext
        End If

        If Request.Form("MoveAmount") < 1 Then

            RsCustomerList.MovePrevious
        End If
' Check if First Record or Last Record Command Buttons Clicked
        If Request.Form("MoveLast") = 3 Then
            RsCustomerList.MoveLast
            Session("Moves") = RsCustomerList.RecordCount
        End If
        If Request.Form("MoveFirst") = 2 Then
            RsCustomerList.MoveFirst
            Session("Moves") = 1
        End If

End If
' Do Error checking for combination of Move Button clicks
        If RsCustomerList.EOF Then
            Session("Moves") = RsCustomerList.RecordCount
            RsCustomerList.MoveLast
            Response.Write "This is the Last Record"
            End If

        If RsCustomerList.BOF Then
            Session("Moves") = 1
            RsCustomerList.MoveFirst
            Response.Write "This is the First Record"
        End If

%>

<H3>Current Record Number is <BR>
<!-- Display Current Record Number and Recordset Size -->
<% If IsEmpty(Session("Moves"))  Then
Session("Moves") = 1
End If
%>

<%Response.Write(Session("Moves") )%> of <%=RsCustomerList.RecordCount%></H3>
<HR>

<Center><TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Customer Table-->

<TR><TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Company Name</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Contact Name</FONT>
</TD>
<TD ALIGN=CENTER WIDTH=150 BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Phone Number</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>City</FONT>
</TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>State/Province</FONT>
</TD></TR>

<!--Display ADO Data from Customer Table-->

  <TR>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RSCustomerList("CompanyName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>

  <%= RScustomerList("PhoneNumber")%>
 </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("City")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("StateOrProvince")%>
  </FONT></TD>
  </TR> </Table></FONT>

<HR>
<Input Type = Button Name = cmdDown  Value = "<  ">
<Input Type = Button Name = cmdUp Value = "  >">
<BR>
<Input Type = Button Name = cmdFirst Value = "First Record">

<Input Type = Button Name = cmdLast Value = "Last Record">
<H5>Click Direction Arrows to Use MovePrevious or MoveNext
<BR> </H5>

<!-- Use Hidden Form Fields to send values to Server -->

<Form Method = Post Action="MoveOne.asp" Name=Form>
<Input Type="Hidden" Size="4" Name="MoveAmount" Value = 0>
<Input Type="Hidden" Size="4" Name="MoveLast" Value = 0>
<Input Type="Hidden" Size="4" Name="MoveFirst" Value = 0>
</Form></BODY>

<Script Language = "VBScript">

Sub cmdDown_OnClick
'Set Values in Form Input Boxes and Submit Form
    Document.Form.MoveAmount.Value = -1
    Document.Form.Submit
End Sub

Sub cmdUp_OnClick

    Document.Form.MoveAmount.Value = 1
    Document.Form.Submit

End Sub

Sub cmdFirst_OnClick

    Document.Form.MoveFirst.Value = 2
    Document.Form.Submit

End Sub

Sub cmdLast_OnClick

    Document.Form.MoveLast.Value = 3
    Document.Form.Submit

End Sub
</Script></HTML>


NextRecordset 方法範例

此範例使用 NextRecordset 方法，檢視使用三個獨立 SELECT 敘述所構成複合指令敘述的 recordset 的資料。

Public Sub NextRecordsetX()

    Dim rstCompound As ADODB.Recordset
    Dim strCnn As String
    Dim intCount As Integer

    ' Open compound recordset.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

    Set rstCompound = New ADODB.Recordset
    rstCompound.Open "SELECT * FROM authors; " & _
        "SELECT * FROM stores; " & _
        "SELECT * FROM jobs", strCnn, , , adCmdText

    ' Display results from each SELECT statement.
    intCount = 1
    Do Until rstCompound Is Nothing
        Debug.Print "Contents of recordset #" & intCount
        Do While Not rstCompound.EOF
            Debug.Print , rstCompound.Fields(0), _
                rstCompound.Fields(1)
            rstCompound.MoveNext
        Loop

        Set rstCompound = rstCompound.NextRecordset
        intCount = intCount + 1
    Loop

End Sub


Open 與 Close 方法範例

此範例使用 Open 與 Close 方法於已經開啟的 Recordset 與 Connection 物件。

Public Sub OpenX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim varDate As Variant

    ' Open connection.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Open employee table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Assign the first employee record's hire date
    ' to a variable, then change the hire date.
    varDate = rstEmployees!hire_date
    Debug.Print "Original data"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date
    rstEmployees!hire_date = #1/1/1900#
    rstEmployees.Update
    Debug.Print "Changed data"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date

    ' Requery Recordset and reset the hire date.
    rstEmployees.Requery
    rstEmployees!hire_date = varDate
    rstEmployees.Update
    Debug.Print "Data after reset"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date

    rstEmployees.Close
    cnn1.Close

End Sub

VBScript 版本

下列是使用 VBScript 撰寫，用於 Active Server Page (ASP) 的相同範例。若要檢視此全功能性範例，您必須使用安裝 IIS 時的資料來源 AdvWorks.mdb (位於 C:\InetPub\ASPSamp\AdvWorks)，建立稱為 AdvWorks 的系統資料來源名稱 (Data Source Name，DSN)。這是一個 Microsoft Access 資料庫檔案。請使用 [尋找] 來尋找檔案 Adovbs.inc 並將其置於您計畫使用的目錄下。剪下及貼上下列程式碼至 [記事本] 或其它文字編輯器，並儲存為 ADOOpen.asp。您可以在任何客戶端瀏覽器上檢視結果。

<!-- #Include file="ADOVBS.INC" -->
<HTML><HEAD>
<TITLE>ADO Open Method</TITLE>
</HEAD><BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center><H3>ADO Open Method</H3>
<TABLE WIDTH=600 BORDER=0>
<TD VALIGN=TOP ALIGN=LEFT COLSPAN=3><FONT SIZE=2>
<!--- ADO Connection used to create 2 recordsets-->
<%
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "AdvWorks"
SQLQuery = "SELECT * FROM Customers"
'First Recordset RSCustomerList
Set RSCustomerList = OBJdbConnection.Execute(SQLQuery)
'Second Recordset RsProductist
Set RsProductList = Server.CreateObject("ADODB.Recordset")
RsProductList.CursorType = adOpenDynamic
RsProductList.LockType = adLockOptimistic
RsProductList.Open "Products", OBJdbConnection
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Customer Table-->

<TR><TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Company Name</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Contact Name</FONT></TD>
<TD ALIGN=CENTER WIDTH=150 BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>E-mail address</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>City</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>State/Province</FONT></TD></TR>

<!--Display ADO Data from Customer Table-->
<% Do While Not RScustomerList.EOF %>
  <TR><TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RSCustomerList("CompanyName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("ContactLastName")%>
 </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("City")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RScustomerList("StateOrProvince")%>
  </FONT></TD></TR>
<!-Next Row = Record Loop and add to html table-->
<%
RScustomerList.MoveNext
Loop
RScustomerList.Close
OBJdbConnection.Close
%>
</TABLE>
<HR>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN column header row for Product List Table-->

<TR><TD ALIGN=CENTER BGCOLOR="#800000">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Product Type</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Product Name</FONT></TD>
<TD ALIGN=CENTER WIDTH=350 BGCOLOR="#800000">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Product Description</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000">
<FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1>Unit Price</FONT></TD></TR>
<!-- Display ADO Data Product List-->
<% Do While Not RsProductList.EOF %>
  <TR>  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RsProductList("ProductType")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RsProductList("ProductName")%>
  </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
   <%= RsProductList("ProductDescription")%>
 </FONT></TD>
  <TD BGCOLOR="f7efde" ALIGN=CENTER>
  <FONT STYLE="ARIAL NARROW" SIZE=1>
  <%= RsProductList("UnitPrice")%>
  </FONT></TD>

<!--  Next Row = Record -->
<%
RsProductList.MoveNext
Loop
'Remove Objects from Memory Freeing
Set RsProductList = Nothing
Set OBJdbConnection = Nothing
%>
</TABLE></FONT></Center></BODY></HTML>


OpenSchema 方法範例

此範例使用 OpenSchema 方法，顯示於 Pubs 資料庫中每個資料表的名稱與類型。

Public Sub OpenSchemaX()

    Dim cnn1 As ADODB.Connection
    Dim rstSchema As ADODB.Recordset
    Dim strCnn As String

    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    Set rstSchema = cnn1.OpenSchema(adSchemaTables)

    Do Until rstSchema.EOF
        Debug.Print "Table name: " & _
            rstSchema!TABLE_NAME & vbCr & _
            "Table type: " & rstSchema!TABLE_TYPE & vbCr
        rstSchema.MoveNext
    Loop
    rstSchema.Close

    cnn1.Close

End Sub

此範例指定 OpenSchema 方法中 Criteria 引數的 TABLE_TYPE 查詢約束條件。只會傳回於 Pubs 資料庫中指定所 Views 的結構敘述資訊當作結果。然後範例會顯示每一資料表的名稱與類型。

Public Sub OpenSchemaX2()

    Dim cnn2 As ADODB.Connection
    Dim rstSchema As ADODB.Recordset
    Dim strCnn As String

    Set cnn2 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn2.Open strCnn

    Set rstSchema = cnn2.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "VIEW"))

        Do Until rstSchema.EOF
            Debug.Print "Table name: " & _
                rstSchema!TABLE_NAME & vbCr & _
                "Table type: " & rstSchema!TABLE_TYPE & vbCr
            rstSchema.MoveNext
        Loop
    rstSchema.Close

    cnn2.Close

End Sub


Refresh 方法範例 (Visual Basic)

此範例示範使用 Refresh 方法來重新整理預存程序 Command 物件的 Parameters 集合物件。

Public Sub RefreshX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Open connection.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open a command object for a stored procedure
    ' with one parameter.
    Set cmdByRoyalty = New ADODB.Command
    Set cmdByRoyalty.ActiveConnection = cnn1
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc
    cmdByRoyalty.Parameters.Refresh

    ' Get paramater value and execute the command,
    ' storing the results in a recordset.
    intRoyalty = Trim(InputBox("Enter royalty:"))
    cmdByRoyalty.Parameters(1) = intRoyalty
    Set rstByRoyalty = cmdByRoyalty.Execute()

    ' Open the Authors table to get author names for display.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "authors", cnn1, , , adCmdTable

    ' Print current data in the recordset, adding
    ' author names from Authors table.
    Debug.Print "Authors with " & intRoyalty & " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print "    " & rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & _
            rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


Refresh 方法範例 (VBScript)

下列範例顯示如何設定執行階段中，RDS.DataControl 的必須參數。使用 Refresh 方法擷取 Recordset 的方式是由 ExecuteOptions 與 FetchOptions 屬性的設定值決定。若要測試此範例，請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 ADCapi2.asp。ASP script 會辨識您的伺服器。

<HTML>
<HEAD>
<TITLE>Refresh / ExecuteOptions</TITLE>
</HEAD>
<BODY>
<Center><H2>RDS API Code Examples </H2>
<HR>
<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="Remote Data Service Run Time">
</OBJECT>

<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
    </OBJECT>
<HR>
<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
<Input Size=70 Name="txtConnect" Value = "dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;"><BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<BR>
Choose if you want the Recordset brought back Synchronously on the current calling thread or Asynchronously on another thread
<Input Type="Radio" Name="optExecuteOptions" Checked OnClick="SetExO('adcExecSync')">
<Input Type="Radio" Name="optExecuteOptions"  OnClick="SetExO('adcExecAsync')"><BR>
Fetch Up Front, Background Fetch with Blocking or Background Fetch without Blocking
<Input Type="Radio" Name="optFetchOptions"  OnClick="SetFO('adcFetchUpFront')">
<Input Type="Radio" Name="optFetchOptions" Checked OnClick="SetFO('adcFetchBackground')">
<Input Type="Radio" Name="optFetchOptions"  OnClick="SetFO('adcFetchAsync')">

<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Fill Grid with these values or change them to see data from another ODBC data source on your server</H4>
</Center>
<Script Language="VBScript">
<!--
Dim EO             'ExecuteOptions
Dim FO            'FetchOptions
EO = "adcExecSync"    'Default value
FO = "adcFetchBackground"    'Default value
Sub SetExO(NewEO)
    EO = NewEO
End Sub
Sub SetFO(NewFO)
    FO = NewFO
End Sub

' Set parameters of RDS.DataControl at Run Time
Sub Run_OnClick
    ADC.Server = txtServer.Value
    ADC.SQL = txtSQL.Value
    ADC.Connect = txtConnect.Value
If EO = "adcExecSync" Then        'Determine which ExecuteOption chosen
    ADC.ExecuteOptions = adcExecSync
        MsgBox "Recordset brought in on current calling thread Syncronously"
Else
    ADC.ExecuteOptions = adcExecAsync
            MsgBox "Recordset brought in on another thread Asyncronously"
End If

If FO = "adcFetchBackground" Then        'Determine                                         ‘which FetchOption chosen
    ADC.FetchOptions = adcFetchBackground
        MsgBox "Control goes back to user after first batch of records returned"
ElseIf FO = " adcFetchUpFront" Then
    ADC.FetchOptions = adcFetchUpFront
            MsgBox "All records returned before control goes back to user"
Else
    ADC.FetchOptions = adcFetchAsync
            MsgBox "Control goes back to user immediately"
End If

ADC.Refresh

End Sub
-->
</Script>
</BODY>
</HTML>


Resync 方法範例

此範例示範使用 Resync 方法來重新顯示靜態 recordset 中的資料。

Public Sub ResyncX()

    Dim strCnn As String
    Dim rstTitles As ADODB.Recordset

    ' Open connections.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

    ' Open recordset for titles table.
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenStatic
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "titles", strCnn, , , adCmdTable

    ' Change the type of the first title in the recordset.
    rstTitles!Type = "database"

    ' Display the results of the change.
    MsgBox "Before resync: " & vbCr & vbCr & _
        "Title - " & rstTitles!Title & vbCr & _
        "Type - " & rstTitles!Type

    ' Resync with database and redisplay results.
    rstTitles.Resync
    MsgBox "After resync: " & vbCr & vbCr & _
        "Title - " & rstTitles!Title & vbCr & _
        "Type - " & rstTitles!Type

    rstTitles.CancelBatch
    rstTitles.Close

End Sub


SubmitChanges 方法範例 (VBScript)

下列程式碼片段顯示如何使用 SubmitChanges 方法於 RDS.DataControl 物件。

若要測試此範例，請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 ADCapi6.asp。ASP script 會辨識您的伺服器。

<Center><H2>RDS API Code Examples </H2>
<HR>
<H3>Remote Data Service SubmitChanges and CancelUpdate Methods</H3>
<!-- RDS.DataControl with parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;"> </OBJECT>

<Object classid ="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="Remote Data Service Run Time">
</OBJECT>
<HR>
<INPUT TYPE=BUTTON NAME="SubmitChange" VALUE="Submit-Changes"><INPUT TYPE=BUTTON NAME="CancelChange" VALUE="Cancel-Update"><BR>
<H4>Add a new person or alter a current entry on the grid. Move off that Row. <BR>
Submit the Changes to your DBMS or cancel the updates. </H4>
</Center>
<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub SubmitChange_OnClick
    ADC.SubmitChanges
    ADC.Refresh
End Sub

Sub CancelUpdate_OnClick
    ADC.CancelUpdate
End Sub
-->
</Script>

下列程式碼片段顯示如何使用 SubmitChanges 方法於 RDSServer.DataFactory 物件。如果您在未使用 RDS.DataControl 的 Visual Basic 專案上作業，可能想要送出變更到 DRSServer.DataFactory。若要建立此專案，請開啟 Visual Basic 表單並在其上放置一個 [清單方塊](List1)，兩個 [文字方塊](txtConnect 與 txtGetRecordset)，以及兩個 [指令按鈕](cmdGetRecordset 與 cmdSubmitChanges)。

Dim ads As Object    ' RDS.DataSpace object
Dim adf As Object    ' RDSServer.DataFactory object

Private Sub UserDocument_Initialize()
    Call Form_Load
End Sub

Private Sub Form_Load()
    txtConnect.Text = "Dsn=pubs;Uid=sa;Pwd=;"
    txtGetRecordset.Text = "Select au_lname from authors"
End Sub

Private Sub cmdGetRecordset_Click()
    Dim Server As String
    Server = txtServer.Text

    ' Create RDS.DataSpace using CreateObject Method of RDS.DataSpace
    Set ads = CreateObject("RDS.DataSpace")
    Set adf = ads.CreateObject("RDSServer.DataFactory", Server)

    ' Populate ListBox with Recordset
    MousePointer = vbHourglass
    Dim objADORs As Object
    Set objADORs = adf.Query(CStr(txtConnect.Text), CStr(txtGetRecordset.Text))
    List1.Clear
    While Not objADORs.EOF
        List1.AddItem objADORs(0).Value
        objADORs.MoveNext
    Wend
    MousePointer = vbNormal
End Sub
Sub cmdSubmitChanges_OnClick
    adf.SubmitChanges " Dsn=pubs;Uid=sa;Pwd=;",_
    objADORs
End Sub


Supports 方法範例

此範例使用 Supports 方法，顯示由不同游標類型的已開啟 recordset 所支援的選項。此程序執行時需要 DisplaySupport 程序。

Public Sub SupportsX()

    Dim aintCursorType(4) As Integer
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim intIndex As Integer

    ' Open connections.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

    ' Fill array with CursorType constants.
    aintCursorType(0) = adOpenForwardOnly
    aintCursorType(1) = adOpenKeyset
    aintCursorType(2) = adOpenDynamic
    aintCursorType(3) = adOpenStatic

    ' Open recordset using each CursorType and
    ' optimitic locking. Then call the DisplaySupport
    ' procedure to display the supported options.
    For intIndex = 0 To 3
        Set rstTitles = New ADODB.Recordset
        rstTitles.CursorType = aintCursorType(intIndex)
        rstTitles.LockType = adLockOptimistic
        rstTitles.Open "titles", strCnn, , , adCmdTable

        Select Case aintCursorType(intIndex)
            Case adOpenForwardOnly
                Debug.Print "ForwardOnly cursor supports:"
            Case adOpenKeyset
                Debug.Print "Keyset cursor supports:"
            Case adOpenDynamic
                Debug.Print "Dynamic cursor supports:"
            Case adOpenStatic
                Debug.Print "Static cursor supports:"
        End Select

        DisplaySupport rstTitles
        rstTitles.Close
    Next intIndex

End Sub

Public Sub DisplaySupport(rstTemp As ADODB.Recordset)

    Dim alngConstants(11) As Long
    Dim booSupports As Boolean
    Dim intIndex As Integer

    ' Fill array with cursor option constants.
    alngConstants(0) = adAddNew
    alngConstants(1) = adApproxPosition
    alngConstants(2) = adBookmark
    alngConstants(3) = adDelete
    alngConstants(4) = adFind
    alngConstants(5) = adHoldRecords
    alngConstants(6) = adMovePrevious
    alngConstants(7) = adNotify
    alngConstants(8) = adResync
    alngConstants(9) = adUpdate
    alngConstants(10) = adUpdateBatch

    For intIndex = 0 To 10
        booSupports = _
            rstTemp.Supports(alngConstants(intIndex))
        If booSupports Then
            Select Case alngConstants(intIndex)
                Case adAddNew
                    Debug.Print "   AddNew"
                Case adApproxPosition
                    Debug.Print "   AbsolutePosition and AbsolutePage"
                Case adBookmark
                    Debug.Print "   Bookmark"
                Case adDelete
                    Debug.Print "   Delete"
                Case adFind
                    Debug.Print "   Find"
                Case adHoldRecords
                    Debug.Print "   Holding Records"
                Case adMovePrevious
                    Debug.Print "   MovePrevious and Move"
                Case adNotify
                    Debug.Print "   Notifications"
                Case adResync
                    Debug.Print "   Resyncing data"
                Case adUpdate
                    Debug.Print "   Update"
                Case adUpdateBatch
                    Debug.Print "   batch updating"
            End Select
        End If
    Next intIndex

End Sub


Update 與 CancelUpdate 方法範例

此範例示範 Update 方法結合 CancelUpdate 方法。

Public Sub UpdateX()

    Dim rstEmployees As ADODB.Recordset
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String

    ' Open recordset with names from Employee table.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "SELECT fname, lname " & _
        "FROM Employee ORDER BY lname", strCnn, , , adCmdText

    ' Store original data.
    strOldFirst = rstEmployees!fname
    strOldLast = rstEmployees!lname
    ' Change data in edit buffer.
    rstEmployees!fname = "Linda"
    rstEmployees!lname = "Kobara"

    ' Show contents of buffer and get user input.
    strMessage = "Edit in progress:" & vbCr & _
        "  Original data = " & strOldFirst & " " & _
        strOldLast & vbCr & "  Data in buffer = " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to replace the original data with " & _
        "the buffered data in the Recordset?"

    If MsgBox(strMessage, vbYesNo) = vbYes Then
        rstEmployees.Update
    Else
        rstEmployees.CancelUpdate
    End If

    ' Show the resulting data.
    MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
        rstEmployees!lname

    ' Restore original data because this is a demonstration.
    If Not (strOldFirst = rstEmployees!fname And _
            strOldLast = rstEmployees!lname) Then
        rstEmployees!fname = strOldFirst
        rstEmployees!lname = strOldLast
        rstEmployees.Update
    End If

    rstEmployees.Close

End Sub

此範例示範 Update 方法結合 AddNew 方法。

Public Sub UpdateX2()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strEmpID As String
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open recordset with data from Employee table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    rstEmployees.AddNew
    strEmpID = "B-S55555M"
    rstEmployees!emp_id = strEmpID
    rstEmployees!fname = "Bill"
    rstEmployees!lname = "Sornsin"

    ' Show contents of buffer and get user input.
    strMessage = "AddNew in progress:" & vbCr & _
        "Data in buffer = " & rstEmployees!emp_id & ", " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to save buffer to recordset?"

    If MsgBox(strMessage, vbYesNoCancel) = vbYes Then
        rstEmployees.Update
        ' Go to the new record and show the resulting data.
        MsgBox "Data in recordset = " & rstEmployees!emp_id & ", " & _
             rstEmployees!fname & " " & rstEmployees!lname
    Else
        rstEmployees.CancelUpdate
        MsgBox "No new record added."
    End If

    ' Delete new data because this is a demonstration.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strEmpID & "'"

    rstEmployees.Close

End Sub


UpdateBatch 與 CancelBatch 方法範例

此範例示範 UpdateBatch 方法結合 CancelBatch 方法。

Public Sub UpdateBatchX()

    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim strTitle As String
    Dim strMessage As String

    ' Assign connection string to variable.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "titles", strCnn, , , adCmdTable

    rstTitles.MoveFirst

    ' Loop through recordset and ask user if she wants
    ' to change the type for a specified title.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
                "Change type to self help?"

            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
            End If
        End If

        rstTitles.MoveNext
    Loop

    ' Ask the user if she wants to commit to all the
    ' changes made above.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        rstTitles.UpdateBatch
    Else
        rstTitles.CancelBatch
    End If

    ' Print current data in recordset.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original values because this is a demonstration.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
        End If
        rstTitles.MoveNext
    Loop
    rstTitles.UpdateBatch

    rstTitles.Close

End Sub


ADO 屬性範例

請使用下列範例，學習如何使用 ADO 屬性。

注意 請將 Sub 至 End Sub 間所有的程式範例都貼到您的程式編輯器。如果只使用部份範例或遺失段落格式，則可能無法正確執行程式。

  • AbsolutePage、PageCount、與 PageSize 屬性範例

  • AbsolutePosition 與 CursorLocation 屬性範例

  • ActiveConnection、CommandText、CommandTimeout、CommandType、Size、與 Direction 屬性範例

  • ActualSize 與 DefinedSize 屬性範例

  • Attributes 與 Name 屬性範例

  • BOF、EOF、與 Bookmark 屬性範例

  • CacheSize 屬性範例

  • Connect 屬性範例

  • ConnectionString、ConnectionTimeout、與 State 屬性範例

  • Count 屬性範例

  • CursorType、LockType、與 EditMode 屬性範例

  • Description、NativeError、Number、Source、與 SQLState 屬性範例

  • ExecuteOptions 與 FetchOptions 屬性範例

  • Filter 與 RecordCount 屬性範例

  • FilterColumn、FilterCriterion、FilterValue、SortColumn、與 SortDirection 屬性與 Reset 方法範例

  • IsolationLevel 與 Mode 屬性範例

  • MarshalOptions 屬性範例

  • MaxRecords 屬性範例

  • NumericScale 與 Precision 屬性範例

  • OriginalValue 與 UnderlyingValue 屬性範例

  • Prepared 屬性範例

  • Provider 與 DefaultDatabase 屬性範例

  • Recordset 與 SourceRecordset 屬性範例

  • ReadyState 屬性範例

  • Server 屬性範例

  • Source 屬性範例

  • SQL 屬性範例

  • State 屬性範例

  • Status 屬性範例

  • Type 屬性範例

  • Type 屬性範例

  • Version 屬性範例


AbsolutePage、PageCount 與 PageSize 屬性範例

此範例使用 AbsolutePage、PageCount 與 PageSize 屬性，從 Employee 資料表一次顯示五筆記錄的名稱與雇用日期。

Public Sub AbsolutePageX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intPage As Integer
    Dim intPageCount As Integer
    Dim intRecord As Integer

    ' Open a recordset using a client cursor
    ' for the employee table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    ' Use client cursor to enable AbsolutePosition property.
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Display names and hire dates, five records
    ' at a time.
    rstEmployees.PageSize = 5
    intPageCount = rstEmployees.PageCount
    For intPage = 1 To intPageCount
        rstEmployees.AbsolutePage = intPage
        strMessage = ""
        For intRecord = 1 To rstEmployees.PageSize
            strMessage = strMessage & _
                rstEmployees!fname & " " & _
                rstEmployees!lname & " " & _
                rstEmployees!hire_date & vbCr
            rstEmployees.MoveNext
            If rstEmployees.EOF Then Exit For
        Next intRecord
        MsgBox strMessage
    Next intPage
    rstEmployees.Close

End Sub


AbsolutePosition 與 CursorLocation 屬性範例

此範例示範 AbsolutePosition 屬性如何能追蹤列舉 Recordset 所有紀錄迴圈的進度。其使用 CursorLocation 屬性，設定指標到用戶端指標，啟動 AbsolutePosition 屬性。

Public Sub AbsolutePositionX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String

    ' Open a recordset for the Employee table
    ' using a client cursor.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    ' Use client cursor to enable AbsolutePosition property.
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Enumerate Recordset.
    Do While Not rstEmployees.EOF
        ' Display current record information.
        strMessage = "Employee: " & rstEmployees!lName & vbCr & _
            "(record " & rstEmployees.AbsolutePosition & _
            " of " & rstEmployees.RecordCount & ")"
        If MsgBox(strMessage, vbOKCancel) = vbCancel _
            Then Exit Do
        rstEmployees.MoveNext
    Loop

    rstEmployees.Close

End Sub


ActiveConnection、CommandText、CommandTimeout、CommandType、Size 與 Direction 屬性範例

此範例使用 ActiveConnection、CommandText、CommandTimeout、CommandType、Size 與 Direction 屬性來執行預存的程序。

Public Sub ActiveConnectionX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Define a command object for a stored procedure.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn
    Set cmdByRoyalty = New ADODB.Command
    Set cmdByRoyalty.ActiveConnection = cnn1
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc
    cmdByRoyalty.CommandTimeout = 15

    ' Define the stored procedure's input parameter.
    intRoyalty = Trim(InputBox( _
        "Enter royalty:"))
    Set prmByRoyalty = New ADODB.Parameter
    prmByRoyalty.Type = adInteger
    prmByRoyalty.Size = 3
    prmByRoyalty.Direction = adParamInput
    prmByRoyalty.Value = intRoyalty
    cmdByRoyalty.Parameters.Append prmByRoyalty

    ' Create a recordset by executing the command.
    Set rstByRoyalty = cmdByRoyalty.Execute()

    ' Open the Authors table to get author names for display.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "authors", strCnn, , , adCmdTable

    ' Print current data in the recordset, adding
    ' author names from Authors table.
    Debug.Print "Authors with " & intRoyalty & _
        " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print , rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & _
            rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


ActualSize 與 DefinedSize 屬性範例

此範例使用 ActualSize 與 DefinedSize 屬性來顯示欄位定義的大小與實際大小。

Public Sub ActualSizeX()

    Dim rstStores As ADODB.Recordset
    Dim strCnn As String

    ' Open a recordset for the Stores table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstStores = New ADODB.Recordset
    rstStores.Open "stores", strCnn, , , adCmdTable

    ' Loop through the recordset displaying the contents
    ' of the stor_name field, the field's defined size,
    ' and its actual size.
    rstStores.MoveFirst

    Do Until rstStores.EOF
        MsgBox "Store name: " & rstStores!stor_name & _
        vbCr & "Defined size: " & _
        rstStores!stor_name.DefinedSize & _
        vbCr & "Actual size: " & _
        rstStores!stor_name.ActualSize & vbCr
        rstStores.MoveNext
    Loop

    rstStores.Close

End Sub


Attributes 與 Name 屬性範例

此範例顯示 Connection、Field 與 Property 物件的 Attributes 屬性值。其使用 Name 屬性來顯示每一 Field 與 Property 物件的名稱。

Public Sub AttributesX

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim proLoop As ADODB.Property
    Dim strCnn As String

    ' Open connection and recordset.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Display the attributes of the connection.
    Debug.Print "Connection attributes = " & _
        cnn1.Attributes

    ' Display the attributes of the Employee table's
    ' fields.
    Debug.Print "Field attributes:"
    For Each fldLoop In rstEmployees.Fields
        Debug.Print "    " & fldLoop.Name & " = " & _
            fldLoop.Attributes
    Next fldLoop

    ' Display Fields of the Employee table which are NULLABLE.
    Debug.Print "NULLABLE Fields:"
    For Each fldLoop In rstEmployees.Fields
        If CBool(fldLoop.Attributes And adFldIsNullable) Then
            Debug.Print "   " & fldLoop.Name
        End If
    Next fldLoop

    ' Display the attributes of the Employee table's
    ' properties.
    Debug.Print "Property attributes:"
    For Each proLoop In rstEmployees.Properties
        Debug.Print "    " & proLoop.Name & " = " & _
            proLoop.Attributes
    Next proLoop

    rstEmployees.Close
    cnn1.Close

End Sub


BOF、EOF 與 Bookmark 屬性範例

此範例使用 BOF 與 EOF 屬性，在使用者嘗試移動超過 Recordset 的第一筆或最後一筆紀錄時，顯示訊息。其使用 Bookmark 屬性讓使用者可以對 Recordset 中的紀錄標示旗標，並於稍後將其傳回。

Public Sub BOFX()

    Dim rstPublishers As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intCommand As Integer
    Dim varBookmark As Variant

    ' Open recordset with data from Publishers table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    ' Use client cursor to enable AbsolutePosition property.
    rstPublishers.CursorLocation = adUseClient
    rstPublishers.Open "SELECT pub_id, pub_name FROM publishers " & _
        "ORDER BY pub_name", strCnn, , , adCmdText

    rstPublishers.MoveFirst

    Do While True
        ' Display information about current record
        ' and get user input.
        strMessage = "Publisher: " & rstPublishers!pub_name & _
            vbCr & "(record " & rstPublishers.AbsolutePosition & _
            " of " & rstPublishers.RecordCount & ")" & vbCr & vbCr & _
            "Enter command:" & vbCr & _
            "[1 - next / 2 - previous /" & vbCr & _
            "3 - set bookmark / 4 - go to bookmark]"
        intCommand = Val(InputBox(strMessage))

        Select Case intCommand
            ' Move forward or backward, trapping for BOF
            ' or EOF.
            Case 1
                rstPublishers.MoveNext
                If rstPublishers.EOF Then
                    MsgBox "Moving past the last record." & _
                        vbCr & "Try again."
                    rstPublishers.MoveLast
                End If
            Case 2
                rstPublishers.MovePrevious
                If rstPublishers.BOF Then
                    MsgBox "Moving past the first record." & _
                        vbCr & "Try again."
                    rstPublishers.MoveFirst
                End If

            ' Store the bookmark of the current record.
            Case 3
                varBookmark = rstPublishers.Bookmark

            ' Go to the record indicated by the stored
            ' bookmark.
            Case 4
                If IsEmpty(varBookmark) Then
                    MsgBox "No Bookmark set!"
                Else
                    rstPublishers.Bookmark = varBookmark
                End If

            Case Else
                Exit Do
        End Select

    Loop

    rstPublishers.Close

End Sub

此範例使用 Bookmark 與 Filter 屬性來建立 Recordset 的有限檢視。只能存取書籤陣列所參照的記錄。

Public Sub BOFX2()

Dim rs As New ADODB.Recordset
Dim bmk(10)

rs.CursorLocation = adUseClient
rs.ActiveConnection = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=;"

rs.Open "select * from authors", , adOpenStatic, adLockBatchOptimistic
Debug.Print "Number of records before filtering: ", rs.RecordCount

ii = 0
While rs.EOF <> True And ii < 11
    bmk(ii) = rs.Bookmark
    ii = ii + 1
    rs.Move 2
Wend
rs.Filter = bmk
Debug.Print "Number of records after filtering: ", rs.RecordCount

rs.MoveFirst
While rs.EOF <> True
    Debug.Print rs.AbsolutePosition, rs("au_lname")
    rs.MoveNext
Wend

End Sub


CacheSize 屬性範例

此範例使用 CacheSize 屬性來顯示帶有與不帶有 30 筆紀錄快取區作業間效能的差異。

Public Sub CacheSizeX()

    Dim rstRoySched As ADODB.Recordset
    Dim strCnn As String
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim sngNoCache As Single
    Dim sngCache As Single
    Dim intLoop As Integer
    Dim strTemp As String

    ' Open the RoySched table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstRoySched = New ADODB.Recordset
    rstRoySched.Open "roysched", strCnn, , , adCmdTable

    ' Enumerate the Recordset object twice and record
    ' the elapsed time.
    sngStart = Timer

    For intLoop = 1 To 2
        rstRoySched.MoveFirst

        Do While Not rstRoySched.EOF
            ' Execute a simple operation for the
            ' performance test.
            strTemp = rstRoySched!title_id
            rstRoySched.MoveNext
        Loop
    Next intLoop

    sngEnd = Timer
    sngNoCache = sngEnd - sngStart

    ' Cache records in groups of 30 records.
    rstRoySched.MoveFirst
    rstRoySched.CacheSize = 30
    sngStart = Timer

    ' Enumerate the Recordset object twice and record
    ' the elapsed time.
    For intLoop = 1 To 2

        rstRoySched.MoveFirst
        Do While Not rstRoySched.EOF
            ' Execute a simple operation for the
            ' performance test.
            strTemp = rstRoySched!title_id
            rstRoySched.MoveNext
        Loop
    Next intLoop

    sngEnd = Timer
    sngCache = sngEnd - sngStart

    ' Display performance results.
    MsgBox "Caching Performance Results:" & vbCr & _
        "    No cache: " & Format(sngNoCache, _
        "##0.000") & " seconds" & vbCr & _
        "    30-record cache: " & Format(sngCache, _
        "##0.000") & " seconds"
    rstRoySched.Close

End Sub


Connect 屬性範例

此程式碼顯示在設計階段如何設定 Connect 屬性：

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="ADC1">
.
.
.
    <PARAM NAME="SQL" VALUE="Select * from Sales">
    <PARAM NAME="Connect" VALUE="DSN=pubs;UID=sa;PWD=;">
    <PARAM NAME="Server" VALUE="http://MyWebServer">
.
.
.
</OBJECT>

下列程式碼顯示如何以 VBScript 程式碼設定執行階段的 Connect 屬性。

若要測試此範例，請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 adcapi3.asp。ASP script 會辨識您的伺服器。

<Center><H2>RDS API Code Examples </H2>
<HR>
<H3>Set Connect Property at Run Time</H3>
<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
    </OBJECT>
<Object classid="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="Remote Data Service Connect Property at Run Time">
</OBJECT>
<HR>
<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
<Input Size=70 Name="txtConnect"><BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>To Fill Grid enter Connect String in middle text box<BR>
Try dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;</H4>
</Center>
<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time
Sub Run_OnClick
    ADC.Server = txtServer.Value
    ADC.SQL = txtSQL.Value
    ADC.Connect = txtConnect.Value
    ADC.Refresh
End Sub
-->
</Script>


ConnectionString、ConnectionTimeout 與 State 屬性範例

此範例示範使用 ConnectionString 屬性開啟 Connection 物件的不同方式。並使用ConnectionTimeout 屬性來設定連線容許時間，使用 State 屬性來檢查連線的狀態。此程序執行時需要 GetState 函數。

Public Sub ConnectionStringX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
    Dim cnn3 As ADODB.Connection
    Dim cnn4 As ADODB.Connection

    ' Open a connection without using a Data Source Name (DSN).
    Set cnn1 = New ADODB.Connection
    cnn1.ConnectionString = "driver={SQL Server};" & _
        "server=bigsmile;uid=sa;pwd=pwd;database=pubs"
    cnn1.ConnectionTimeout = 30
    cnn1.Open

    ' Open a connection using a DSN and ODBC tags.
    Set cnn2 = New ADODB.Connection
    cnn2.ConnectionString = "DSN=Pubs;UID=sa;PWD=pwd;"
    cnn2.Open

    ' Open a connection using a DSN and OLE DB tags.
    Set cnn3 = New ADODB.Connection
    cnn3.ConnectionString = "Data Source=Pubs;User ID=sa;Password=pwd;"
    cnn3.Open

    ' Open a connection using a DSN and individual
    ' arguments instead of a connection string.
    Set cnn4 = New ADODB.Connection
    cnn4.Open "Pubs", "sa", "pwd"

    ' Display the state of the connections.
    MsgBox "cnn1 state: " & GetState(cnn1.State) & vbCr & _
        "cnn2 state: " & GetState(cnn2.State) & vbCr & _
        "cnn3 state: " & GetState(cnn3.State) & vbCr & _
        "cnn4 state: " & GetState(cnn4.State)

    cnn4.Close
    cnn3.Close
    cnn2.Close
    cnn1.Close

End Sub

Public Function GetState(intState As Integer) As String

    Select Case intState
        Case adStateClosed
            GetState = "adStateClosed"
        Case adStateOpen
            GetState = "adStateOpen"
    End Select

End Function


Count 屬性範例

此範例示範 Employee 資料庫中帶有兩個集合的 Count 屬性。屬性取得每一集合內物件的數目，並設定列舉這些集合迴圈的上限。另一種列舉這些集合，卻不使用 Count 屬性的方式是使用 For Each...Next 敘述。

Public Sub CountX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim intloop As Integer

    ' Open recordset with data from Employee table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Print information about Fields collection.
    Debug.Print rstEmployees.Fields.Count & _
        " Fields in Employee"
    For intloop = 0 To rstEmployees.Fields.Count - 1
        Debug.Print "    " & rstEmployees.Fields(intloop).Name
    Next intloop

    ' Print information about Properties collection.
    Debug.Print rstEmployees.Properties.Count & _
        " Properties in Employee"
    For intloop = 0 To rstEmployees.Properties.Count - 1
        Debug.Print "    " & rstEmployees.Properties(intloop).Name
    Next intloop

    rstEmployees.Close

End Sub


CursorType、LockType 與 EditMode 屬性範例

此範例示範在開啟 Recordset 前設定 CursorType 與 LockType 屬性。其也顯示在不同狀況下，EditMode 屬性的值。此程序執行時需要 EditModeOutput 函數。

Public Sub EditModeX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String

    ' Open recordset with data from Employee table.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    Set rstEmployees = New ADODB.Recordset
    Set rstEmployees.ActiveConnection = cnn1
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockBatchOptimistic
    rstEmployees.Open "employee", , , , adCmdTable

    ' Show the EditMode property under different editing
    ' states.
    rstEmployees.AddNew
    rstEmployees!emp_id = "T-T55555M"
    rstEmployees!fname = "temp_fname"
    rstEmployees!lname = "temp_lname"
    EditModeOutput "After AddNew:", rstEmployees.EditMode
    rstEmployees.UpdateBatch
    EditModeOutput "After UpdateBatch:", rstEmployees.EditMode
    rstEmployees!fname = "test"
    EditModeOutput "After Edit:", rstEmployees.EditMode
    rstEmployees.Close

    ' Delete new record because this is a demonstration.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = 'T-T55555M'"

End Sub

Public Function EditModeOutput(strTemp As String, _
    intEditMode As Integer)

    ' Print report based on the value of the EditMode
    ' property.
    Debug.Print strTemp
    Debug.Print "  EditMode = ";

    Select Case intEditMode
        Case adEditNone
            Debug.Print "adEditNone"
        Case adEditInProgress
            Debug.Print "adEditInProgress"
        Case adEditAdd
            Debug.Print "adEditAdd"
    End Select

End Function


Description、NativeError、Number、Source 與 SQLState 屬性範例

此範例會觸發錯誤，捕捉錯誤，並顯示 Error 物件的 Description、HelpContext、HelpFile、NativeError、Number、Source 與 SQLState 屬性。

Public Sub DescriptionX()

    Dim cnn1 As ADODB.Connection
    Dim errLoop As ADODB.Error
    Dim strError As String

    On Error GoTo ErrorHandler

    ' Intentionally trigger an error.
    Set cnn1 = New ADODB.Connection
    cnn1.Open "nothing"

    Exit Sub

ErrorHandler:

    ' Enumerate Errors collection and display
    ' properties of each Error object.
    For Each errLoop In cnn1.Errors
        strError = "Error #" & errLoop.Number & vbCr & _
            "    " & errLoop.Description & vbCr & _
            "    (Source: " & errLoop.Source & ")" & vbCr & _
            "    (SQL State: " & errLoop.SQLState & ")" & vbCr & _
            "    (NativeError: " & errLoop.NativeError & ")" & vbCr
        If errLoop.HelpFile = "" Then
            strError = strError & _
                "    No Help file available" & _
                vbCr & vbCr
        Else
            strError = strError & _
                "    (HelpFile: " & errLoop.HelpFile & ")" & vbCr & _
                "    (HelpContext: " & errLoop.HelpContext & ")" & _
                vbCr & vbCr
        End If

    Debug.Print strError
    Next

    Resume Next

End Sub


ExecuteOptions 與 FetchOptions 屬性範例

下列程式碼顯示如何在設計階段設定 ExecuteOptions 與 FetchOptions 屬性。如果沒有設定，ExecuteOptions 預設為 adcExecSync。這個設定值表示當呼叫 ADC.Refresh 方法時，會在目前呼叫的執行緒上執行—也就是，同步。

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="ADC1">
.
.
.
<PARAM NAME="SQL" VALUE="Select * from Sales">
<PARAM NAME="Connect" VALUE="DSN=pubs;UID=sa;PWD=;">
<PARAM NAME="Server" VALUE="http://MyWebServer">
<PARAM NAME="ExecuteOptions" VALUE="1">
<PARAM NAME="FetchOptions" VALUE="3">

.
.
</OBJECT>

下列範例顯示如何以 VBScript 程式碼設定執行階段的 ExecuteOptions 與 FetchOptions 屬性。請參閱這些屬性運作範例的 Refresh 方法。

<Script Language="VBScript">
<!--
Sub ExecuteHow
' Execute next refresh of Recordset asynchronously to the calling thread.
ADC1.ExecuteOptions = 1
ADC1.FetchOptions = 3
ADC.Refresh
End Sub
-->
</Script>


Filter 與 RecordCount 屬性範例

此範例使用 Filter 屬性，依據應用至現存 Recordset 所指定的狀況，開啟新的 Recordset。其使用 RecordCount 屬性顯示兩 Recordsets 的記錄數目。執行此程序需要 FilterField 函數。

Public Sub FilterX()

    Dim rstPublishers As ADODB.Recordset
    Dim rstPublishersCountry As ADODB.Recordset
    Dim strCnn As String
    Dim intPublisherCount As Integer
    Dim strCountry As String
    Dim strMessage As String

    ' Open recordset with data from Publishers table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    rstPublishers.Open "publishers", strCnn, , , adCmdTable

    ' Populate the Recordset.
    intPublisherCount = rstPublishers.RecordCount

    ' Get user input.
    strCountry = Trim(InputBox( _
        "Enter a country to filter on:"))

    If strCountry <> "" Then
        ' Open a filtered Recordset object.
        Set rstPublishersCountry = _
            FilterField(rstPublishers, "Country", strCountry)

        If rstPublishersCountry.RecordCount = 0 Then
            MsgBox "No publishers from that country."
        Else
            ' Print number of records for the original
            ' Recordset object and the filtered Recordset
            ' object.
            strMessage = "Orders in original recordset: " & _
                vbCr & intPublisherCount & vbCr & _
                "Orders in filtered recordset (Country = '" & _
                strCountry & "'): " & vbCr & _
                rstPublishersCountry.RecordCount
            MsgBox strMessage
        End If
        rstPublishersCountry.Close

    End If

End Sub

Public Function FilterField(rstTemp As ADODB.Recordset, _
    strField As String, strFilter As String) As ADODB.Recordset

    ' Set a filter on the specified Recordset object and then
    ' open a new Recordset object.
    rstTemp.Filter = strField & " = '" & strFilter & "'"
    Set FilterField = rstTemp

End Function

注意 當您知道要選擇的資料時，通常以 SQL 敘述開啟 Recordset 會更有效率。此範例顯示您如何能只建立一個 Recordset，並從特別的國家取得紀錄。

Public Sub FilterX2()

    Dim rstPublishers As ADODB.Recordset
    Dim strCnn As String

    ' Open recordset with data from Publishers table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    rstPublishers.Open "SELECT * FROM publishers " & _
        "WHERE Country = 'USA'", strCnn, , , adCmdText

    ' Print current data in recordset.
    rstPublishers.MoveFirst
    Do While Not rstPublishers.EOF
        Debug.Print rstPublishers!pub_name & ", " & _
            rstPublishers!country
        rstPublishers.MoveNext
    Loop

    rstPublishers.Close

End Sub


FilterColumn、FilterCriterion、FilterValue、SortColumn 與 SortDirection 屬性與 Reset 方法範例

下列程式碼顯示如何在設計階段設定 RDS.DataControl Server 參數，並使用稱為 Pubs 的 ODBC 資料來源，將其連結到可以警覺資料的控制。Pubs 與 SQL Server 6.5 一起出版。若要嘗試此範例，您需要稱為 txtSortcolumn、txtSortdirection、txtFiltercolumn、txtCriterion 與 txtFilterValue 的 rich text 控制項，以及一個稱為 SortFilter 的 HTML 表單輸入按鈕。

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
ID=ADC HEIGHT=10 WIDTH=10>
<PARAM NAME="SQL" VALUE="Select * from Sales ">
<PARAM NAME="SERVER" VALUE="http://MyWebServer">
<PARAM NAME="CONNECT" VALUE="dsn=pubs;UID=sa;PWD=;">
</OBJECT>

<!-- Sheridan Grid -->
<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://MyWebServer
/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="BackColor"   VALUE="-2147483643">
    <PARAM NAME="BackColorOdd"  VALUE="-2147483643">
    <PARAM NAME="ForeColorEven" VALUE="0">
</OBJECT>

<Script Language="VBScript">
<!--
Sub SortFilter_OnClick

    ' Set the values. txtSortcolumn is a rich text box
    ' control. The value of SortColumn will be the text
    ' value of what the user specifies in the
    ' txtSortcolumn box.
    If(txtSortcolumn.text <> "") then
        ADC.SortColumn = txtSortcolumn.text
    End If

    ' txtSortdirection is a rich text box
    ' control. The value of SortDirection will be the
    ' text value of what the user specifies in the
    ' txtSortdirection box.
    Select Case UCASE(txtSortDirection.text)
    Case "TRUE"
        ADC.SortDirection = TRUE
    Case "FALSE"
        ADC.SortDirection = FALSE
    Case Else
        MsgBox "Only true or false are accepted for sort direction"
    End Select

    ' txtFiltercolumn is a rich text box
    ' control. The value of FilterColumn will be the
    ' text value of what the user specifies in the
    ' txtFiltercolumn box.
    If (txtFiltercolumn.text <> "") Then
        ADC.FilterColumn = txtFiltercolumn.text
    End If

    ' txtCriterion is a rich text box
    ' control. The value of FilterCriterion will be the
    ' text value of what the user specifies in the
    ' txtCriterion box.
    If (txtCriterion.text <> "") Then
        ADC.FilterCriterion = txtCriterion.text
    End If

    ' txtFilterValue is a rich text box
    ' control. The value of FilterValue will be the
    ' text value of what the user specifies in the
    ' txtFilterValue box.
    If (txtFilterValue.text <> "") Then
        ADC.FilterValue = txtFilterValue.text
    End If

    ' Execute the sort and filter on a client-side
    ' Recordset based on the specified sort and filter
    ' properties. Calling Reset refreshes the result set
    ' that is displayed in the data-bound controls to
    ' display the filtered, sorted recordset.
    ADC.Reset

End Sub
-->
</Script>


IsolationLevel 與 Mode 屬性範例

此範例使用 Mode 屬性，開啟獨佔連線，以及使用 IsolationLevel 屬性開啟在其它交易隔離中執行的交易。

Public Sub IsolationLevelX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String

    ' Assign connection string to variable.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

    ' Open connection and titles table.
    Set cnn1 = New ADODB.Connection
    cnn1.Mode = adModeShareExclusive
    cnn1.IsolationLevel = adXactIsolated
    cnn1.Open strCnn

    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenDynamic
    rstTitles.LockType = adLockPessimistic
    rstTitles.Open "titles", cnn1, , , adCmdTable

    cnn1.BeginTrans

    ' Display connection mode.
    If cnn1.Mode = adModeShareExclusive Then
        MsgBox "Connection mode is exclusive."
    Else
        MsgBox "Connection mode is not exclusive."
    End If

    ' Display isolation level.
    If cnn1.IsolationLevel = adXactIsolated Then
        MsgBox "Transaction is isolated."
    Else
        MsgBox "Transaction is not isolated."
    End If

    ' Change the type of psychology titles.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            rstTitles!Type = "self_help"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    ' Print current data in recordset.
    rstTitles.Requery
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original data.
    cnn1.RollbackTrans
    rstTitles.Close

    cnn1.Close

End Sub


MarshalOptions 屬性範例

此範例使用 MarshalOptions 屬性來指定哪一列要送回伺服器—所有的列或只是修正過的列。

Public Sub MarshalOptionsX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String
    Dim strMarshalAll As String
    Dim strMarshalModified As String

    ' Open recordset with names from Employee table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "SELECT fname, lname " & _
        "FROM Employee ORDER BY lname", strCnn, , , adCmdText

    ' Store original data.
    strOldFirst = rstEmployees!fname
    strOldLast = rstEmployees!lname

    ' Change data in edit buffer.
    rstEmployees!fname = "Linda"
    rstEmployees!lname = "Kobara"

    ' Show contents of buffer and get user input.
    strMessage = "Edit in progress:" & vbCr & _
        " Original data = " & strOldFirst & " " & _
        strOldLast & vbCr & " Data in buffer = " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to replace the original data with " & _
        "the buffered data in the Recordset?"
    strMarshalAll = "Would you like to send all the rows " & _
                    "in the recordset back to the server?"
    strMarshalModified = "Would you like to send only " & _
                    "modified rows back to the server?"

    If MsgBox(strMessage, vbYesNo) = vbYes Then
        If MsgBox(strMarshalAll, vbYesNo) = vbYes Then
            rstEmployees.MarshalOptions = adMarshalAll
            rstEmployees.Update
        ElseIf MsgBox(strMarshalModified, vbYesNo) = vbYes Then
            rstEmployees.MarshalOptions = adMarshalModifiedOnly
            rstEmployees.Update
        End If
    End If

    ' Show the resulting data.
    MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
        rstEmployees!lname

    ' Restore original data because this is a demonstration.
    If Not (strOldFirst = rstEmployees!fname And _
            strOldLast = rstEmployees!lname) Then
        rstEmployees!fname = strOldFirst
        rstEmployees!lname = strOldLast
        rstEmployees.Update
    End If

    rstEmployees.Close

End Sub


MaxRecords 屬性範例

此範例使用 MaxRecords 屬性來開啟包含 Titles 資料表中最多 10 個獨佔 title 的 Recordset。

Public Sub MaxRecordsX()

    Dim rstTemp As ADODB.Recordset
    Dim strCnn As String

    ' Open recordset containing the 10 most expensive
    ' titles in the Titles table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstTemp = New ADODB.Recordset
    rstTemp.MaxRecords = 10
    rstTemp.Open "SELECT Title, Price FROM Titles " & _
        "ORDER BY Price DESC", strCnn, , , adCmdText

    ' Display the contents of the recordset.
    Debug.Print "Top Ten Titles by Price:"

    Do While Not rstTemp.EOF
        Debug.Print "  " & rstTemp!Title & " - " & rstTemp!Price
        rstTemp.MoveNext
    Loop
    rstTemp.Close

End Sub


NumericScale 與 Precision 屬性範例

此範例使用 NumericScale 與 Precision 屬性來顯示 Pubs 資料庫 Discounts 資料表中，數值範圍與欄位精確度。

Public Sub NumericScaleX()

    Dim rstDiscounts As ADODB.Recordset
    Dim fldTemp As ADODB.Field
    Dim strCnn As String

    ' Open recordset.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstDiscounts = New ADODB.Recordset
    rstDiscounts.Open "discounts", strCnn, , , adCmdTable

    ' Display numeric scale and precision of
    ' numeric and small integer fields.
    For Each fldTemp In rstDiscounts.Fields
        If fldTemp.Type = adNumeric _
            Or fldTemp.Type = adSmallInt Then
            MsgBox "Field: " & fldTemp.Name & vbCr & _
                "Numeric scale: " & _
                    fldTemp.NumericScale & vbCr & _
                "Precision: " & fldTemp.Precision
        End If
    Next fldTemp

    rstDiscounts.Close

End Sub


OriginalValue 與 UnderlyingValue 屬性範例

此範例由在 Recordset 批次更新期間，如果記錄所使用的資料有變更，就顯示訊息，來示範 OriginalValue 與 UnderlyingValue 屬性。

Public Sub OriginalValueX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim fldType As ADODB.Field
    Dim strCnn As String

    ' Open connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open recordset for batch update.
    Set rstTitles = New ADODB.Recordset
    Set rstTitles.ActiveConnection = cnn1
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "titles"

    ' Set field object variable for Type field.
    Set fldType = rstTitles!Type

    ' Change the type of psychology titles.
    Do Until rstTitles.EOF
        If Trim(fldType) = "psychology" Then
            fldType = "self_help"
        End If
        rstTitles.MoveNext
    Loop

    ' Similate a change by another user by updating
    ' data using a command string.
    cnn1.Execute "UPDATE titles SET type = 'sociology' " & _
        "WHERE type = 'psychology'"

    'Check for changes.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If fldType.OriginalValue <> _
            fldType.UnderlyingValue Then

            MsgBox "Data has changed!" & vbCr & vbCr & _
                "  Title ID: " & rstTitles!title_id & vbCr & _
                "  Current value: " & fldType & vbCr & _
                "  Original value: " & _
                fldType.OriginalValue & vbCr & _
                "  Underlying value: " & _
                fldType.UnderlyingValue & vbCr
        End If
        rstTitles.MoveNext
    Loop

    ' Cancel the update because this is a demonstration.
    rstTitles.CancelBatch
    rstTitles.Close

    ' Restore original values.
    cnn1.Execute "UPDATE titles SET type = 'psychology' " & _
        "WHERE type = 'sociology'"

    cnn1.Close

End Sub


Prepared 屬性範例

此範例藉由開啟兩個 Command 物件—一個準備好且另一個尚未，來示範 Prepared 屬性。

Public Sub PreparedX()

    Dim cnn1 As ADODB.Connection
    Dim cmd1 As ADODB.Command
    Dim cmd2 As ADODB.Command
    Dim strCnn As String
    Dim strCmd As String
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim sngNotPrepared As Single
    Dim sngPrepared As Single
    Dim intLoop As Integer

    ' Open a connection.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Create two command objects for the same
    ' command -  one prepared and one not prepared.
    strCmd = "SELECT title, type FROM titles ORDER BY type"

    Set cmd1 = New ADODB.Command
    Set cmd1.ActiveConnection = cnn1
    cmd1.CommandText = strCmd

    Set cmd2 = New ADODB.Command
    Set cmd2.ActiveConnection = cnn1
    cmd2.CommandText = strCmd
    cmd2.Prepared = True

    ' Set a timer, then execute the unprepared
    ' command 20 times.
    sngStart = Timer
    For intLoop = 1 To 20
        cmd1.Execute
    Next intLoop
    sngEnd = Timer
    sngNotPrepared = sngEnd - sngStart

    ' Reset the timer, then execute the prepared
    ' command 20 times.
    sngStart = Timer
    For intLoop = 1 To 20
        cmd2.Execute
    Next intLoop
    sngEnd = Timer
    sngPrepared = sngEnd - sngStart

    ' Display performance results.
    MsgBox "Performance Results:" & vbCr & _
        "    Not Prepared: " & Format(sngNotPrepared, _
        "##0.000") & " seconds" & vbCr & _
        "    Prepared: " & Format(sngPrepared, _
        "##0.000") & " seconds"

    cnn1.Close

End Sub


Provider 與 DefaultDatabase 屬性範例

此範例藉由使用不同的提供者開啟三個 Connection 物件，來示範 Provider 屬性。並使用 DefaultDatabase 屬性來設定 Microsoft ODBC Provider 的預設資料庫。

Public Sub ProviderX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
Dim cnn3 As ADODB.Connection

    ' Open a connection using the Microsoft ODBC provider.
    Set cnn1 = New ADODB.Connection
    cnn1.ConnectionString = "driver={SQL Server};" & _
        "server=bigsmile;uid=sa;pwd=pwd"
    cnn1.Open strCnn
    cnn1.DefaultDatabase = "pubs"

    ' Display the provider.
    MsgBox "Cnn1 provider: " & cnn1.Provider

    ' Open a connection using the Microsoft Jet provider.
    Set cnn2 = New ADODB.Connection
    cnn2.Provider = "Microsoft.Jet.OLEDB.3.51"
    cnn2.Open "C:\Samples\northwind.mdb", "admin", ""

    ' Display the provider.
    MsgBox "Cnn2 provider: " & cnn2.Provider

   ' Open a connection using the Microsoft SQL Server provider.
    Set cnn3 = New ADODB.Connection
    cnn3.Provider = "sqloledb"
    cnn3.Open "Data Source=srv;Initial Catalog=pubs;", "sa", ""

    ' Display the provider.
    MsgBox "Cnn3 provider: " & cnn3.Provider

    cnn1.Close
    cnn2.Close
    cnn3.Close

End Sub


Recordset 與 SourceRecordset 屬性範例

下列範例顯示如何設定執行階段 RDSServer.DataFactory 預設 business 物件的必要參數。若要測試此範例，請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 ADCapi4.asp。ASP script 會辨識您的伺服器。

<Center><H2>RDS API Code Examples</H2>
<HR>
<H3>Using SourceRecordset and Recordset with RDSServer.DataFactory</H3>
<!-- RDS.DataSpace ID ADS1 -->
<OBJECT ID="ADS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl with parameters set at Run Time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
</OBJECT>

<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="RDSServer.DataFactory Run Time">
</OBJECT>
<HR>
<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
<Input Size=70 Name="txtConnect" Value="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;"><BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Fill Grid with these values or change them to see data from another ODBC data source on your server.
<BR>Try dsn=pubs;uid=sa;pwd=; and Select * From Authors</H4>
</Center>
<Script Language="VBScript">
<!--
Dim ADF
Dim strServer
strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"

Sub Run_OnClick()
    Dim objADORs            ' Create RDSServer.DataFactory Object
Set ADF = ADS1.CreateObject("RDSServer.DataFactory", strServer)                    ' Get Recordset
Set objADORs = ADF.Query(txtConnect.Value,txtSQL.Value)

' Set parameters of RDS.DataControl at run time.
    ADC.Server = txtServer.Value
    ADC.SQL = txtSQL.Value
    ADC.Connect = txtConnect.Value
    ADC.Refresh
End Sub
-->
</Script>


ReadyState 屬性範例

下列範例顯示如何以 VBScript 程式碼，讀取執行階段 RDS.DataControl 物件的 ReadyState 屬性。ReadyState 是唯讀屬性。

若要測試此範例，請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 adcapi4.asp。ASP script 會辨識您的伺服器。

<Center><H2>RDS API Code Examples </H2>
<HR>
<H3> RDS.DataControl ReadyState property</H3></Center>
<!-- RDS.DataControl with parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
<PARAM NAME="ExecuteOptions" VALUE="adcExecAsync">
<PARAM NAME="FetchOptions" VALUE="adcFetchAsync">
</OBJECT>

<Script Language="VBScript">

Sub Window_OnLoad
Select Case ADC1.ReadyState
    case 2: MsgBox "Executing Query"
    case 3: MsgBox "Fetching records in background"
    case 4: MsgBox "All records fetched"
End Select
End Sub
</Script>


Server 屬性範例

下列程式碼顯示在設計階段，如何設定 RDS.DataControl 參數，以及如何使用稱為 ADCDemo 的 ODBC 系統資料來源，將其連結到可聯繫資料的控制項。如果您遵循指示，則 ADCDemo 已經安裝在您的伺服器上，當作是 SQL Server ODBC 系統資料來源。請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 ADCapi1.asp。ASP script 會辨識您的伺服器。

<Center><H2>RDS API Code Examples </H2>
<HR><BR>
<H3>Remote Data Service</H3>
<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
</OBJECT>
<!-- Remote Data Service with Parameters set at Design Time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
</OBJECT><BR><HR></Center>

下列範例顯示如何設定執行階段中，RDS.DataControl 的必要參數。若要測試此範例，請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 ADCapi4.asp。ASP script 會辨識您的伺服器。

<Center><H2>RDS API Code Examples </H2>
<HR><H3>Remote Data Service Server Property Set at Run Time</H3>
<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
</OBJECT>
<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="Remote Data Service Run Time">
</OBJECT><HR>
<Input Size=70 Name="txtServer"><BR>
<Input Size=70 Name="txtConnect" Value="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
<BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Fill top text box with your Web server name in the form http://Myserver</H4>
</Center>
<Script Language="VBScript">
<!--
' Set parameters of RDS.DataControl at Run Time.
Sub Run_OnClick
    ADC.Server = txtServer.Value
    ADC.SQL = txtSQL.Value
    ADC.Connect = txtConnect.Value
    ADC.Refresh
End Sub
-->
</Script>


Source 屬性範例

此範例藉由開啟三個依據不同資料來源的 Recordset 物件，示範 Source 屬性。

Public Sub SourceX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim rstPublishers As ADODB.Recordset

Dim rstPublishersDirect As ADODB.Recordset

    Dim rstTitlesPublishers As ADODB.Recordset
    Dim cmdSQL As ADODB.Command
    Dim strCnn As String
    Dim strSQL As String

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Open a recordset based on a command object.
    Set cmdSQL = New ADODB.Command
    Set cmdSQL.ActiveConnection = cnn1
    cmdSQL.CommandText = "Select title, type, pubdate " & _
        "FROM titles ORDER BY title"
    Set rstTitles = cmdSQL.Execute()

    ' Open a recordset based on a table.
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.Open "publishers", strCnn, , , adCmdTable

    ' Open a recordset based on a table.
    Set rstPublishersDirect = New ADODB.Recordset
    rstPublishersDirect.Open "publishers", strCnn, , , adCmdTableDirect

    ' Open a recordset based on an SQL string.
    Set rstTitlesPublishers = New ADODB.Recordset
    strSQL = "SELECT title_ID AS TitleID, title AS Title, " & _
        "publishers.pub_id AS PubID, pub_name AS PubName " & _
        "FROM publishers INNER JOIN titles " & _
        "ON publishers.pub_id = titles.pub_id " & _
        "ORDER BY Title"
    rstTitlesPublishers.Open strSQL, strCnn, , , adCmdText

    ' Use the Source property to display the source of each recordset.
    MsgBox "rstTitles source: " & vbCr & _
        rstTitles.Source & vbCr & vbCr & _
        "rstPublishers source: " & vbCr & _
        rstPublishers.Source & vbCr & vbCr & _
        "rstPublishersDirect source: " & vbCr & _
        rstPublishersDirect.Source & vbCr & vbCr & _
        "rstTitlesPublishers source: " & vbCr & _
        rstTitlesPublishers.Source

    rstTitles.Close
    rstPublishers.Close
    rstTitlesPublishers.Close
    cnn1.Close

End Sub


SQL 屬性範例

下列程式碼顯示如何於設計階段設定 RDS.DataControl 參數，並且使用與 SQL Server 6.5一起出版，稱為 Pubs 的 ODBC 資料來源，將其連結到可聯繫資料的控制項。

<!—- RDS.DataControl -- >
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=ADC HEIGHT=10 WIDTH=10>
    <PARAM NAME="SQL" VALUE="Select * from Authors">
    <PARAM NAME="SERVER" VALUE="http://MyWebServer">
<PARAM NAME="CONNECT" VALUE="dsn=pubs;UID=sa;PWD=;">
</OBJECT>

<!-- Data Grid -- >
<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://MyWebServer
/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="BackColor"   VALUE="-2147483643">
    <PARAM NAME="BackColorOdd"  VALUE="-2147483643">
    <PARAM NAME="ForeColorEven" VALUE="0">
</OBJECT>

下列範例顯示如何設定執行階段中，RDS.DataControl 的必要參數。若要測試此範例，請剪下並貼上介於一般 HTML 文件中 <Body></Body> 附加文字間的程式碼，並命名為 ADCapi5.asp。ASP script 會辨識您的伺服器。

<Center><H2>RDS API Code Examples </H2>
<HR><H3>Remote Data Service SQL Property Set at Run Time</H3>

<!-- RDS.DataControl with no parameters set at design time -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=ADC>
</OBJECT>
<Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
    CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
    ID=GRID1
        datasrc=#ADC
        HEIGHT=125
        WIDTH=495>
    <PARAM NAME="AllowAddNew" VALUE="TRUE">
    <PARAM NAME="AllowDelete" VALUE="TRUE">
    <PARAM NAME="AllowUpdate" VALUE="TRUE">
    <PARAM NAME="Caption" VALUE="Remote Data Service Run Time">
</OBJECT>
<HR>
<Input Size=70 Name="txtServer" Value= "http://<%=Request.ServerVariables("SERVER_NAME")%>">
<BR>
<Input Size=70 Name="txtConnect" Value="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;">
<BR>
<Input Size=70 Name="txtSQL">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Fill bottom text box with an SQL string<BR>
Try ... Select * from Employee</H4>
</Center>
<Script Language="VBScript">
<!--
' Set parameters of RDS. at Run Time
Sub Run_OnClick
    ADC.Server = txtServer.Value
    ADC.SQL = txtSQL.Value
    ADC.Connect = txtConnect.Value
    ADC.Refresh
End Sub
-->
</Script>


State 屬性範例

此範例使用 State 屬性來顯示開啟非同步連線與執行非同步指令時的訊息。

Public Sub StateX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
    Dim cmdChange As ADODB.Command
    Dim cmdRestore As ADODB.Command
    Dim strCnn As String

    ' Open two asynchronous connections, displaying
    ' a message while connecting.
    Set cnn1 = New ADODB.Connection
    Set cnn2 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

    cnn1.Open strCnn, , , adAsyncConnect
    While (cnn1.State = adStateConnecting)
        Debug.Print "Opening first connection...."
    Wend

    cnn2.Open strCnn, , , adAsyncConnect
    While (cnn2.State = adStateConnecting)
        Debug.Print "Opening second connection...."
    Wend

    ' Create two command objects.
    Set cmdChange = New ADODB.Command
    cmdChange.ActiveConnection = cnn1
    cmdChange.CommandText = "UPDATE titles SET type = 'self_help' " & _
        "WHERE type = 'psychology'"

    Set cmdRestore = New ADODB.Command
    cmdRestore.ActiveConnection = cnn2
    cmdRestore.CommandText = "UPDATE titles SET type = 'psychology' " & _
        "WHERE type = 'self_help'"

    ' Executing the commands, displaying a message
    ' while they are executing.
    cmdChange.Execute , , adAsyncExecute
    While (cmdChange.State = adStateExecuting)
        Debug.Print "Change command executing...."
    Wend

    cmdRestore.Execute , , adAsyncExecute
    While (cmdRestore.State = adStateExecuting)
        Debug.Print "Restore command executing...."
    Wend

    cnn1.Close
    cnn2.Close

End Sub


Status 屬性範例

此範例使用 Status 屬性來顯示在批次更新發生前，哪些紀錄已經於批次作業中修改。

Public Sub StatusX()

    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String

    ' Open recordset for batch update.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "titles", strCnn, , , adCmdTable

    ' Change the type of psychology titles.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            rstTitles!Type = "self_help"
        End If
        rstTitles.MoveNext
    Loop

    ' Display Title ID and status.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If rstTitles.Status = adRecModified Then
            Debug.Print rstTitles!title_id & " - Modified"
        Else
            Debug.Print rstTitles!title_id
        End If
        rstTitles.MoveNext
    Loop

    ' Cancel the update because this is a demonstration.
    rstTitles.CancelBatch
    rstTitles.Close

End Sub


Type 屬性範例

此範例藉由顯示 Employee 資料表中，所有 Field 物件的 Type 屬性值的相對應常數名稱，示範 Type 屬性。執行此程序時需要 FieldType 函數。

Public Sub TypeX()

    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim strCnn As String

    ' Open recordset with data from Employee table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    Debug.Print "Fields in Employee Table:" & vbCr

    ' Enumerate Fields collection of Employees table.
    For Each fldLoop In rstEmployees.Fields
        Debug.Print "  Name: " & fldLoop.Name & vbCr & _
            "  Type: " & FieldType(fldLoop.Type) & vbCr
    Next fldLoop

End Sub

Public Function FieldType(intType As Integer) As String

    Select Case intType
        Case adChar
            FieldType = "adChar"
        Case adVarChar
            FieldType = "adVarChar"
        Case adSmallInt
            FieldType = "adSmallInt"
        Case adUnsignedTinyInt
            FieldType = "adUnsignedTinyInt"
        Case adDBTimeStamp
            FieldType = "adDBTimeStamp"
    End Select

End Function


Value 屬性範例

此範例藉由顯示 Employees 資料表的欄位與屬性值，示範帶有 Field 與 Property 物件的Value 屬性。

Public Sub ValueX()

    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim prpLoop As ADODB.Property
    Dim strCnn As String

    ' Open recordset with data from Employee table.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    Debug.Print "Field values in rstEmployees"
    ' Enumerate the Fields collection of the Employees
    ' table.
    For Each fldLoop In rstEmployees.Fields
        ' Because Value is the default property of a
        ' Field object, the use of the actual keyword
        ' here is optional.
        Debug.Print "    " & fldLoop.Name & " = " & fldLoop.Value
    Next fldLoop

    Debug.Print "Property values in rstEmployees"
    ' Enumerate the Properties collection of the
    ' Recordset object.
    For Each prpLoop In rstEmployees.Properties
        ' Because Value is the default property of a
        ' Property object, the use of the actual keyword
        ' here is optional.
        Debug.Print "    " & prpLoop.Name & " = " & prpLoop.Value
    Next prpLoop

    rstEmployees.Close

End Sub


Version 屬性範例

此範例使用 Connection 物件的 Version 屬性，顯示目前的 ADO 版本。並使用許多動態屬性來顯示目前的 DBMS 名稱與版本，OLE DB 版本，提供者名稱與版本，驅動程式名稱與版本，以及驅動程式 ODBC 版本。

Public Sub VersionX()

    Dim cnn1 As ADODB.Connection

    ' Open connection.
    Set cnn1 = New ADODB.Connection
    strCnn = “driver={SQL Server};server=srv;” & _
        “user id=sa;password=;database=pubs;”
    cnn1.Open strCnn

    strVersionInfo = "ADO Version: " & cnn1.Version & vbCr & _
    "DBMS Name: " & cnn1.Properties("DBMS Name") & vbCr & _
    "DBMS Version: " & cnn1.Properties("DBMS Version") & vbCr & _
    "OLE DB Version: " & cnn1.Properties("OLE DB Version") & vbCr & _
    "Provider Name: " & cnn1.Properties("Provider Name") & vbCr & _
    "Provider Version: " & cnn1.Properties("Provider Version") & vbCr & _
    "Driver Name: " & cnn1.Properties("Driver Name") & vbCr & _
    "Driver Version: " & cnn1.Properties("Driver Version") & vbCr & _
    "Driver ODBC Version: " & cnn1.Properties("Driver ODBC Version")

    MsgBox strVersionInfo

    cnn1.Close

End Sub


ADO語法索引

請使用這些索引來參照 Microsoft Visual J++ 或 Microsoft Visual C++ 內的ADO 物件、方法、屬性以及事件主題。

  • 語法索引 (ADO for VC++)

  • 語法索引 (ADO/WFC)


語法索引 (ADO for VC++)

ADO Language Reference 使用 Microsoft(R) Visual Basic(R) 程式設計語言來示範ADO 方法和屬性語法。此語法是以 Microsoft (R) Visual C++ (R) 為基礎之 ADO Lanague Reference的交互參照。

若您在應用程式使用 #import 引數，則會產生行首檔案，讓您可以使用與 Microsoft Visual Basic 類似的語法。get_PropertyName 和 put_PropertyNam 等形式的屬性名稱如果只是宣告成PropertyName，則就會予以處理。接下來屬性就可以當成資料成員而不是函數來處理。

所有的方法、屬性以及事件都是會傳回 HRESULT 函數，您可以測試後判斷函數是否執行成功。

在此列出下列元件的方法和屬性語法:

  • Colletion 物件

  • Command 物件

  • Connection 物件

  • Error 物件

  • Field 物件

  • Parameter 物件

  • Recordset 物件


_Connection (ADO for VC++ 語法)

方法

BeginTrans(long *TransactionLevel)
CommitTrans(void)
RollbackTrans(void)

Cancel(void)

Close(void)

Execute(BSTR CommandText, VARIANT *RecordsAffected, long Options,
_ADORecordset **ppiRset)

Open(BSTR ConnectionString, BSTR UserID, BSTR Password, long Options)

OpenSchema(SchemaEnum Schema, VARIANT Restrictions, VARIANT SchemaID,
 _ADORecordset **pprset)

屬性

get_Attributes(long *plAttr)
put_Attributes(long lAttr)

get_CommandTimeout(LONG *plTimeout)
put_CommandTimeout(LONG lTimeout)

get_ConnectionString(BSTR *pbstr)
put_ConnectionString(BSTR bstr)

get_ConnectionTimeout(LONG *plTimeout)
put_ConnectionTimeout(LONG lTimeout)

get_CursorLocation(CursorLocationEnum *plCursorLoc)
put_CursorLocation(CursorLocationEnum lCursorLoc)

get_DefaultDatabase(BSTR *pbstr)
put_DefaultDatabase(BSTR bstr)

get_IsolationLevel(IsolationLevelEnum *Level)
put_IsolationLevel(IsolationLevelEnum Level)

get_Mode(ConnectModeEnum *plMode)
put_Mode(ConnectModeEnum lMode)

get_Provider(BSTR *pbstr)
put_Provider(BSTR Provider)

get_State(LONG *plObjState)

get_Version(BSTR *pbstr)

get_Errors(ADOErrors **ppvObject)

事件

BeginTransComplete(LONG TransactionLevel, ADOError *pError,
EventStatusEnum *adStatus, _ADOConnection *pConnection)

CommitTransComplete(ADOError *pError, EventStatusEnum *adStatus,
_ADOConnection *pConnection)

ConnectComplete(ADOError *pError, EventStatusEnum *adStatus,
_ADOConnection *pConnection)

Disconnect(EventStatusEnum *adStatus, _ADOConnection *pConnection)

ExecuteComplete(LONG RecordsAffected, ADOError *pError,
EventStatusEnum *adStatus, _ADOCommand *pCommand,
_ADORecordset *pRecordset, _ADOConnection *pConnection)

InfoMessage(ADOError *pError, EventStatusEnum *adStatus,
_ADOConnection *pConnection)

RollbackTransComplete(ADOError *pError, EventStatusEnum *adStatus,
_ADOConnection *pConnection)

WillConnect(BSTR *ConnectionString, BSTR *UserID, BSTR *Password,
long *Options, EventStatusEnum *adStatus,
_ADOConnection *pConnection)

WillExecute(BSTR *Source, CursorTypeEnum *CursorType,
LockTypeEnum *LockType, long *Options,
EventStatusEnum *adStatus, _ADOCommand *pCommand,
_ADORecordset *pRecordset, _ADOConnection *pConnection)


_Command (ADO for VC++ 語法)

方法

Cancel(void);

CreateParameter(BSTR Name, DataTypeEnum Type,
ParameterDirectionEnum Direction, long Size, VARIANT Value,
_ADOParameter **ppiprm);

Execute(VARIANT *RecordsAffected, VARIANT *Parameters, long Options,
_ADORecordset **ppirs);

屬性

get_ActiveConnection(_ADOConnection **ppvObject);
put_ActiveConnection(VARIANT vConn);
putref_ActiveConnection(_ADOConnection *pCon);

get_CommandText(BSTR *pbstr);
put_CommandText(BSTR bstr);

get_CommandTimeout(LONG *pl);
put_CommandTimeout(LONG Timeout);

get_CommandType(CommandTypeEnum *plCmdType);
put_CommandType(CommandTypeEnum lCmdType);

get_Name(BSTR *pbstrName);
put_Name(BSTR bstrName);

get_Prepared(VARIANT_BOOL *pfPrepared);
put_Prepared(VARIANT_BOOL fPrepared);

get_State(LONG *plObjState);

get_Parameters(ADOParameters **ppvObject);


_Parameter (ADO for VC++ 語法)

方法

AppendChunk(VARIANT Val)

屬性

get_Attributes(LONG *plParmAttribs)
put_Attributes(LONG lParmAttribs)

get_Direction(ParameterDirectionEnum *plParmDirection)
put_Direction(ParameterDirectionEnum lParmDirection)

get_Name(BSTR *pbstr)
put_Name(BSTR bstr)

get_NumericScale(BYTE *pbScale)
put_NumericScale(BYTE bScale)

get_Precision(BYTE *pbPrecision)
put_Precision(BYTE bPrecision)

get_Size(long *pl)
put_Size(long l)

get_Type(DataTypeEnum *psDataType)
put_Type(DataTypeEnum sDataType)

get_Value(VARIANT *pvar)
put_Value(VARIANT val)


_Recordset (ADO for VC++ 語法)

方法

AddNew(VARIANT FieldList, VARIANT Values)

Cancel(void)

CancelBatch(AffectEnum AffectRecords)

CancelUpdate(void)

Clone(LockTypeEnum LockType, _ADORecordset **ppvObject)

Close(void)

CompareBookmarks(VARIANT Bookmark1, VARIANT Bookmark2,
CompareEnum *pCompare)

Delete(AffectEnum AffectRecords)

Find(BSTR Criteria, LONG SkipRecords, SearchDirectionEnum SearchDirection,
VARIANT Start)

GetRows(long Rows, VARIANT Start, VARIANT Fields, VARIANT *pvar)

GetString(StringFormatEnum StringFormat, long NumRows, BSTR ColumnDelimeter,
BSTR RowDelimeter, BSTR NullExpr, BSTR *pRetString)

Move(long NumRecords, VARIANT Start)

MoveFirst(void)

MoveLast(void)

MoveNext(void)

MovePrevious(void)

NextRecordset(VARIANT *RecordsAffected, _ADORecordset **ppiRs)

Open(VARIANT Source, VARIANT ActiveConnection, CursorTypeEnum CursorType,
LockTypeEnum LockType, LONG Options)

Requery(LONG Options)

Resync(AffectEnum AffectRecords, ResyncEnum ResyncValues)

Save(BSTR FileName, PersistFormatEnum PersistFormat)

Supports(CursorOptionEnum CursorOptions, VARIANT_BOOL *pb)

Update(VARIANT Fields, VARIANT Values)

UpdateBatch(AffectEnum AffectRecords)

內容

get_AbsolutePage(PositionEnum *pl)
put_AbsolutePage(PositionEnum Page)

get_AbsolutePosition(PositionEnum *pl)
put_AbsolutePosition(PositionEnum Position)

get_ActiveCommand(IDispatch **ppCmd)

get_ActiveConnection(VARIANT *pvar)
put_ActiveConnection(VARIANT vConn)
putref_ActiveConnection(IDispatch *pconn)

get_BOF(VARIANT_BOOL *pb)

get_Bookmark(VARIANT *pvBookmark)
put_Bookmark(VARIANT vBookmark)

get_CacheSize(long *pl)
put_CacheSize(long CacheSize)

get_CursorLocation(CursorLocationEnum *plCursorLoc)
put_CursorLocation(CursorLocationEnum lCursorLoc)

get_CursorType(CursorTypeEnum *plCursorType)
put_CursorType(CursorTypeEnum lCursorType)

get_DataMember(BSTR *pbstrDataMember)
put_DataMember(BSTR bstrDataMember)

get_DataSource(IUnknown **ppunkDataSource)
putref_DataSource(IUnknown *punkDataSource)

get_EditMode(EditModeEnum *pl)

get_EOF(VARIANT_BOOL *pb)

get_Filter(VARIANT *Criteria)
put_Filter(VARIANT Criteria)

get_LockType(LockTypeEnum *plLockType)
put_LockType(LockTypeEnum lLockType)

get_MarshalOptions(MarshalOptionsEnum *peMarshal)
put_MarshalOptions(MarshalOptionsEnum eMarshal)

get_MaxRecords(long *plMaxRecords)
put_MaxRecords(long lMaxRecords)

get_PageCount(long *pl)

get_PageSize(long *pl)
put_PageSize(long PageSize)

get_RecordCount(long *pl)

get_Sort(BSTR *Criteria)
put_Sort(BSTR Criteria)

get_Source(VARIANT *pvSource)
put_Source(BSTR bstrConn)
putref_Source(IDispatch *pcmd)

get_State(LONG *plObjState)

get_Status(long *pl)

get_StayInSync(VARIANT_BOOL *pbStayInSync)
put_StayInSync(VARIANT_BOOL bStayInSync)

get_Fields(ADOFields **ppvObject)

雜項

get_Collect(VARIANT Index, VARIANT *pvar)
put_Collect(VARIANT Index, VARIANT value)

事件

EndOfRecordset(VARIANT_BOOL *fMoreData, EventStatusEnum *adStatus,
_ADORecordset *pRecordset)

FetchComplete(ADOError *pError, EventStatusEnum *adStatus,
_ADORecordset *pRecordset)

FetchProgress(long Progress, long MaxProgress, EventStatusEnum *adStatus,
_ADORecordset *pRecordset)

FieldChangeComplete(LONG cFields, VARIANT Fields, ADOError *pError,
EventStatusEnum *adStatus, _ADORecordset *pRecordset)

MoveComplete(EventReasonEnum adReason, ADOError *pError,
EventStatusEnum *adStatus, _ADORecordset *pRecordset)

RecordChangeComplete(EventReasonEnum adReason, LONG cRecords,
ADOError *pError, EventStatusEnum *adStatus,
_ADORecordset *pRecordset)

RecordsetChangeComplete(EventReasonEnum adReason, ADOError *pError,
EventStatusEnum *adStatus, _ADORecordset *pRecordset)

WillChangeField(LONG cFields, VARIANT Fields, EventStatusEnum *adStatus,
_ADORecordset *pRecordset)

WillChangeRecord(EventReasonEnum adReason, LONG cRecords,
EventStatusEnum *adStatus, _ADORecordset *pRecordset)

WillChangeRecordset(EventReasonEnum adReason, EventStatusEnum *adStatus,
_ADORecordset *pRecordset)

WillMove(EventReasonEnum adReason, EventStatusEnum *adStatus,
_ADORecordset *pRecordset)


_Field (ADO for VC++ 語法)

方法

AppendChunk(VARIANT Data)

GetChunk(long Length, VARIANT *pvar)

屬性

get_ActualSize(long *pl)

get_Attributes(long *pl)
put_Attributes(long lAttributes)

get_DataFormat(IUnknown **ppiDF)
put_DataFormat(IUnknown *piDF)

get_DefinedSize(long *pl)
put_DefinedSize(long lSize)

get_Name(BSTR *pbstr)

get_NumericScale(BYTE *pbNumericScale)
put_NumericScale(BYTE bScale)

get_OriginalValue(VARIANT *pvar)

get_Precision(BYTE *pbPrecision)
put_Precision(BYTE bPrecision)

get_Type(DataTypeEnum *pDataType)
put_Type(DataTypeEnum DataType)

get_UnderlyingValue(VARIANT *pvar)

get_Value(VARIANT *pvar)
put_Value(VARIANT Val)


Error (ADO for VC++ 語法)

屬性

get_Description(BSTR *pbstr)

get_NativeError(long *pl)

get_Number(long *pl)

get_Source(BSTR *pbstr)

get_SQLState(BSTR *pbstr)


Collections (ADO for VC++ 語法)

參數

方法

Append(IDispatch *Object)

Delete(VARIANT Index)

get_Item(VARIANT Index, _ADOParameter **ppvObject)

Refresh(void)

屬性

get_Count(long *c)

欄位

方法

Append(BSTR bstrName, DataTypeEnum Type, long DefinedSize,
FieldAttributeEnum Attrib)

Delete(VARIANT Index)

get_Item(VARIANT Index, ADOField **ppvObject)

Refresh(void)

屬性

get_Count(long *c)

錯誤

方法

Clear(void)

get_Item(VARIANT Index, ADOError **ppvObject)

Refresh(void)

屬性

get_Count(long *c)


語法索引 (ADO/WFC)

《ADO 語言參考手冊》使用 Microsoft (R) Visual Basic (R) 程式語言來解說 ADO 方法及其屬性的語法。這個索引是以 Microsoft (R) Visual J++(TM) 為本的《ADO 語言參考手冊》及 ADO for Windows Foundation Classes (ADO/WFC) 的交互參照資料。

當產生語法的差異時，請使用此索引內的函數簽名對照語言參照主題的語法清單。

下面列出方法及屬性的語法的基本元件:

ActiveX 資料物件

  • Collections (Parameters, Fields, Errors)

  • Command 物件

  • Connection 物件

  • Error 物件

  • Field 物件

  • Parameter 物件

  • Recordset 物件

Remote Data Service

  • DataSpace

  • ObjectProxy


Connection (ADO/WFC 語法)

package com.ms.wfc.data

Constructor

public Connection()
public Connection(String connectionstring)

方法

public int beginTrans()
public void commitTrans()
public void rollbackTrans()

public void cancel()

public void close()

public com.ms.wfc.data.Recordset execute(String commandText)
public com.ms.wfc.data.Recordset execute(String commandText, int options)

public int executeUpdate(String commandText)
public int executeUpdate(String commandText, int options)

public void open()
public void open(String connectionString)
public void open(String connectionString, String userID)
public void open(String connectionString, String userID, String password)
public void open(String connectionString, String userID, String password, int options)

public Recordset openSchema(int schema, Object[] restrictions, String schemaID)
public Recordset openSchema(int schema)
public Recordset openSchema(int schema, Object[] restrictions)

屬性

public int getAttributes()
public void setAttributes(int attr)

public int getCommandTimeout()
public void setCommandTimeout(int timeout)

public String getConnectionString()
public void setConnectionString(String con)

public int getConnectionTimeout()
public void setConnectionTimeout(int timeout)

public int getCursorLocation()
public void setCursorLocation(int cursorLoc)

public String getDefaultDatabase()
public void setDefaultDatabase(String db)

public int getIsolationLevel()
public void setIsolationLevel(int level)

public int getMode()
public void setMode(int mode)

public String getProvider()
public void setProvider(String provider)

public int getState()

public String getVersion()

public AdoProperties getProperties()

public com.ms.wfc.data.Errors getErrors()

事件

如需關於 ADO/WFC 事件的詳細資訊，請參閱 ADO/WFC 的 ADO 事件.

public void addOnBeginTransComplete(ConnectionEventHandler handler)
public void removeOnBeginTransComplete(ConnectionEventHandler handler)

public void addOnCommitTransComplete(ConnectionEventHandler handler)
public void removeOnCommitTransComplete(ConnectionEventHandler handler)

public void addOnConnectComplete(ConnectionEventHandler handler)
public void removeOnConnectComplete(ConnectionEventHandler handler)

public void addOnDisconnect(ConnectionEventHandler handler)
public void removeOnDisconnect(ConnectionEventHandler handler)

public void addOnExecuteComplete(ConnectionEventHandler handler)
public void removeOnExecuteComplete(ConnectionEventHandler handler)

public void addOnInfoMessage(ConnectionEventHandler handler)
public void removeOnInfoMessage(ConnectionEventHandler handler)

public void addOnRollbackTransComplete(ConnectionEventHandler handler)
public void removeOnRollbackTransComplete(ConnectionEventHandler handler)

public void addOnWillConnect(ConnectionEventHandler handler)
public void removeOnWillConnect(ConnectionEventHandler handler)

public void addOnWillExecute(ConnectionEventHandler handler)
public void removeOnWillExecute(ConnectionEventHandler handler)


Command (ADO/WFC 語法)

package com.ms.wfc.data

Constructor

public Command()
public Command(String commandtext)

方法

public void cancel()

public com.ms.wfc.data.Parameter createParameter(String Name, int Type, int Direction, int Size, Object Value)

public Recordset execute()
public Recordset execute(Object[] parameters)
public Recordset execute(Object[] parameters, int options)

public int executeUpdate(Object[] parameters)
public int executeUpdate(Object[] parameters, int options)
public int executeUpdate()

屬性

public com.ms.wfc.data.Connection getActiveConnection()
public void setActiveConnection(com.ms.wfc.data.Connection con)
public void setActiveConnection(String conString)

public String getCommandText()
public void setCommandText(String command)

public int getCommandTimeout()
public void setCommandTimeout(int timeout)

public int getCommandType()
public void setCommandType(int type)

public String getName()
public void setName(String name)

public boolean getPrepared()
public void setPrepared(boolean prepared)

public int getState()

public com.ms.wfc.data.Parameter getParameter(int n)
public com.ms.wfc.data.Parameter getParameter(String n)

public com.ms.wfc.data.Parameters getParameters()

public AdoProperties getProperties()


參數 (ADO/WFC 語法)

Parameter (ADO/WFC 語法)

package com.ms.wfc.data

Constructor

public Parameter()
public Parameter(String name)
public Parameter(String name, int type)
public Parameter(String name, int type, int dir)
public Parameter(String name, int type, int dir, int size)
public Parameter(String name, int type, int dir, int size, Object value)

方法

public void appendChunk(byte[] bytes)
public void appendChunk(char[] chars)
public void appendChunk(String chars)

屬性

public int getAttributes()
public void setAttributes(int attr)

public int getDirection()
public void setDirection(int dir)

public String getName()
public void setName(String name)

public int getNumericScale()
public void setNumericScale(int scale)

public int getPrecision()
public void setPrecision(int prec)

public int getSize()
public void setSize(int size)

public int getType()
public void setType(int type)

public com.ms.com.Variant getValue()
public void setValue(Object v)

public AdoProperties getProperties()

Parameter Accessor方法

透過 Parameter 物件的 Value 屬性，可取得或設定物件之資訊。這些資訊以 VARIANT 來傳遞，而 VARIANT 是種可被設定成任何一種資料型態的物件。

ADO/WFC 以 getValue 方法來實作 Value 屬性，並返回 VARIANT 物件；同時也以 setValue 方法來設定該屬性，而 VARIANT 在此則被當作傳遞的引數。VARIANT 在某些裡面十分效率，例如 Microsoft Visual Basic。但是你也可以利用 Microsoft Visual J++ 的原始資料型別，以得到更好的效能。

除了 Value 屬性以外, ADO/WFC 也提供了 accessor 方法以存取 Java 資料型別的 Parameter 物件內資訊。其中大部分方法的名稱均以 get DataType 或 set DataType 為開頭。

有一個值得特別注意的事：它沒有 getNull 屬性；但卻有 isNull 屬性 以一個布林返回值來表示該資料欄是否為空白 null。

public boolean getBoolean()
public void setBoolean(boolean v)

public byte getByte()
public void setByte(byte v)

public double getDouble()
public void setDouble(double v)

public float getFloat()
public void setFloat(float v)

public int getInt()
public void setInt(int v)

public long getLong()
public void setLong(long v)

public short getShort()
public void setShort(short v)

public String getString()
public void setString(String v)

public boolean isNull()
public void setNull()


Recordset (ADO/WFC 語法)

package com.ms.wfc.data

建構元

public Recordset()
public Recordset(Object r)

方法

public void addNew(Object[] fieldList, Object[] valueList)
public void addNew(Object[] valueList)
public void addNew()

public void cancel()

public void cancelBatch(int affectRecords)
public void cancelBatch()

public void cancelUpdate()

public Object clone()
public Object clone(int lockType)

public void close()

public int compareBookmarks(Object bookmark1, Object bookmark2)

public void delete(int affectRecords)
public void delete()

public void find(String criteria)
public void find(String criteria, int SkipRecords)
public void find(String criteria, int SkipRecords, int searchDirection)
public void find(String criteria, int SkipRecords, int searchDirection, Object bmkStart)

public Object[][] getRows(int Rows, Object bmkStart, Object[] fieldList)

public void move(int numRecords)
public void move(int numRecords, Object bmkStart)

public void moveFirst()
public void moveLast()
public void moveNext()
public void movePrevious()

public Recordset nextRecordset()
public Recordset nextRecordset(int[] recordsAffected)

public void open()
public void open(Object source)
public void open(Object source, Object activeConnection)
public void open(Object source, Object activeConnection, int cursorType)
public void open(Object source, Object activeConnection, int cursorType,
int lockType)
public void open(Object source, Object activeConnection, int cursorType,
int lockType, int options)

public void requery()
public void requery(int options)

public void resync()
public void resync(int affectRecords, int resyncValues)

public void save(String fileName)
public void save(String fileName, int persistFormat)

public boolean supports(int cursorOptions)

public void update()
public void update(Object[] valueList)
public void update(Object[] fieldList, Object[] valueList)

public void updateBatch()
public void updateBatch(int affectRecords)

屬性

public int getAbsolutePage()
public void setAbsolutePage(int page)

public int getAbsolutePosition()
public void setAbsolutePosition(int pos)

public Command getActiveCommand()

public Connection getActiveConnection()
public void setActiveConnection(String conn)
public void setActiveConnection(com.ms.wfc.data.Connection c)

public boolean getBOF()

public boolean getEOF()

public Object getBookmark()
public void setBookmark(Object bmk)

public int getCacheSize()
public void setCacheSize(int size)

public int getCursorLocation()
public void setCursorLocation(int cursorLoc)

public int getCursorType()
public void setCursorType(int cursorType)

public String getDataMember()
public void setDataMember(String pbstrDataMember)

public Iunknown getDataSource()
public void setDataSource(IUnknown dataSource)

public int getEditMode()

public Object getFilter()
public void setFilter(Object filter)

public int getLockType()
public void setLockType(int lockType)

public int getMarshalOptions()
public void setMarshalOptions(int options)

public int getMaxRecords()
public void setMaxRecords(int maxRecords)

public int getPageCount()

public int getPageSize()
public void setPageSize(int pageSize)

public int getRecordCount()

public String getSort()
public void setSort(String criteria)

public String getSource()
public void setSource(String query)
public void setSource(com.ms.wfc.data.Command command)

public int getState()

public int getStatus()

public boolean getStayInSync()
public void setStayInSync(boolean pbStayInSync)

public com.ms.wfc.data.Field getField(int n)
public com.ms.wfc.data.Field getField(String n)

public com.ms.wfc.data.Fields getFields()

public AdoProperties getProperties()

事件

For more information about ADO/WFC events, see ADO Events in ADO/WFC.

public void addOnEndOfRecordset(RecordsetEventHandler handler)
public void removeOnEndOfRecordset(RecordsetEventHandler handler)

public void addOnFetchComplete(RecordsetEventHandler handler)
public void removeOnFetchComplete(RecordsetEventHandler handler)

public void addOnFetchProgress(RecordsetEventHandler handler)
public void removeOnFetchProgress(RecordsetEventHandler handler)

public void addOnFieldChangeComplete(RecordsetEventHandler handler)
public void removeOnFieldChangeComplete(RecordsetEventHandler handler)

public void addOnMoveComplete(RecordsetEventHandler handler)
public void removeOnMoveComplete(RecordsetEventHandler handler)

public void addOnRecordChangeComplete(RecordsetEventHandler handler)
public void removeOnRecordChangeComplete(RecordsetEventHandler handler)

public void addOnRecordsetChangeComplete(RecordsetEventHandler handler)
public void removeOnRecordsetChangeComplete(RecordsetEventHandler handler)

public void addOnWillChangeField(RecordsetEventHandler handler)
public void removeOnWillChangeField(RecordsetEventHandler handler)

public void addOnWillChangeRecord(RecordsetEventHandler handler)
public void removeOnWillChangeRecord(RecordsetEventHandler handler)

public void addOnWillChangeRecordset(RecordsetEventHandler handler)
public void removeOnWillChangeRecordset(RecordsetEventHandler handler)

public void addOnWillMove(RecordsetEventHandler handler)
public void removeOnWillMove(RecordsetEventHandler handler)


Field (ADO/WFC 語法)

package com.ms.wfc.data

方法

public void appendChunk(byte[] bytes)
public void appendChunk(char[] chars)
public void appendChunk(String chars)

public byte[] getByteChunk(int len)
public char[] getCharChunk(int len)
public String getStringChunk(int len)

屬性

public int getActualSize()

public int getAttributes()
public void setAttributes(int pl)

public com.ms.com.IUnknown getDataFormat()
public void setDataFormat(com.ms.com.IUnknown format)
(For more information, see the Microsoft Visual J++ WFC Reference documentation for the com.ms.wfc.data.IDataFormat interface.)

public int getDefinedSize()
public void setDefinedSize(int pl)

public String getName()

public int getNumericScale()
public void setNumericScale(byte pbNumericScale)

public Variant getOriginalValue()

public int getPrecision()
public void setPrecision(byte pbPrecision)

public int getType()
public void setType(int pDataType)

public Variant getUnderlyingValue()

public Variant getValue()
public void setValue(Variant value)

public AdoProperties getProperties()

Field Accessor方法

利用 Field 物件的 Value 屬性，便可取得或設定該物件內的資訊。這些資訊以 VARIANT 來傳遞，而 VARIANT是種可被設定成任何一種資料型態的物件。

ADO/WFC 以 getValue 方法來實作 Value 屬性，並傳回 VARIANT 物件；同時也以 setValue 方法來設定該屬性，而 VARIANT 在此則被當作傳遞的引數。VARIANT 在某些裡面十分效率，例如 Microsoft Visual Basic。但是你也可以利用 Microsoft Visual J++ 的原始資料型別，以得到更好的效能。

除了 Value 屬性以外，ADO/WFC 也提供了 accessor 方法，以存取 Java 資料型別的 Parameter 物件內資訊。其中大部分方法的名稱均以 get DataType 或 set DataType 為開頭。

有兩件值得特別注意的事：第一 getObject 方法強制返回一指定的物件。第二，它沒有 getNull 屬性；但卻有 isNull 屬性，以一個布林返回值來表示該資料欄是否為空白 null。

public native boolean getBoolean();
public void setBoolean(boolean v)

public native byte getByte();
public void setByte(byte v)

public native byte[] getBytes();
public void setBytes(byte[] v)

public native double getDouble();
public void setDouble(double v)

public native float getFloat();
public void setFloat(float v)

public native int getInt();
public void setInt(int v)

public native long getLong();
public void setLong(long v)

public native short getShort();
public void setShort(short v)

public native String getString();
public void setString(String v)

public native boolean isNull();
public void setNull()

public Object getObject()
public Object getObject(Class c)
public void setObject(Object value)


Error (ADO/WFC 語法)

package com.ms.wfc.data

屬性

public String getDescription()

public int getNativeError()

public int getNumber()

public String getSource()

public String getSQLState()


Collections (ADO/WFC 語法)

package com.ms.wfc.data

參數

方法

public void append(com.ms.wfc.data.Parameter param)

public void delete(int n)
public void delete(String s)

public void refresh()

public Parameter getItem(int n)
public Parameter getItem(String s)

屬性

public int getCount()

Field

方法

public void append(String name, int type)
public void append(String name, int type, int definedSize)
public void append(String name, int type, int definedSize, int attrib)

public void delete(int n)
public void delete(String s)

public void refresh()

public com.ms.wfc.data.Field getItem(int n)
public com.ms.wfc.data.Field getItem(String s)

屬性

public int getCount()

Error

方法

public void clear()

public void refresh()

public com.ms.wfc.data.Error getItem(int n)
public com.ms.wfc.data.Error getItem(String s)

屬性

public int getCount()


DataSpace (ADO/WFC 語法)

ADO/WFC DataSpace 類別有一種方法 - createObject，它會指定伺服器和通訊協定、伺服器物件來處理用戶端應用程式要求，以及傳回一個代表伺服器的 ObjectProxy 物件。

package com.ms.wfc.data

建構元

public DataSpace()

方法

public static ObjectProxy DataSpace. createObject(String progid, String connection)

屬性

public static int getInternetTimeout()
public static void setInternetTimeout(int plInetTimeout)


ObjectProxy (ADO/WFC 語法)

ObjectProxy物件代表伺服器，它是由 DataSpace 物件的createObject 方法傳回的。ObjectProxy類別有一個方法 - call，它可以啟動伺服器上的方法，然後傳回產生的物件。

package com.ms.wfc.data

Methods

Call Method (ADO/WFC 語法)

啟動伺服器 (由 ObjectProxy 代表) 上的方法。視情況而定，方法引數可以當成物件陣列傳送。

語法

public Object ObjectProxy.call( String method )
public Object ObjectProxy.call( String method, Object[] args)

傳回

Object 啟動方法後產生的物件。

參數

ObjectProxy 代表伺服器的 ObjectProxy 物件。

method 字串，包含用於啟動伺服器上的方法名稱。

args 選用。物件陣列是伺服器上方法的引數。Java 資料類型會自動轉換成適用於伺服器的資料類型。


AdoEnums (ADO/WFC語法)

欲使用AdoEnums，請指定完整的 enumerated 常數名稱。例如， AdoEnums.Schema類別中的第一個常數是 AdoEnums.Schema.PROVIDERSPECIFIC。

每一個主題會列出常數的值。不過，請使用常數名稱，而不要使用值。值會依照不同的版本而變更。

內含3個行首的表格分別說明核心 ADO 文件。

  • 主題 此行首是 ADO 文件主題的連結，會在此說明列舉的值。

  • 字首 ADO/WFC 列舉的常數名稱會從 ADO 的相對物件取得，不過，當您閱讀ADO文件時，可能無法正確明白相對的 ADO 常數。

    ADO/WFC 常數中最後的定位項是一種全部英文大寫的識別字。ADO 常數是由字首、英文大小寫混合的識別字所組成的。

    例如，ADO/WFC 常數的對等值為 AdoEnums.Schema.PROVIDERSPECIFIC，就是 ADO常數 - adSchemaProviderSpecific。在這種狀況下字首adSchema會放在識別字 ProviderSpecific 的前面。

    這個行首會列出您應該加到 ADO/WFC 識別的字首，以便產生 ADO 列舉之常數的名稱。

  • 宣告 ADO COM 介面檔案會宣告每一組的列舉值。行首會顯示宣告的名稱。

    COM宣告的名稱可以將ENUM加到第二個識別字的字尾，就可以從 ADO/WFC 常數取得。例如，與 AdoEnums.Schema.* 產生關聯的 COM 宣告，會被命名為 SchemaEnum。

下面是定義在 ADO/WFC 的列舉。

AdcPropAsyncThreadPriority | DataType | ObjectState
AdcPropUpdateCriteria | EditMode | ParameterAttributes
Affect | ErrorValue | ParameterDirection
Bookmark | EventReason | PersistFormat
CommandType | EventStatus | Position
Compare | ExecuteOption | PropertyAttributes
ConnectMode | FieldAttribute | RecordStatus
ConnectOption | FilterGroup | Resync
ConnectPrompt | GetRowsOption | Schema
CursorLocation | IsolationLevel | SearchDirection
CursorOption | LockType | StringFormat
CursorType | MarshalOptions | XactAttribute


AdoEnums.AdcPropAsyncThreadPriority.*

package com.ms.wfc.data

主題 以 RDS Recordset 物件而言，請指定可以取得資料的非同步執行緒優先順序。請將這些常數之動態屬性適當用於 recordset "Background Thread Priority"。

字首 adPriority

宣告 ADCPROP_ASYNCTHREADPRIORITY_ENUM

常數 | 值
LOWEST | 1
BELOWNORMAL | 2
NORMAL | 3
ABOVENORMAL | 4
HIGHEST | 5


AdoEnums.AdcPropUpdateCriteria.*

package com.ms.wfc.data

主題 請指定哪些欄位要用來偵測當透過 RDS Recordset物件進行資料來源列最佳化更新時，所產生的衝突。常數會指定如果 Key 欄位已經變更 (也就是資料來源列已經刪除)，資料來源列任何欄位變更、資料來源列更新的欄位與 recordset 更新的欄位相同，或者如果資料來源列只是被存取而已，此時就應該偵測是否發生衝突。請將這些常數適當動態用於 "Update Criteria"。

字首 adCriteria

宣告 ADCPROP_UPDATECRITERIA_ENUM

常數 | 值
KEY | 0
ALLCOLS | 1
UPDCOLS | 2
TIMESTAMP | 3


AdoEnums.Affect.*

package com.ms.wfc.data

主題 UpdateBatch 方法

字首 adAffect

宣告 AffectEnum

常數 | 值
CURRENT | 1
GROUP | 2
ALL | 3
ALLCHAPTERS | 4


AdoEnums.Bookmark.*

package com.ms.wfc.data

主題 Find、GetRows、Move 方法

字首 adBookmark

宣告 BookmarkEnum

常數 | 值
CURRENT | 0
FIRST | 1
LAST | 2


AdoEnums.CommandType.*

package com.ms.wfc.data

主題 CommandType 屬性

字首 adCmd

宣告 CommandTypeEnum

常數 | 值
UNSPECIFIED | -1
UNKNOWN | 8
TEXT | 1
TABLE | 2
STOREDPROC | 4
FILE | 256
TABLEDIRECT | 512


AdoEnums.Compare.*

package com.ms.wfc.data

主題 CompareBookmarks 方法

字首 adCompare

宣告 CompareEnum

常數 | 值
LESSTHAN | 0
EQUAL | 1
GREATERTHAN | 2
NOTEQUAL | 3
NOTCOMPARABLE | 4


AdoEnums.ConnectMode.*

package com.ms.wfc.data

主題 Mode 屬性

字首 adMode

宣告 ConnectModeEnum

常數 | 值
UNKNOWN | 0
READ | 1
WRITE | 2
READWRITE | 3
SHAREDENYREAD | 4
SHAREDENYWRITE | 8
SHAREEXCLUSIVE | 12
SHAREDENYNONE | 16


AdoEnums.ConnectOption.*

package com.ms.wfc.data

主題 Connect.Open 方法 (參照為 OpenOptionEnum)

字首 ad

宣告 ConnectOptionEnum

常數 | 值
CONNECTUNSPECIFIED | -1
ASYNCCONNECT | 16


AdoEnums.ConnectPrompt.*

package com.ms.wfc.data

主題 指定當連接至 ODBC 資料來源時，是否顯示對話方塊來提示遺失的參數。常數會指定是否永遠提示、需要詳細資訊時才提示、需要詳細資訊但不允許選用的參數時才提示，或者永遠不提示。請將這些參數之動態屬性適當用於連接 “Prompt”。

字首 adPrompt

宣告 ConnectPromptEnum

常數 | 值
ALWAYS | 1
COMPLETE | 2
COMPLETEREQUIRED | 3
NEVER | 4


AdoEnums.CursorLocation.*

package com.ms.wfc.data

主題 CursorLocation 屬性

字首 adUse

宣告 CursorLocationEnum

常數 | 值
NONE | 1
SERVER | 2
CLIENT | 3


AdoEnums.CursorOption.*

package com.ms.wfc.data

主題 Supports 方法

字首 ad

宣告 CursorOptionEnum

常數 | 值
HOLDRECORDS | 256
MOVEPREVIOUS | 512
ADDNEW | 16778240
DELETE | 16779264
UPDATE | 16809984
BOOKMARK | 8192
APPROXPOSITION | 16384
UPDATEBATCH | 65536
RESYNC | 131072
NOTIFY | 262144
FIND | 524288


AdoEnums.CursorType.*

package com.ms.wfc.data

主題 CursorType 屬性

字首 adOpen

宣告 CursorTypeEnum

常數 | 值
UNSPECIFIED | -1
FORWARDONLY | 0
KEYSET | 1
DYNAMIC | 2
STATIC | 3


AdoEnums.DataType.*

package com.ms.wfc.data

主題 Append 方法

字首 ad

宣告 DataTypeEnum

常數 | 值 | 常數 | 值 | 常數 | 值
EMPTY | 0 | DECIMAL | 14 | DBTIMESTAMP | 135
TINYINT | 16 | NUMERIC | 131 | BSTR | 8
SMALLINT | 2 | BOOLEAN | 11 | CHAR | 129
INTEGER | 3 | ERROR | 10 | VARCHAR | 200
BIGINT | 20 | USERDEFINED | 132 | LONGVARCHAR | 201
UNSIGNEDTINYINT | 17 | VARIANT | 12 | WCHAR | 130
UNSIGNEDSMALLINT | 18 | IDISPATCH | 9 | VARWCHAR | 202
UNSIGNEDINT | 19 | IUNKNOWN | 13 | LONGVARWCHAR | 203
UNSIGNEDBIGINT | 21 | GUID | 72 | BINARY | 128
SINGLE | 4 | DATE | 7 | VARBINARY | 204
DOUBLE | 5 | DBDATE | 133 | LONGVARBINARY | 205
CURRENCY | 6 | DBTIME | 134 | CHAPTER | 136


AdoEnums.EditMode.*

package com.ms.wfc.data

主題 EditMode 屬性

字首 adEdit

宣告 EditModeEnum

常數 | 值
NONE | 0
INPROGRESS | 1
ADD | 2
DELETE | 4


AdoEnums.ErrorValue.*

package com.ms.wfc.data

主題 ADO Error Codes

字首 adErr

宣告 ErrorValueEnum

常數 | 值 | 常數 | 值
INVALIDARGUMENT | 3001 | OBJECTOPEN | 3705
NOCURRENTRECORD | 3021 | PROVIDERNOTFOUND | 3706
ILLEGALOPERATION | 3219 | BOUNDTOCOMMAND | 3707
INTRANSACTION | 3246 | INVALIDPARAMINFO | 3708
FEATURENOTAVAILABLE | 3251 | INVALIDCONNECTION | 3709
ITEMNOTFOUND | 3265 | NOTREENTRANT | 3710
OBJECTINCOLLECTION | 3367 | STILLEXECUTING | 3711
OBJECTNOTSET | 3420 | OPERATIONCANCELLED | 3712
DATACONVERSION | 3421 | STILLCONNECTING | 3713
OBJECTCLOSED | 3704 | NOTEXECUTING | 3715
 |  | UNSAFEOPERATION | 3716


AdoEnums.EventReason.*

package com.ms.wfc.data

主題 WillMove、WillChangeRecord、WillChangeRecordset 方法

字首 adRsn

宣告 EventReasonEnum

常數 | 值 | 常數 | 值
ADDNEW | 1 | CLOSE | 9
DELETE | 2 | MOVE | 10
UPDATE | 3 | FIRSTCHANGE | 11
UNDOUPDATE | 4 | MOVEFIRST | 12
UNDOADDNEW | 5 | MOVENEXT | 13
UNDODELETE | 6 | MOVEPREVIOUS | 14
REQUERY | 7 | MOVELAST | 15
RESYNCH | 8 |  |


AdoEnums.EventStatus.*

package com.ms.wfc.data

主題 所有 ADO 事件

字首 adStatus

宣告 EventStatusEnum

常數 | 值
OK | 1
ERRORSOCCURRED | 2
CANTDENY | 3
CANCEL | 4
UNWANTEDEVENT | 5


AdoEnums.ExecuteOption.*

package com.ms.wfc.data

主題 Execute 方法

字首 ad

宣告 ExecuteOptionEnum

常數 | 值
UNSPECIFIED | -1
ASYNCEXECUTE | 16
ASYNCFETCH | 32
ASYNCFETCHNONBLOCKING | 64


AdoEnums.FieldAttribute.*

package com.ms.wfc.data

主題 Attribute 屬性

字首 adFld

宣告 FieldAttributeEnum

常數 | 值
UNSPECIFIED | -1
MAYDEFER | 2
UPDATABLE | 4
UNKNOWNUPDATABLE | 8
FIXED | 16
ISNULLABLE | 32
MAYBENULL | 64
LONG | 128
ROWID | 256
ROWVERSION | 512
CACHEDEFERRED | 4096


AdoEnums.FilterGroup.*

package com.ms.wfc.data

主題 Filter 屬性

字首 adFilter

宣告 FilterGroupEnum

常數 | 值
NONE | 0
PENDINGRECORDS | 1
AFFECTEDRECORDS | 2
FETCHEDRECORDS | 3
PREDICATE | 4
CONFLICTINGRECORDS | 5


AdoEnums.GetRowsOption.*

package com.ms.wfc.data

主題 GetRows 方法

字首 adGetRows

宣告 GetRowsOptionEnum

常數 | 值
REST | -1


AdoEnums.IsolationLevel.*

package com.ms.wfc.data

主題 IsolationLevel 屬性

字首 adXact

宣告 IsolationLevelEnum

常數 | 值
UNSPECIFIED | -1
CHAOS | 16
READUNCOMMITTED | 256
BROWSE | 256
CURSORSTABILITY | 4096
READCOMMITTED | 4096
REPEATABLEREAD | 65536
SERIALIZABLE | 1048576
ISOLATED | 1048576


AdoEnums.LockType.*

package com.ms.wfc.data

主題 LockType 屬性

字首 adLock

宣告 LockTypeEnum

常數 | 值
UNSPECIFIED | -1
READONLY | 1
PESSIMISTIC | 2
OPTIMISTIC | 3
BATCHOPTIMISTIC | 4


AdoEnums.MarshalOptions.*

package com.ms.wfc.data

主題 MarshalOptions 屬性

字首 adMarshal

宣告 MarshalOptionsEnum

常數 | 值
ALL | 0
MODIFIEDONLY | 1


AdoEnums.ObjectState.*

package com.ms.wfc.data

主題 State 屬性

字首 adState

宣告 ObjectStateEnum

常數 | 值
CLOSED | 0
OPEN | 1
CONNECTING | 2
EXECUTING | 4
FETCHING | 8


AdoEnums.ParameterAttributes.*

package com.ms.wfc.data

主題 Attribute 屬性

字首 adParam

宣告 ParameterAttributesEnum

常數 | 值
SIGNED | 16
NULLABLE | 64
LONG | 128


AdoEnums.ParameterDirection.*

package com.ms.wfc.data

主題 Direction 屬性

字首 adParam

宣告 ParameterDirectionEnum

常數 | 值
UNKNOWN | 0
INPUT | 1
OUTPUT | 2
INPUTOUTPUT | 3
RETURNVALUE | 4


AdoEnums.PersistFormat.*

package com.ms.wfc.data

主題 Save 方法

字首 adPersist

宣告 PersistFormatEnum

常數 | 值
ADTG | 0
XML | 1


AdoEnums.Position.*

package com.ms.wfc.data

主題 AbsolutePage 和 AbsolutePosition 屬性

字首 adPos

宣告 PositionEnum

常數 | 值
UNKNOWN | -1
BOF | -2
EOF | -3


AdoEnums.PropertyAttributes.*

package com.ms.wfc.data

主題 Attribute 屬性

字首 adProp

宣告 PropertyAttributesEnum

常數 | 值
NOTSUPPORTED | 0
REQUIRED | 1
OPTIONAL | 2
READ | 512
WRITE | 1024


AdoEnums.RecordStatus.*

package com.ms.wfc.data

主題 Status 屬性

字首 adRec

宣告 RecordStatusEnum

常數 | 值 | 常數 | 值
OK | 0 | CANTRELEASE | 1024
NEW | 1 | CONCURRENCYVIOLATION | 2048
MODIFIED | 2 | INTEGRITYVIOLATION | 4096
DELETED | 4 | MAXCHANGESEXCEEDED | 8192
UNMODIFIED | 8 | OBJECTOPEN | 16384
INVALID | 16 | OUTOFMEMORY | 32768
MULTIPLECHANGES | 64 | PERMISSIONDENIED | 65536
PENDINGCHANGES | 128 | SCHEMAVIOLATION | 131072
CANCELED | 256 | DBDELETED | 262144


AdoEnums.Resync.*

package com.ms.wfc.data

主題 Resync 方法

字首 adResync

宣告 ResyncEnum

常數 | 值
UNDERLYINGVALUES | 1
ALLVALUES | 2


AdoEnums.Schema.*

package com.ms.wfc.data

主題 OpenSchema 方法

字首 adSchema

宣告 SchemaEnum

常數 | 值 | 常數 | 值
PROVIDERSPECIFIC | -1 | STATISTICS | 19
ASSERTS | 0 | TABLES | 20
CATALOGS | 1 | TRANSLATIONS | 21
CHARACTERSETS | 2 | PROVIDERTYPES | 22
COLLATIONS | 3 | VIEWS | 23
COLUMNS | 4 | VIEWCOLUMNUSAGE | 24
CHECKCONSTRAINTS | 5 | VIEWTABLEUSAGE | 25
CONSTRAINTCOLUMNUSAGE | 6 | PROCEDUREPARAMETERS | 26
CONSTRAINTTABLEUSAGE | 7 | FOREIGNKEYS | 27
KEYCOLUMNUSAGE | 8 | PRIMARYKEYS | 28
REFERENTIALCONTRAINTS | 9 | PROCEDURECOLUMNS | 29
TABLECONSTRAINTS | 10 | DBINFOKEYWORDS | 30
COLUMNSDOMAINUSAGE | 11 | DBINFOLITERALS | 31
INDEXES | 12 | CUBES | 32
COLUMNPRIVILEGES | 13 | DIMENSIONS | 33
TABLEPRIVILEGES | 14 | HIERARCHIES | 34
USAGEPRIVILEGES | 15 | LEVELS | 35
PROCEDURES | 16 | MEASURES | 36
SCHEMATA | 17 | PROPERTIES | 37
SQLLANGUAGES | 18 | MEMBERS | 38


AdoEnums.SearchDirection.*

package com.ms.wfc.data

主題 Find 方法

字首 adSearch

宣告 SearchDirectionEnum

常數 | 值
FORWARD | 1
BACKWARD | -1


AdoEnums.StringFormat.*

package com.ms.wfc.data

主題 GetString 方法

字首 ad

宣告 StringFormatEnum

常數 | 值
CLIPSTRING | 2


AdoEnums.XactAttribute.*

package com.ms.wfc.data

主題 Attribute 屬性

字首 adXact

宣告 XactAttributeEnum

常數 | 值
COMMITRETAINING | 131072
ABORTRETAINING | 262144
ASYNCPHASEONE | 524288
SYNCPHASEONE | 1048576


Error Codes

This topic is under construction.

See the following topics for more information about particular error messages:

  • ADO Error Codes

  • RDS.DataControl Error Codes

  • Internet Explorer Error Codes

  • Internet Information Server Error Codes


ADO 錯誤代碼

除了在 Error 物件和 Error 集合物件中所提到的提供者錯誤訊息之外，ADO 本身也可以傳回錯誤訊息到執行中的例外事件處理機制。您可以使用程式語言所提供的錯誤擷取機制，像是 Microsoft (R) Visual Basic (R) On Error 引數，來擷取並處理下列的錯誤訊息。以下我們會把這些錯誤訊息的十進位和十六進位的值都列出來。

常數名稱 | 號碼 | 說明
adErrInvalidArgument | 3001 0x800A0BB9 | 應用程式所使用的引數可能有類型錯誤，或超過可接受的定義範圍，或與其他引數衝突。
adErrNoCurrentRecord | 3021 0x800A0BCD | 可能是 BOF 或 EOF 的值為 True，或目前的記錄已被刪除。應用程式所要求的操作需要目前的記錄。
adErrIllegalOperation | 3219 0x800A0C93 | 在這個範圍中不允許應用程式所要求的操作。
adErrInTransaction | 3246 0x800A0CAE | 當交易進行到一半時, 應用程式不能宣告關閉 Connection 物件。
adErrFeatureNotAvailable | 3251 0x800A0CB3 | 提供者不支援應用程式所要求的操作。
adErrItemNotFound | 3265 0x800A0CC1 | ADO 在應用程式所要求名稱或序數參照的相關集合中找不到物件。
adErrObjectInCollection | 3367 0x800A0D27 | 無法附加。物件已經在集合中。
adErrObjectNotSet | 3420 0x800A0D5C | 應用程式所參照的物件已經不再是一個正確的物件。
adErrDataConversion | 3421 0x800A0D5D | 應用程式目前操作所使用的值型態錯誤。
adErrObjectClosed | 3704 0x800A0E78 | 如果物件已經關閉了， 那應用程式所要求的操作是不被允許的。
adErrObjectOpen | 3705 0x800A0E79 | 如果物件已經開啟了， 那應用程式所要求的操作是不被允許的。
adErrProviderNotFound | 3706 0x800A0E7A | ADO 找不到指定的提供者。
adErrBoundToCommand | 3707 0x800A0E7B | 應用程式無法變更以 Command 為來源的 Recordset 物件的 ActiveConnection 屬性。
adErrInvalidParamInfo | 3708 0x800A0E7C | 應用程式定義 Parameter 的方式不適當。
adErrInvalidConnection | 3709 0x800A0E7D | 應用程式要求操作物件，但是所參照的物件已經關閉，或是參照的物件不再是正確的 Connection 物件。


RDS.DataControl 錯誤代碼

下表列出了 RDS.DataControl 物件傳回的錯誤代碼。以下我們將會把這些錯誤訊息的十進位和十六進位的值都列出來。

RDS.DataControl 錯誤代碼 | 號碼 | 說明
IDS_UpdatesFailed | 4098 0x800A1002 | 無法更新資料庫。
IDS_CantConnect | 4099 0x800A1003 | 無法連線到伺服器。
IDS_CantCreateObject | 4100 0x800A1004 | 無法建立 business 物件。
IDS_CantInvokeMethod | 4101 0x800A1005 | 無法呼叫方法來操作 business 物件。
IDS_CantFindDataspace | 4102 0x800A1006 | Dataspace 屬性不正確。
IDS_ObjectNotSafe | 4103 0x800A1007 | 這項操作未被標示為可安全用於 scripting 及初始化中。
IDS_RowsetNotUpdateable | 4104 0x800A1008 | 無法更新 Rowset。
IDS_BadInlineTablegram | 4105 0x800A1009 | Inline Tablegram 不正確。
IDS_InvalidADCClientVersion | 4106 0x800A1010 | RDS 用戶端版本不正確 - 用戶端的版本比伺服器還新。
IDS_AsyncPending | 4107 0x800A1011 | 在 async 操作擱置時，無法執行操作。
IDS_ResetInvalidField | 4108 0x800A1012 | 在 SortColumn 或 FilterColumn 中所指定的欄位並不存在。
IDS_RecordsetNotOpen | 4109 0x800A1013 | Recordset 不在開啟狀態。
IDS_InvalidParam | 4110 0x800A1014 | 一個以上的參數是不正確的。
IDS_UnexpectedError | 4351 0x800A10FF | 不可預期的錯誤。


Internet Explorer 錯誤代碼

下表列出了 Internet Explorer 所傳回來的錯誤代碼，這些錯誤代碼與 Remote Data Service 相關。以下我們將會把這些錯誤訊息的十進位和十六進位的值都列出來。

Internet Explorer (Wininet) 錯誤代碼 | 號碼 | 說明
IDS_WinInet_Error | 8193 0x800A2001 | Internet 用戶端錯誤。
IDS_WinInet_Timeout | 8194 0x800A2002 | Internet 用戶端錯誤: 要求等候逾時。
IDS_WinInet_CantConnect | 8195 0x800A2003 | Internet 用戶端錯誤: 無法連線到伺服器。
IDS_WinInet_SSLPostLimitation | 8196 0x800A2004 | Internet 用戶端錯誤: SSL 錯誤 (可能是 32K 資料上載的限制)
IDS_WinInet_InvalidServerResponse | 8430 0x800A20EE | Internet 用戶端錯誤: 何服器的回應不正確。
IDS_WinInet_ConnectionReset | 12031 0x800A2EFF | Internet 用戶端錯誤: 連線重設。


Internet Information Server 錯誤代碼

下表列出了 Internet Information Server 所傳回來的錯誤代碼，這些錯誤代碼與 Remote Data Service 相關。以下我們將會把這些錯誤訊息的十進位和十六進位的值都列出來。

Internet Information Server 錯誤代碼 | 號碼 | 說明
IDS_IIS_AccessDenied | 8208 0x800A2010 | Internet 伺服器錯誤：拒絕存取。
IDS_IIS_ObjectNotFound | 8209 0x800A2011 | Internet 伺服器錯誤：物件/模組找不到。
IDS_IIS_RequestForbidden | 8210 0x800A2012 | Internet 伺服器錯誤：要求不被允許。
IDS_IIS_UnexpectedError | 8447 0x800A20FF | Internet 伺服器錯誤。


ADO 配置資訊

  • 若要允許對網路伺服器電腦的來賓特權

  • 若要註冊自訂的 Business 物件

  • 若要標示 Business 物件為 script 安全可用

  • 若要在用戶端註冊 Business 物件以搭配使用DCOM

  • 若要啟動一個 DLL 以在 DCOM 上執行

  • 若要瞭解有關 Microsoft Internet Explorer 安全性問題


允許對網路伺服器電腦的來賓特權

要允許對網路伺服器電腦的來賓特權

  1. 在 Windows NT (R) 資料來源電腦上，按一下 [開始]，再指到 [程式集]，然後按一下 [系統管理工具]。

  2. 執行 [網域使用者管理員]。

  3. 從 [使用者] 功能表，按一下 [選擇網域]。輸入目前的電腦名稱然後按一下 [確定]。

  4. 在較低的視窗中，按二下 [來賓] 群組然後按一下 [新增] 來新增電腦名稱帳號，預設值是 IUSR_MYWEBSVR ( MYWEBSVR 是您網路伺服器的名稱)。


註冊自訂的 Business 物件

要透過網路伺服器成功地啟動自訂的 business 物件 (.dll 或 .exe)，business 物件的 ProgID 必須在此程序所解釋的註冊區中輸入。此 RDS 功能經由只執行已許可的執行檔來保護您網路伺服器的安全。預設的 business 物件，RDSServer.DataFactory，已經完整地註冊了。

要註冊自訂的 business 物件

  5. 指到 [開始] 然後按一下 [執行]。

  6. 鍵入 RegEdit 然後按一下 [確定]。

  7. 在註冊區編輯器中，巡覽至 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters\ADCLaunch 註冊區機碼。

  8. 選擇 ADCLaunch 機碼，然後從 [編輯] 功能表，指向 [新增] 然後按一下 [機碼]。

  9. 鍵入您自訂 business 物件的 ProgID 然後按一下 [輸入]。讓 [數值] 項目空白。


標示 Business 物件為 script 可安全使用

要協助確保一個安全的 Internet 環境，您需要標示任何以 RDS.DataSpace 物件的CreateObject 方法建立的 business 物件 為 " script 可安全使用"。您要在它們可以在DCOM 使用之前，在系統註冊區的使用權區域中標示它們。

要手動標示 business 物件成為 script 可安全使用，請建立包含下列文字副檔名為 .reg 的文字檔。下列兩個數目會啟動 script 可安全使用功能：

[HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]

[HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]

<MyActiveXGUID> 是您 business 物件的十六進位 GUID 數字。使用註冊區編輯器或是直接在 Windows Explorer 中按二下 .reg 檔案來儲存並合併它到您的註冊區中。

在 Microsoft (R) Visual Basic (R) 中使用 Package and Deployment 精靈建立的 Business 物件可以被自動標示為 "script 可安全使用"。當精靈要求您指定安全設定值時，請選擇 [可安全地初始化] 與 [script 可安全使用]。

在最後一個步驟，應用程式設定精靈會建立一個 .htm 與一個 .cab 檔案。然後您可以複製這兩個檔案到目的電腦，再按二下 .htm 檔案來載入網頁並正確註冊伺服器。

因為依預設 business 物件將被安裝在 Windows\System32\Occache 目錄，您必須移動它到 Windows\System32 directory 並且變更 HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\InprocServer32 註冊區機碼以符合正確的路徑。


在用戶端註冊 Business 物件以搭配使用DCOM

自訂 business 物件 需要確保用戶端可以對一個可被透過 DCOM 使用的識別項 (CLSID)，對應它們的程式名稱 (ProgId)。針對此理由，DCOM 物件的 ProgID 必須在用戶端的註冊區中，並且對應於伺服器端物件的類別 ID。對其他支援的通訊協定 (HTTP、HTTPS 與 in-Process)，這是不需要的。

例如，若您以一個特定的類別 ID 接觸一個稱為 MyBObj 的伺服器端 business 物件，例如 "{00112233-4455-6677-8899-00AABBCCDDEE}", 您必須確定下列項目會被新增到用戶端註冊區中：

[HKEY_CLASSES_ROOT]
\MyBObj
    \Clsid
    (Default) "{00112233-4455-6677-8899-00AABBCCDDEE}"

DCOM Stream Marshaling

使用 RDS 1.5 或更之前元件的用戶端電腦與使用 RDS 2.0 元件的伺服器不相容。較新的 RDS 2.0 支援在傳送 Recordset 物件上更有效率。若發生此情況，您可以設定您的伺服器使用較舊的RDS 支援 ( RDS 1.0) 或較新的 RDS 支援 (RDS 2.0)。同時設定下列的註冊區項目：

[HKEY_CLASSES_ROOT]
\CLSID
    \[58ECEE30-E715-11CF-B0E3-00AA003F000F}
        \ADTGOptions]"MarshalFormat"="RDS10"

-或-

[HKEY_CLASSES_ROOT]
\CLSID
    \[58ECEE30-E715-11CF-B0E3-00AA003F000F}
        \ADTGOptions]"MarshalFormat"="RDS20"


啟動一個 DLL 以在 DCOM 上執行

下列步驟簡述如何啟動 business 物件 .dll 透過 Microsoft (R) Transaction Server 來使用 DCOM 與 Microsoft (R) Internet Information Server (HTTP)。

  10. 在 Transaction Server Explorer 中建立一個新的空包裝。

    您將使用 Transaction Server Explorer 來建立一個包裝檔並新增 DLL 到此包裝中。這可讓 .dll 透過 DCOM 存取，但它會透過 IIS 移除可存取性。(如果您檢查 .dll 的註冊區，Inproc 機碼現在是空的；設定啟動屬性，這稍後會在此主題中解釋，在 Inproc 機碼中新增一個值。)

  11. 安裝 business 物件到包裝中。

    -或-

    匯入 RDSServer.DataFactory 物件到包裝中。

  12. 設定元件的啟動屬性為 In the creator's process。

    要讓在同一部電腦的 .dll 能透過 DCOM 與 IIS 存取，您必須在 Microsoft Transaction Server Explorer 中設定電腦的啟動屬性。在您設定屬性為 In the creator's process後，您將注意到一個在註冊區中的 Inproc 伺服器機碼已被新增到指向 Microsoft Transaction Server 的代理 .dll 中。

    請參閱 若需關於 Transaction Server 與如何執行這些步驟的更多資訊，請瀏覽 Transaction Server 網站，在 http://www.microsoft.com/transaction/ 或參考 Microsoft Transaction Server 文件。


Microsoft Internet Explorer 安全性問題

將新的安全性增強功能新增至 Microsoft_ Internet Explorer，某些 ADO 與 RDS 物件會被註冊成只能在「安全」模式下執行。因此您必須注意這些包括不同區域、安全層級、限的行為、不安全的作業、與自訂安全設定等問題。

若需更多有關這些問題的資訊，請參見位於 www.microsoft.com/data/techmat.htm 網站上標題為 "Security Issues in Microsoft Internet Explorer" 的白皮書。


ADO Glossary

ADO 詞彙

ADISAPI

加總函數

別名

apartment 執行緒

非同步作業

business 物件

business 規則

child

類別 ID (CLSID)

用戶端層

元件物件模式 (COM)

元件

連接集區化

資料指標

資料提供者

資料來源

資料來源層

可聯繫資料的控制項

DCOM

設計階段

DLL (動態連結程式庫)

中斷的 recordset

動態屬性

事件

事件處理常式

grandchild 加總

ISAPI

分散

Microsoft Transaction Server

中間層

MIME

物件變數

ODBC

參數化指令

parent

parent-child 關係

保留

proxy

recordset

Remote Data Service

rowset

執行階段

服務元件

服務提供者

單執行緒式控制項

stub

tablegram

Variant

網路伺服器


Microsoft ADO 擴充 - DDL 和安全性 (ADOX) 程式設計師參考手冊

Microsoft ADO 擴充 - DDL 和安全性 (ADOX) 程式程式人員參考手冊

Microsoft_ ActiveX_ 資料物件擴充 - 資料定義語言和安全性 (Microsoft_ ActiveX_ Data Objects Extensions for Data Definition Language and Security，ADOX) 是 ADO 物件和程式設計模型的擴充。其中包括用來建立和修改結構敘述的物件，以及安全性物件。由於它是一種以物件為基礎的結構敘述操作方式，因此您撰寫的程式碼能面對各種不同的資料來源，而不會受到它們的原始語法的影響。

ADOX 是核心 ADO 物件的同伴程式庫。它提供了用來建立、修改和刪除結構敘述物件的其它物件，例如表格和程序。其中還包括安全性物件，用以維護使用者和群組，以及授與和撤回物件的使用權限。

如果要在您的開發工具內使用 ADOX，您應該先引用 ADOS 型態程式庫。ADOX 程式庫的說明是 "Microsoft ADO Ext. for DDL and Security"。ADOX 程式庫的檔案名稱是 Msadox.dll，程式 ID (ProgID) 是 "ADOX"。如果需要有關引用程式庫的詳細資訊，請參閱開發工具的說明文件。

Microsoft OLE DB Provider for the Microsoft Jet Database Engine 能夠充分支援 ADOX。如果您使用其它資料提供者，可能無法支援某些 ADOX 功能。如果需要有關 Microsoft OLE DB Provider for ODBC、Microsoft OLE DB Provider for Oracle 或 Microsoft SQL Server OLE DB Provider 所支援之特性的詳細資訊，請參閱 ADOX 讀我檔案。

這一份文件假設您具備 Microsoft(R) Visual Basic(R) 程式語言的操作知識，以及對於 ADO 的一般了解。如果需要 ADO 的詳細資訊，請參閱 ADO 程式設計師參考手冊。如果需要有關 ADOX 的其它概觀，請參閱下列主題：

  • ADOX 物件模型

  • ADOX 物件

  • ADOX 集合物件

  • ADOX 屬性

  • ADOX 方法

  • ADOX 範例


ADOX API Reference

ADOX API 參考資訊

此 ADOX 文件小節包含每一個 ADOX 物件的、集合物件、方法以及屬性的主題，另外並提供適當的範例。如需詳細資訊，請搜尋索引中的主題或參閱下列主題：

  • ADOX 物件

  • ADOX 集合物件

  • ADOX 方法

  • ADOX 屬性

  • ADOX 範例


ADOX 物件模式

下列圖表顯示這些物件在 ADOX 代表的項目和關係。如需關於特定物件或集合物件的詳細資訊，請參閱特定的參考主題或 ADOX 物件 和 ADOX 集合物件。

每一個 Table、Index 和 Column 物件也有標準的 ADO Properties 集合物件。


ADOX 物件

ADOX 物件摘要

物件 | 說明
Catalog | 包含集合物件，用以說明資料來源的結構敘述目錄。
Column | 代表表格、索引或鍵值的資料行。
Group | 代表群組帳戶，擁有存取安全資料庫的存取權限。
Index | 代表資料庫表格的索引。
Key | 代表資料庫表格的主要、外來或唯一鍵欄位。
Procedure | 代表儲存的程序。
Table | 代表資料庫表格、包含資料行、索引和鍵值。
User | 代表使用者帳戶，擁有安全資料庫的存取權限。
View | 代表過濾的記錄組或虛擬表格。

這些物件之間的關鍵可以從 ADOX 物件模式得知。

每一個物件可以包含在它的相對集合物件內。例如，Table 物件可以包含在 Tables 集合物件內。如需詳細資訊，請參閱 ADOX Collections 或特定的集合物件主題。


Catalog 物件 (ADOX)

Catalog 物件

包含集合物件 (表格、檢視、使用者、群組, 以及程序)，說明資料來源的結構敘述目錄。

備註

您可以新增或移除物件或修改現有的物件,就可以修改 Catalog 物件。部份提供者可能不支援所有的 Catalog 物件或者只支援檢視結構敘述資訊。

有了 Catalog 物件的屬性和方法之後，您可以：

  • 設定 ActiveConnection 屬性為 ADO Connection 物件或有效的連接字串，開啟目錄。

  • 使用 Create 方法來建立新目錄。

  • 使用 GetObjectOwner 和 SetObjectOwner 方法，判斷物件的擁有人。methods.


Column 物件 (ADOX)

Column 物件

代表表格、索引或鍵值的資料行。

備註

下列程式碼會建立新的 Column:

Dim obj As New Column

有了 Column 物件的屬性和方法之後，您可以：

  • 使用 Name 屬性識別資料行。

  • 使用 Type 屬性指定資料行的類型。

  • 使用 Attributes 屬性判斷資料行是否為固定長度或包含空值。

  • 使用 DefinedSize 屬性指定資料行的大小上限。

  • 至於數字資料值方面，請使用 NumericScale 屬性指定比率。

  • 至於數字資料值方面，請使用 Precision 屬性指定最高的精確度。

  • 使用 ParentCatalog 屬性指定擁有資料行的 Catalog。

  • 至於鍵值資料行方面，請使用 RelatedColumn 屬性指定相表格內的相對資料行名稱。

  • 至於索引資料行方面，請使用 SortOrder 屬性指定遞增或遞減排列順序。

  • 使用 Properties 集合物件存取提供者特有的屬性。


Group 物件 (ADOX)

Group 物件

代表擁有安全資料庫存取權限的群組帳戶。

備註

Catalog 的 Groups 集合物件代表所有目錄的群組帳戶。User 的 Groups 集合物件只代表使用者所屬的群組。

有了 Group 物件的屬性、集合物件和方法之後，您可以：

  • 使用 Name 屬性識別群組。

  • 使用 GetPermissions 和 SetPermissions 方法判斷群組是否擁有讀、寫或刪除權限。

  • 使用 Users 集合物件存取屬於群組的使用者帳戶。


Index 物件 (ADOX)

Index 物件

代表資料庫表格的索引。

備註

下列程式碼會建立新的索引：

Dim obj As New Index

有了 Index 物件的屬性和集合物件之後，您可以：

  • 使用 Name 屬性識別索引。

  • 使用 Columns 集合物件存取索引內的資料庫資料行。

  • 使用 Unique 屬性指定索引鍵是否必須唯一不可重複。

  • 使用 PrimaryKey 屬性指定索引是否為表格的主要鍵。

  • 使用 IndexNulls 屬性指定在索引欄位擁有 Null 值的記錄是否擁有索引項目。

  • 使用 Clustered 屬性指定索引是否叢集化。

  • 使用 ParentCatalog 屬性指定擁有索引的 Catalog。

  • 使用 Properties 集合物件存取提供者特有的索引屬性。

    注意 附加 Column 到 Index 的 Columns 集合物件時，若 Column 在已經附加到 Tables 集合物件的 Table 物件內找不到，就會發生錯誤。


Key 物件 (ADOX)

Key 物件

代表資料庫表格的主要、外來或唯一鍵。

備註

下列程式碼會鍵立新的 Key：

Dim obj As New Key

有了 key 物件的屬性和集合物件之後，您可以：

  • 使用 Name 屬性識別鍵值。

  • 使用 Type 屬性判斷鍵值是否為主要、外來或唯一鍵。

  • 使用 Columns 集合物件存取鍵值的資料庫資料行。

  • 使用 RelatedTable 屬性指定相關表格的名稱。

  • 使用 DeleteRule 和 UpdateRule 屬性定義刪除或更新主要鍵時會執行的動作。


Procedure 物件 (ADOX)

Procedure 物件

代表儲存的程序。用在 ADO Command 物件時，Procedure 物件可以用於編輯、刪除或修改儲存的程序。

備註

Procedure 物件可以讓您建立儲存的程序，而不需知道提供者的 "CREATE PROCEDURE" 語法。

有了 Procedure 物件的屬性之後，您可以：

  • 使用 Name 屬性識別程序。

  • 使用 Command 屬性指定可以用來建立或執行程序的 ADO Command 物件。

  • 使用 DateCreated 和 DateModified 屬性傳回日期資訊。


Table 物件 (ADOX)

Table 物件

代表包含資料行、索引和鍵值的資料庫表格。

備註

下列程式碼會建立新的 Table：

Dim obj As New Table

有了 Table 物件的屬性和集合物件之後，您可以：

  • 使用 Name 屬性識別表格。

  • 使用 Type 屬性判斷表格類型。

  • 使用 Columns 集合物件存取表格的資料庫資料行。

  • 使用 Indexes 集合物件存取表格的索引。

  • 使用 Keys 集合物件存取表格的鍵值。

  • 使用 ParentCatalog 屬性指定擁有表格的 Catalog。

  • 使用 DateCreated 和 DateModified 方法傳回日期資訊。

  • 使用 Properties 集合物件存取提供者特有的表格屬性。


User 物件 (ADOX)

User 物件

代表擁有安全資料庫存取權限的使用者帳戶。

備註

Catalog 的 Users 集合物件代表所有目錄的使用者。Group 的 Users 集合物件只代表特定群組的使用者。

有了 Users 物件的屬性、集合物件和方法之後，您可以：

  • 使用 Name 屬性識別使用者。

  • 使用 ChangePassword 方法變更使用者的密碼。

  • 使用 GetPermissions 和 SetPermissions 方法判斷使用者是否擁有讀、寫或刪除權限。

  • 使用 Groups 集合物件存取使用者所屬的群組。


View 物件 (ADOX)

View 物件

代表過濾的記錄集或虛擬表格。用於 ADO Command 物件時， View 物件可以用於新增、刪除或修改檢視。

備註

檢視是用其它資料庫表格或檢視而建立的虛擬表格。View 物件可以讓您建立檢視而不需要知道提供者的 "CREATE VIEW" 語法。

有了 View 物件的屬性之後，您可以：

  • 使用 Name 屬性識別檢視。

  • 使用 Command 屬性指定可以用來新增、刪除或修改檢視的 ADO Command 物件。

  • 使用 DateCreated 和 DateModified 屬性傳回日期資訊。


ADOX 集合物件

ADOX 集合物件總覽

集合物件 | 說明
Columns | 包含資料表、索引、或是索引鍵全部的 Column 物件。
Groups | 包含某個目錄或使用者全部已儲存的 Group 物件。
Indexes | 包含某個資料表全部的 Index 物件。
Keys | 包含某個資料表全部的 Key 物件。
Procedures | 包含某個目錄全部的 Procedure 物件。
Tables | 包含某個目錄全部的 Table 物件。
Users | 包含某個目錄或群組全部已儲存的 User 物件。
Views | 包含某個目錄全部的 View 物件。


Columns 集合物件 (ADOX)

Columns 集合物件

包含資料表、索引、或是索引鍵全部的 Column 物件。

說明

在 ADOX 語法裡，Columns 集合物件的 Append 方法僅有一種。您可以：

  • 使用 Append 方法將新增資料行加進集合物件裡去。

其餘的各種屬性與方法，皆是 ADO 集合物件的標準功能。您可以：

  • 使用 Item 方法來存取集合物件裡的某個資料行。

  • 使用 Count 屬性傳回已併入集合物件的資料行數目。

  • 使用 Delete 方法由集合物件移除某個資料行。

  • 使用 Refresh 方法來更新集合物件裡的物件，以反應目資料庫最新的結構敘述。

    請注意 如果某個 Column 不存在於一個已經附加在某個 Table 集合物件裡的 Table 物件內，在將這個 Column 附加到某個 Index 的 Columns 集合物件時，會發生錯誤。


Groups 集合物件 (ADOX)

Groups 集合物件

包含某個目錄或使用者全部已儲存的 Group 物件。

說明

某個 Catalog 的 Groups 集合物件，就代表目錄裡全部的群組帳號。而某位 User 的 Groups 集合物件，只代表使用者所屬的群組。

在 ADOX 語法裡，Groups 集合物件的 Append 方法僅有一種。您可以：

  • 使用 Append 方法將新增保全群組加進集合物件裡去。

其餘的各種屬性與方法，皆是 ADO 集合物件的標準功能。您可以：

  • 使用 Item 方法來存取集合物件裡的某個群組。

  • 使用 Count 屬性傳回已併入集合物件的群組數目。

  • 使用 Delete 方法由集合物件移除某個群組。

  • 使用 Refresh 方法來更新集合物件裡的物件，以反應目資料庫最新的結構敘述。

    請注意 在將 Group 物件附加到某個 User 物件的 Groups 集合物件之前，在 Catalog 的 Groups 集合物件裡，必須存有一個相同 Name 的 Group 物件。


Indexes 集合物件 (ADOX)

Indexes 集合物件

包含某個資料表全部的 Index 物件。

說明

在 ADOX 語法裡，Indexes 集合物件的 Append 方法僅有一種。您可以：

  • 使用 Append 方法將將新增索引加進集合物件裡去。

其餘的各種屬性與方法，皆是 ADO 集合物件的標準功能。您可以：

  • 使用 Item 方法來存取集合物件裡的某個索引。

  • 使用 Count 屬性傳回已併入集合物件的索引數目。

  • 使用 Delete 方法由集合物件移除某個索引。

  • 使用 Refresh 方法來更新集合物件裡的物件，以反應目資料庫最新的結構敘述。


Keys 集合物件 (ADOX)

Keys 集合物件

包含某個資料表全部的 Key 物件。

說明

在 ADOX 語法裡，Keys 集合物件的 Append 方法僅有一種。您可以：

  • 使用 Append 方法來將新增索引鍵加進集合物件裡去。

其餘的各種屬性與方法，皆是 ADO 集合物件的標準功能。您可以：

  • 使用 Item 方法來存取集合物件裡的某個索引鍵。

  • 使用 Count 屬性傳回已併入集合物件的索引鍵數目。

  • 使用 Delete 方法由集合物件移除某個索引鍵。

  • 使用 Refresh 方法來更新集合物件裡的物件，以反應目資料庫最新的結構敘述。


Procedures 集合物件 (ADOX)

Procedures 集合物件

包含某個目錄全部的 Procedure 物件。

說明

在 ADOX 語法裡，Procedures 集合物件的 Append 方法僅有一種。您可以：

  • 使用 Append 方法來將新增程序加進集合物件裡去。

其餘的各種屬性與方法，皆是 ADO 集合物件的標準功能。您可以：

  • 使用 Item 方法來存取集合物件裡的某個程序。

  • 使用 Count 屬性傳回已併入集合物件的程序數目。

  • 使用 Delete 方法由集合物件移除某個程序。

  • 使用 Refresh 方法來更新集合物件裡的物件，以反應目資料庫最新的結構敘述。


Tables 集合物件 (ADOX)

Tables 集合物件

包含某個目錄全部的 Table 物件。

說明

在 ADOX 語法裡，Tables 集合物件的 Append 方法僅有一種。您可以：

  • 使用 Append 方法來將新增資料表加進集合物件裡去。

其餘的各種屬性與方法，皆是 ADO 集合物件的標準功能。您可以：

  • 使用 Item 方法來存取集合物件裡的某個資料表。

  • 使用 Count 屬性傳回已併入集合物件的資料表數目。

  • 使用 Delete 方法由集合物件移除某個資料表。

  • 使用 Refresh 方法來更新集合物件裡的物件，以反應目資料庫最新的結構敘述。


Users 集合物件 (ADOX)

Users 集合物件

包含某個目錄或群組裡全部已儲存的 User 物件。

說明

某個 Catalog 的 Users 集合物件，就代表目錄裡全部的使用者。而某個 Group 的 Users 集合物件，只代表某特定群組的使用者。

在 ADOX 語法裡，Users 集合物件的 Append 方法僅有一種。您可以：

  • 使用 Append 方法來將新增使用者加進集合物件裡去。

其餘的各種屬性與方法，皆是 ADO 集合物件的標準功能。您可以：

  • 使用 Count 屬性傳回已併入集合物件的使用者數目。

  • 使用 Item 方法來存取集合物件裡的使用者資料。

  • 使用 Delete 方法由集合物件移除某個使用者。

  • 使用 Refresh 方法來更新集合物件裡的物件，以反應目資料庫最新的結構敘述。

    請注意 在將 User 物件附加到某個 Group 物件的 Users 集合物件之前，在 Catalog 的 Users 集合物件裡，必須存有一個相同 Name 的 User 物件。


Views 集合物件 (ADOX)

Views 集合物件

包含某個目錄裡全部的 View 物件。

說明

在 ADOX 語法裡，Views 集合物件的 Append 方法僅有一種。您可以：

  • 使用 Append 方法來將新增檢視模式加進集合物件裡去。

其餘的各種屬性與方法，皆是 ADO 集合物件的標準功能。您可以：

  • 使用 Item 方法來存取集合物件裡的檢視模式。

  • 使用 Count 屬性傳回已併入集合物件的檢視模式數目。

  • 使用 Delete 方法由集合物件移除某個檢視模式。

  • 使用 Refresh 方法來更新集合物件裡的物件，以反應目資料庫最新的結構敘述。


ADOX 方法

ADOX 方法總覽

方法 | 說明
Append (Columns) | 新增一個 Column 物件到 Columns 集合物件。
Append (Groups) | 新增一個 Group 物件到 Groups 集合物件。
Append (Indexes) | 新增一個 Index 物件到 Indexes 集合物件。
Append (Keys) | 新增一個 Key 物件到 Keys 集合物件。
Append (Procedures) | 新增一個 Procedure 物件到 Procedures 集合物件。
Append (Tables) | 新增一個 Table 物件到 Tables 集合物件。
Append (Users) | 新增一個 User 物件到 Users 集合物件。
Append (Views) | 新增一個 View 物件到 Views 集合物件。
ChangePassword | 更改某個使用者帳號的密碼。
Create | 建立一個新的目錄。
Delete | 由某個集合物件移除一個物件。
GetObjectOwner | 傳回某個物件的擁有者資料。
GetPermissions | 取得某個物件的所屬群組或使用者的使用權限資料。
Item | 由名稱或是序號傳回某個集合物件裡的特定成員。
Refresh | 更新某個集合物件裡的物件，以供後續使用者可以讀取或是選用。
SetObjectOwner | 指定某個物件的擁有者。
SetPermissions | 設定某個物件的所屬群組或使用者的使用權限。


Append 方法(ADOX 資料行)

Append 方法 (資料行)

新增一個 Column 物件到 Columns 集合物件。

語法

Columns.Append Column [, Type] [, DefinedSize]

參數

Column 要附加或是要新建的 Column 物件名稱。

Type 選擇性引數。使用一個長整數來指定資料行的資料型態。Type 參數的值，與 Column 物件的 Type 屬性相關。

DefinedSize 選擇性引數。使用一個長整數來指定資料行的資料長度。DefinedSize 參數的值，與 Column 物件的 DefinedSize 屬性相關。

請注意 如果某個 Column 不存在於一個已經附加在某個 Tables 集合物件裡的 Table 內，當您將這個 Column 附加到某個 Index 的 Columns 集合物件裡時，會發生錯誤。


Append 方法(ADOX 群組)

Append 方法 (群組)

新增一個 Group 物件到 Groups 集合物件。

語法

Groups.Append Group

參數

Group 要附加或是要新建的 Group 物件或是群組名稱。

備註

某個 Catalog 的 Groups 集合物件，會包含 Catalog 裡全部的使用者帳號。而 User 的 Groups 集合物件，僅包含使用者所屬的群組名稱。

如果使用者沒有建立群組的權限時，會發生錯誤。

請注意 在將 Group 物件附加到某個 User 物件的 Groups 集合物件之前，在 Catalog 的 Groups 集合物件裡，必須存在有與被附加的 Name 同名的 Group 物件。


Append 方法(ADOX 索引)

Append 方法 (索引)

新增一個 Index 物件到 Indexes 集合物件。

語法

Indexes.Append Index [, Columns]

參數

Index 要附加或是要新建的 Index 物件名稱。

Columns 選擇性引數。使用一個變數來指定要建立索引的資料行的名稱。Columns 參數的值，與 Column 物件或物件的 Name 屬性相關。

備註

Columns 參數的設定值，可視為是一個資料行的名稱或是一組資料行名稱的陣列。

如果使用者沒有建立索引的權限時，會發生錯誤。


Append 方法 (ADOX Keys)

Append 方法 (Keys)

新增一個 Key 物件到 Keys 集合物件。

語法

Keys.Append Key [, KeyType] [, Column] [, RelatedTable]

參數

Key 要附加或是要新建的 Key 物件名稱。

KeyType 選擇性引數。使用一個長整數來指定 Key 的資料型態。KeyTyp 參數的值，與 Key 物件的 Type 屬性相關。

Column 選擇性引數。使用一個字串來指定要建立索引的資料行的名稱。Columns 參數的值，與 Column 物件的 Name 屬性相關。

RelatedTable 選擇性引數。使用一個字串來指定相關資料表的名稱。RelatedTable 參數的值，與 Table 物件的 Name 屬性相關。

備註

Columns 參數的設定值，可視為是一個資料行的名稱或是一組資料行名稱的陣列。


Append 方法(ADOX 程序)

Append 方法 (程序)

新增一個 Procedure 物件到 Procedures 集合物件。

語法

Procedures.Append Name, Command

參數

Name 使用一個字串，來指定要附加或是要新建的程序的名稱。

Command 這是一個 ADO Command 物件，用來表示要附加或是要新建的程序。

備註

可在 Command 物件裡，使用資料來源的名稱與屬性資料，建立一個新的程序。

如果使用者指定的指令文字，只是一種檢視方式，而非程序的話，會發生錯誤。且這個指令將不會被存入資料來源，也不會被加進集合物件物件裡去。

如果使用者沒有建立恆久性指令的權限時，會發生錯誤。


Append 方法(ADOX 表格)

Append 方法 (表格)

新增一個 Table 物件到 Tables 集合物件。

語法

Tables.Append Table

參數

Table 使用一個變數，來指定要附加或是要建立的 Table 名稱。

備註

如果使用者沒有建立資料表的權限時，會發生錯誤。


Append 方法(ADOX 使用者)

Append 方法 (使用者)

新增一個 User 物件到 Users 集合物件。

語法

Users.Append User[, Password]

參數

User 使用一個變數，來指定要附加或是要建立的 User 物件的名稱。

Password 選擇性引數。使用一個字串來指定使用者的密碼。Password 參數的值，與 User 物件的 ChangePassword 方法指定的值相關。

備註

某個 Catalog 的 Users 集合物件，內含目錄裡全部的使用者資料。而 Group 的 Users 集合物件，僅包含某個特定群組成員的使用者資料。

如果使用者沒有建立使用者資料的權限時，會發生錯誤。

請注意 在將 User 物件附加到某個 Group 物件的 Users 集合物件之前，在 Catalog 的 Users 集合物件裡，必須存在有與被附加的 Name 同名的 User 物件。


Append 方法(ADOX 檢視)

Append 方法 (檢視)

建立一個新的 View 物件，並將其附加到 Views 集合物件裡去。

語法

Views.Append Name, Command

參數

Name 使用一個字串，來指定要建立的檢視模式名稱。

Command 這是一個 ADO 指令物件，用來表示要新建的檢視模式。

備註

可在 Command 物件裡，使用資料來源的名稱與屬性資料，建立一個新的檢視模式。

如果使用者指定的指令物件，是一種程序，而非檢視方式的話，會發生錯誤。且這個指令將不會被存入資料來源，也不會被加進集合物件裡去。

如果使用者沒有建立恆久性指令的權限時，會發生錯誤。


ChangePassword 方法(ADOX)

ChangePassword 方法

更改某個使用者帳號的密碼。

語法

User.ChangePassword OldPassword, NewPassword

參數

OldPassword 使用一個字串來指定使用者既有的密碼。如果某位使用者目前尚未建有密碼資料，則 OldPassword 參數值為空白字串 ("")。

NewPassword 使用一個字串，來指定使用者的新密碼。

備註

為了安全起見，在加入新密碼之前，必須先指定舊的密碼值。

如果使用者沒有管理級的委託權限時，會發生錯誤。


Create 方法(ADOX)

Create 方法

建立一個新的目錄。

語法

Catalog.Create ConnectString

參數

ConnectString 使用一個字串與資料來源取得連結。

備註

在 ConnectString 參數裡，使用 Create 方法建立、並開啟一個新的 ADO Connection 物件，以連結到資料來源。如果連結成功，這個新的 Connection 物件會被指定為具有 ActiveConnection 屬性。

如果使用者沒有建立新目錄的權限時，會發生錯誤。


Delete 方法(ADOX 集合物件)

Delete 方法 (Collections)

由某個集合物件移除一個物件。

語法

Collection.Delete Name

參數

Name 使用一個變數來指定要刪除的物件名稱或是物件 (在索引裡) 的序號。

備註

如果 Name 參數指定的物件在集合物件裡不存在，會發生錯誤。

對 Tables 以及 Users 集合物件來說，如果使用者沒有刪除資料表或是使用者資料的權限時，會發生錯誤。同樣地，如果使用者沒有建立恆久性指令的使用權限時，嘗試刪除 Procedures 以及 Views 集合物件時，也會發生錯誤。


GetObjectOwner 方法(ADOX)

GetObjectOwner 方法

傳回 Catalog 裡某個物件的擁有者資料。

語法

Owner = Catalog.GetObjectOwner(ObjectName, ObjectType [, ObjectTypeId])

傳回值

傳回一個字串；此傳回值記載著擁有這個物件的使用者或是群組的名稱。

參數

ObjectName 使用一個字串，來指定要傳回擁有者資料的物件名稱。

ObjectType 使用一個 Enum 來指定擁有者的物件類型。下列為可適用於 ObjectType 的常數名稱列表:

常數名稱 | 說明
adPermObjProviderSpecific | 使用者定義型的物件。如果 ObjectType 設定為 adPermObjProviderSpecific，且未由 ObjectTypeId 提供權限時，會發生錯誤。
adPermObjTable | 物件是一個資料表。
adPermObjColumn | 物件是一個資料行。
adPermObjDatabase | 物件是一個資料庫。
adPermObjProcedure | 物件是一個程序。
adPermObjView | 物件是一個檢視方式。
adPermObjSchema | 物件是一個結構敘述。
adPermObjDomain | 物件是一個領域名稱。
adPermObjCollation | 物件是一個分頁。
adPermObjSchemaRowset | 物件是一個結構敘述資料列集。
adPermObjCharacterSet | 物件是一個文字集。
adPermObjTranslation | 物件是一個轉譯。

ObjectTypeId 選擇性引數。使用一個變數，來指定不是 OLE DB 定義的使用者定義型 GUID 物件。當 ObjectType 設定為 adPermObjProviderSpecific 時，才需要指定這個參數；否則，即毋需指定。

備註

如果使用者沒有傳回物件擁有者資料的權限時，會發生錯誤。


GetPermissions 方法(ADOX)

GetPermissions 方法

取得某個物件的所屬群組或使用者的使用權限資料。

語法

ReturnValue = GroupOrUser.GetPermissions(Name, ObjectType
[, ObjectTypeId])

傳回值

傳回一個長整數；此傳回值使用位元遮罩來記載某個物件的所屬群組或使用者的使用權限資料。

參數

Name 使用一個字串，來指定要傳回使用權限資料的物件名稱。

ObjectType 使用一個長整數來指定要傳回使用權限資料的物件類型。下列為可適用於 ObjectType 的常數名稱列表:

常數名稱 | 說明
adPermObjProviderSpecific | 使用者定義型的物件。如果 ObjectType 設定為 adPermObjProviderSpecific，且未由 ObjectTypeId 提供權限時，會發生錯誤。
adPermObjTable | 物件是一個資料表。
adPermObjColumn | 物件是一個資料行。
adPermObjDatabase | 物件是一個資料庫。
adPermObjProcedure | 物件是一個程序。
adPermObjView | 物件是一個檢視方式。
adPermObjSchema | 物件是一個結構敘述。
adPermObjDomain | 物件是一個領域名稱。
adPermObjCollation | 物件是一個分頁。
adPermObjSchemaRowset | 物件是一個結構敘述資料列集。
adPermObjCharacterSet | 物件是一個字集。
adPermObjTranslation | 物件是一個轉譯。

ObjectTypeId 選擇性引數。使用一個變數，來指定不是 OLE DB 定義的使用者定義型 GUID 物件。當 ObjectType 設定為 adPermObjProviderSpecific 時，才需要指定這個參數；否則，即毋需指定。


SetObjectOwner 方法(ADOX)

SetObjectOwner 方法

指定 Catalog 裡某個物件的擁有者。

語法

Catalog.SetObjectOwner ObjectName, ObjectType , OwnerName [, ObjectTypeId]

參數

ObjectName 使用一個字串，來指定要設定擁有者的物件名稱。

ObjectType 使用一個 Enum 來指定擁有者的物件類型。下列為可適用於 ObjectType 的常數名稱列表:

常數名稱 | 說明
adPermObjProviderSpecific | 使用者定義型的物件。如果 ObjectType 設定為 adPermObjProviderSpecific，且未由 ObjectTypeId 提供權限時，會發生錯誤。
adPermObjTable | 物件是一個資料表。
adPermObjColumn | 物件是一個資料行。
adPermObjDatabase | 物件是一個資料庫。
adPermObjProcedure | 物件是一個程序。
adPermObjView | 物件是一個檢視方式。
adPermObjSchema | 物件是一個結構敘述。
adPermObjDomain | 物件是一個領域名稱。
adPermObjCollation | 物件是一個分頁。
adPermObjSchemaRowset | 物件是一個結構敘述資料列集。
adPermObjCharacterSet | 物件是一個文字集。
adPermObjTranslation | 物件是一個轉譯。

OwnerName 使用一個字串，來指定擁有這個物件的使用者或是群組的名稱。

ObjectTypeId 選擇性引數。使用一個變數，來指定不是 OLE DB 定義的使用者定義型 GUID 物件。當 ObjectType 設定為 adPermObjProviderSpecific 時，才需要指定這個參數；否則，即毋需指定。

備註

如果使用者沒有指定物件擁有者資料的權限時，會發生錯誤。


SetPermissions 方法(ADOX)

SetPermissions 方法

設定某個物件所屬群組或使用者的使用權限。

語法

GroupOrUser.SetPermissions Name, ObjectType, Action, Rights [, Inherit]
[, ObjectTypeId]

參數

Name 使用一個字串，來指定要設定使用權限的物件名稱。

ObjectType 使用一個長整數來指定要設定使用權限資料的物件類型。下列為可適用於 ObjectType 的常數名稱列表:

常數名稱 | 說明
adPermObjProviderSpecific | 使用者定義型的物件。如果 ObjectType 設定為 adPermObjProviderSpecific，且未由 ObjectTypeId 提供權限時，會發生錯誤。
adPermObjTable | 物件是一個資料表。
adPermObjColumn | 物件是一個資料行。
adPermObjDatabase | 物件是一個資料庫。
adPermObjProcedure | 物件是一個程序。
adPermObjView | 物件是一個檢視方式。
adPermObjSchema | 物件是一個結構敘述。
adPermObjDomain | 物件是一個領域名稱。
adPermObjCollation | 物件是一個分頁。
adPermObjSchemaRowset | 物件是一個結構敘述資料列集。
adPermObjCharacterSet | 物件是一個文字集。
adPermObjTranslation | 物件是一個轉譯。

Action 使用一個長整數來指定使用權限資料的執行類型。下列為可適用於 Action 的常數名稱列表:

常數名稱 | 說明
adAccessGrant | 使用者或是群組僅有基本的使用權限。
adAccessSet | 使用者或是群組擁有完整的使用權限。
adAccessDeny | 使用者或是群組沒有使用權限。
adAccessRevoke | 取消使用者或是群組的使用權限。
adAccessAuditSuccess | 當成功地開啟物件的使用權限時，開啟的次數會記錄下來。
adAccessAuditFailure | 當物件的使用權限開啟失敗時，失敗的次數會記錄下來。

Rights 使用一個包含位元遮罩的長整數來表示權限的設定值，各位元值可加總使用。下列為可適用於 Rights 的常數名稱列表:

常數名稱 | 說明
adRightExecute | 群組具有執行物件的使用權限。
adRightRead | 群組具有讀取物件的使用權限。
adRightUpdate | 群組具有更新物件的使用權限。
adRightInsert | 群組具有插入物件的使用權限。
adRightDelete | 群組具有刪除物件的使用權限。
adRightReference | 群組具有參考物件的使用權限。
adRightCreate | 群組具有建立物件的使用權限。
adRightWithGrant | 群組具有允許物件權限的使用權限。
adRightDesign | 群組具有設計物件的使用權限。
adRightAll | 群組具有物件全部的使用權限。

Inherit 選擇性引數。使用一個 Enum 來表示物件如何繼承使用權限，預設值為 adInheritNone。下列為可適用於 Inherit 的常數名稱列表:

常數名稱 | 說明
adInheritNone | 沒有繼承性。
adInheritObjects | 僅有非收納器物件可繼承使用權限。
adInheritContainers | 主要物件裡的其它收納器可繼承使用權限。
adInheritBoth | 主要物件裡的物件與其它收納器，均可繼承使用權限。
adInheritNoPropagate | 不會將 adInheritObjects 與 adInheritContainers 旗標傳送給繼承項目。
adInheritOnly | 使用權限不會作用在貼附有存取控制清單 (ACL) 的物件，但主要物件裡的其它收納器可繼承使用權限。

ObjectTypeId 選擇性引數。使用一個變數，來指定不是 OLE DB 定義的使用者定義型 GUID 物件。當 ObjectType 設定為 adPermObjProviderSpecific 時，才需要指定這個參數；否則，即毋需指定。

備註

如果使用者沒有設定使用者或是群組存取功能的使用權限時，會發生錯誤。


ADOX 屬性

ADOX 屬性綜覽

屬性 | 說明
ActiveConnection | 表示目錄所屬的 ADO Connection 物件。
特性 | 說明資料行特性。
Clustered | 表示索引是否要成為立體成串的結構。
Command | 指定可用來建立或執行程序的 ADO Command 物件。
Count | 表示集合內的物件數。
DateCreated | 表示物件的建立日期。
DateModified | 表示物件的前次修改日期。
DefinedSize | 表示指定的最大資料行大小。
DeleteRule | 表示刪除主要索引鍵時所執行的動作。
IndexNulls | 表示索引欄位內有 Null 值的記錄是否有索引項目。
Name | 表示物件的名稱。
NumericScale | 表示資料行內的數值小數位。
ParentCatalog | 指示負責存取提供者特定屬性的表格上層目錄或資料行上層目錄。
Precision | 表示資料行內的資料值最大精確度。
PrimaryKey | 表示索引是否代表表格的主要索引鍵。
RelatedColumn | 表示相關表格內的相關資料行名稱 (只限索引鍵資料行) 。
RelatedTable | 表示相關表格的名稱。
SortOrder | 表示資料行的排序順序 (只限索引資料行) 。
Type (Column) | 表示資料行的資料型態。
Type (Key) | 表示索引鍵的資料型態。
Type (Table) | 表示表格型態。
Unique | 表示索引鍵是否必須是唯一的。
UpdateRule | 表示更新主要索引鍵時所執行的動作。


ActiveConnection 屬性 (ADOX)

ActiveConnection 屬性

表示 Catalog 所屬的 ADO Connection 物件。

設定和傳回值

設定一個 Connection 物件或含有連線定義的 String。傳回現用的 Connection 物件。

註解

預設值是 Null 物件參考指標。


Attributes 屬性 (ADOX)

Attributes 屬性

說明資料行特性。

設定和傳回值

設定或傳回一個 Long 值。這個值指定 Column 物件所代表之表格的特性，可以是下列常數的組合：

常數 | 說明
adColFixed | 資料行是固定長度。
adColNullable | 資料行可包含空值。

註解

預設值是零 (0) ，它既不是 adColFixed，也不是 adColNullable。


Clustered 屬性 (ADOX)

Clustered 屬性

表示索引是否要成為立體成串的結構。

設定和傳回值

設定和傳回一個 Boolean 值。

註解

預設值是 False。

在已附加到集合的 Index 物件上，這是一個唯讀屬性。


Command 屬性 (ADOX)

Command 屬性

指定可用來建立或執行程序的 ADO Command物件。

設定和傳回值

設定或傳回一個有效的 ADO Command 物件。

註解

如果提供者不支援持續指令，當取得和設定這個屬性時，會發生錯誤。


DateCreated 屬性 (ADOX)

DateCreated 屬性

表示物件的建立日期。

傳回值

傳回一個指定建立日期的 Variant 值。如果提供者不支援 DateCreated，則這個值是 Null。


DateModified 屬性 (ADOX)

DateModified 屬性

表示物件的前次修改日期。

傳回值

傳回一個指定修改日期的 Variant 值。如果提供者不支援 DateModified，則這個值是 Null。


DefinedSize 屬性 (ADOX)

DefinedSize 屬性

表示指定的最大資料行大小。

設定和傳回值

設定和傳回一個代表資料值最大字元長度的 Long 值。

註解

預設值是零 (0) 。

在已附加到集合的 Column 物件上，這是一個唯讀屬性。


DeleteRule 屬性 (ADOX)

DeleteRule 屬性

表示刪除主要索引鍵時所執行的動作。

設定和傳回值

設定和傳回一個代表下列常數之一的 Long 值：

常數 | 說明
adRINone | 沒有動作。
adRICascade | 重疊顯示變更。
adRISetNull | 將外部索引鍵值設為 Null。
adRISetDefault | 將外部索引鍵值設為預設值。

註解

預設值是 adRINone。

在已附加到集合的 Key 物件上，這是一個唯讀屬性。


IndexNulls 屬性 (ADOX)

IndexNulls 屬性

表示索引欄位內有 Null 值的記錄是否有索引項目。

設定和傳回值

設定和傳回一個代表下列常數之一的 Enum 值：

常數 | 說明
adIndexNullsDisallow | 索引不接受索引鍵資料行是 Null 的項目。如果您在索引鍵資料行內輸入 Null 值，將會發生錯誤。
adIndexNullsIgnore | 索引不插入含有 Null 索引鍵的項目。如果您在索引鍵資料行內輸入 Null 值，項目會被忽略，不會發生錯誤。
adIndexNullsIgnoreAny | 索引不插入某索引鍵資料行有 Null 值的項目。如果索引有多重資料行索引鍵，且在某個資料行內輸入 Null 值，項目會被忽略，不會發生錯誤。

註解

預設值是 adIndexNullsDisallow。

在已附加到集合的 Index 物件上，這是一個唯讀屬性。


Name 屬性 (ADOX)

Name 名稱

表示物件的名稱。

設定和傳回值

設定或傳回一個 String 值。

註解

在集合內，Names 不必是唯一的。

在 Column、Group、Key、Index、Table 和 User 物件上，Name 是一個讀寫屬性。在 Catalog、Procedure 和 View 等物件上，Name 是一個唯讀屬性。

如果是讀取物件 (Column、Group、Key、Index、Table 和 User 物件)，則預設值是一個空字串 ("")。

附註

  • 如果是索引鍵，在已附加到集合的 Key 物件上，這是一個唯讀屬性。

  • 如果是表格鍵，在已附加到集合的 Table 物件上，這是一個唯讀屬性。


NumericScale 屬性 (ADOX)

NumericScale 屬性

表示資料行內的數值小數位。

設定和傳回值

當 Type 屬性是 adNumeric 或 adDecimal 時，設定和傳回代表資料行資料值小數位的 Byte 值。對於所有其它資料類型而言，NumericScale 都會被忽略。

註解

預設值是零 (0) 。

在已附加到集合的


ParentCatalog 屬性 (ADOX)

ParentCatalog 屬性

指定表格或資料行的親代目錄來存取提供者特有的屬性。

設定和傳回值

設定和傳回 Catalog 物件。設定 ParentCatalog 來開啟 Catalog，允許存取提供者特有的屬性，然後才附加表格或資料行到 Catalog 物件集合。

備註

部份資料提供者只允許在建立時寫入提供者特有的屬性 (當表格或資料行附加到它的 Catalog 集合物件時)。要在附加這些物件到 Catalog 之前存取這些屬性，請先在 ParentCatalog 屬性指定 Catalog。

當表格或資料行附加到 ParentCatalog 以外的其它 Catalog 時會發生錯誤。


Precision 屬性 (ADOX)

Precision 屬性

指示資料行內資料值的最高精確度。

設定和傳回值

當 Type 屬性為數字類型時，設定和傳回資料行內資料值最大精確值的長整數。

備註

預設值為 0。

若 Column 物件已經附加到集合物件，則此屬性為唯讀。


PrimaryKey 屬性 (ADOX)

PrimaryKey 屬性

指示索引是否代表表格的主要鍵。

設定和傳回值

設定和傳回布林值。

備註

預設值為 False。

若 Index 物件已經附加到集合物件，則此屬性為唯讀。


RelatedColumn 屬性 (ADOX)

RelatedColumn 屬性

指示相關表格內相關資料行的名稱 (僅鍵值資料行)。

設定和傳回值

設定和傳回是相關表格內相關資料行之名稱的字串值。

備註

預設值為空字串 ("")。

若 Column 物件已經附加到集合物件，則此屬性為唯讀。


RelatedTable 屬性 (ADOX)

RelatedTable 屬性

指示相關表格的名稱。

設定和傳回值

設定和傳回字串值。

備註

預設值為空字串 ("")。

若鍵值為外來鍵，則 RelatedTable 為包含該鍵值的表格名稱。


SortOrder 屬性 (ADOX)

SortOrder 屬性

指示資料行的排列順序 (僅索引資料行)。

設定和傳回值

設定和傳回下列常數之一的長整數值：

常數 | 說明
adSortAscending | 資料行的排列順序會遞增。
adSortDescending | 資料行的排列順序會遞減。

備註

預設值為 adSortAscending。

此屬性僅適用於 Index 的 Columns 集合物件內的 Column 物件。


Type 屬性 (資料行) (ADOX)

Type 屬性 (資料行)

指示資料行的資料類型。

設定和傳回值

設定和傳回下列其中一個常數的長整數值：

常數 | 說明
adTinyInt | 正確的數值、精確度 3 比例 0。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adSmallInt | 正確的數值、精確度 5 比例 0。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adInteger | 正確的數值、精確度 10 比例 0。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adBigInt | 正確的數值、精確度 19 比例 0。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adUnsignedTinyInt | 未加正負號的 adTinyInt.
adUnsignedSmallInt | 未加正負號的 adSmallInt.
adUnsignedInt | 未加正負號的 adInteger.
adUnsignedBigInt | 未加正負號的 adBigInt.
adSingle | 單精確度浮點數字。
adDouble | 雙精確度浮點數字。
adCurrency | 貨幣類型。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adDecimal | 奱數十進位類型。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adNumeric | 數字類型。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adBoolean | Variant Boolean 類型。0 為假而 ~0 為真。
adUserDefined | 使用者定義的變數長度資料類型。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adVariant | Automation Variant。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adGuid | Globally Unique Identifier。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adDate | 自動化日期。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adDBDate | 資料庫資料日期結構。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adDBTime | 資料庫時間資料結構。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adDBTimestamp | 資料庫時間戳記結構。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adBSTR | BSTR 的指標。如需關於此類型的詳細資訊，請參閱 OLE DB Programmer's Reference。
adChar | 固定長度字串。
adVarChar | 浮動長度字串。
adLongVarChar | 長浮動長度字串。
adWChar | 寬浮動長度字串。
adVarWChar | 寬浮動長度字串。
adLongVarWChar | 長、寬浮動長度字串。
adBinary | 固定長度二進位資料。
adVarBinary | 浮動長度二進位資料。
adLongVarBinary | 長浮動二進位資料。

備註

預設值為 adVarWChar。

在 Column 物件附加到集合物件或其它物件之前，此屬性為讀/寫，附加之後就變成唯讀。


Type 屬性 (Keys) (ADOX)

Type 屬性 (Key)

指示鍵值的資料類型。

設定和傳回值

設定或傳回下列常數之一的長整數值:

常數 | 說明
adKeyPrimary | 鍵值為主要鍵。
adKeyForeign | 鍵值為外來鍵。
adKeyUnique | 鍵值是唯一的。

備註

預設值為 adKeyPrimary。

已經附加到集合物件的 Key 物件，它的屬性是唯讀。


Type 屬性 (表格) (ADOX)

Type 屬性 (表格)

指示表格的類型。

傳回值

傳回字串值，它可指定表格的類型，例如 "TABLE"、"SYSTEM TABLE" 或 "GLOBAL TEMPORARY"。

備註

此屬性為唯讀。


Unique 屬性 (ADOX)

Unique 屬性

指示索引鍵是否必須唯一不可重複。

設定和傳回值

設定和傳回布林值。

備註

預設值為 False。

若 Index 物件已經附加到集合物件，則此屬性為唯讀。


UpdateRule 屬性 (ADOX)

UpdateRule 屬性

指示當主要鍵更新時要執行的動作。

設定和傳回值

設定和傳回下列其中常數之一的長整數值:

常數 | 說明
adRINone | 沒有動作。
adRICascade | 階層式變更。
adRISetNull | 將外來鍵值設成 null。
adRISetDefault | 將外來鍵值設成預設值。

備註

預設值為 adRINone。

若 Key 物件已經附加到集合物件，則此屬性為唯讀。


ADOX 範例

下列主題都有範例程式碼，以幫助您了解 ADOX 的使用方式。所有程式碼範例都是用 Visual Basic 來撰寫的。以下依功能區分來為這些範例分組，依複雜度來排定它們的次序。

注意 您可以在您的程式碼編輯器上，貼上從 Sub 到 End Sub 整個程式碼範例。如果您只用了部份範例，或遺漏了某些段落格式，範例可能會無法正確運作。

資料庫連接範例

Catalog ActiveConnection 範例

關閉連接範例

結構敘述範例

建立資料庫範例

建立表格範例

建立索引範例

建立索引鍵範例

提供者特定屬性範例

ParentCatalog 範例

檢視 (SELECT 查詢) 範例

建立檢視範例

刪除檢視範例

檢視文字範例

檢視欄位範例

儲存程序範例

建立程序範例

刪除程序範例

重新整理程序範例

程序文字範例

程序參數範例

使用者和群組授權許可範例

授與使用權限範例


授與使用權限範例 (ADOX)

授與使用權限範例

下列程式碼可提供 Orders 表格的完整存取權限給「管理使用者」。

Sub GrantPermissions()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog

    ' Opens a connection to the northwind database
    ' using the Jet 4.0 provider
    cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnn.Open "data source=" & _
    "c:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb;" & _
    "jet oledb:system database=mysystem.mdb"

    Set cat.ActiveConnection = cnn

    ' Give the Admin user full rights on the orders object
    cat.Users("Admin").SetPermissions "Orders", adPermObjTable, _
        adAccessSet, adRightAll

End Sub


建立資料庫範例 (ADOX)

建立資料庫範例

下列程式碼說明如何使用 Create 方法來建立新的 Jet 資料庫。

Sub CreateDatabase()

    Dim cat As New ADOX.Catalog
    cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\new.mdb"

End Sub


建立索引範例 (ADOX)

建立索引範例

下列程式碼說明如何建立新的索引。索引在表格內的兩個資料行上。

Sub CreateIndex()

    Dim tbl As New Table
    Dim idx As New ADOX.Index
    Dim cat As New ADOX.Catalog

'Open the catalog.
    ' Open the Catalog.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Define the table and append it to the catalog
    tbl.Name = "MyTable"
    tbl.Columns.Append "Column1", adInteger
    tbl.Columns.Append "Column2", adInteger
    tbl.Columns.Append "Column3", adVarWChar, 50
    cat.Tables.Append tbl

    ' Define a multi-column index
    idx.Name = "multicolidx"
    idx.Columns.Append "Column1"
    idx.Columns.Append "Column2"

    ' Append the index to the table
    tbl.Indexes.Append idx

End Sub


建立索引鍵範例 (ADOX)

建立索引鍵範例

下列程式碼說明如何建立新的外部索引鍵。它假設有兩個表格存在 (Customers 和 Orders)。

Sub CreateKey()

    Dim kyForeign As New ADOX.Key
    Dim cat As New ADOX.Catalog

    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    kyForeign.Name = "CustOrder"
    kyForeign.Type = adKeyForeign
    kyForeign.RelatedTable = "Customers"
    kyForeign.Columns.Append "CustomerId"
    kyForeign.Columns("CustomerId").RelatedColumn = "CustomerId"
    kyForeign.UpdateRule = adRICascade
    cat.Tables("Orders").Keys.Append kyForeign

End Sub


建立程序範例 (ADOX)

建立程序範例

下列程式碼說明如何使用 Command 物件和 Procedures 集合物件 Append 方法，在基礎資料來源中建立新的程序。

Sub CreateProcedure()

    Sub CreateProcedure()

    Dim cnn As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim prm As ADODB.Parameter
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Create the parameterized command (Jet specific)
    Set cmd.ActiveConnection = cnn
    cmd.CommandText = "PARAMETERS [CustId] Text;" & _
        "Select * From Customers Where CustomerId = [CustId]"

    ' Open the Catalog
    Set cat.ActiveConnection = cnn

    ' Create the new Procedure
    cat.Procedures.Append "CustomerById", cmd

End Sub


建立表格範例 (ADOX)

建立表格範例

下列程式碼說明如何建立新的表格。

Sub CreateTable()

    Dim tbl As New Table
    Dim cat As New ADOX.Catalog

'Open the catalog.
    ' Open the Catalog.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    tbl.Name = "MyTable"
    tbl.Columns.Append "Column1", adInteger
    tbl.Columns.Append "Column2", adInteger
    tbl.Columns.Append "Column3", adVarWChar, 50
    cat.Tables.Append tbl

End Sub


建立檢視範例 (ADOX)

建立檢視範例

下列程式碼說明如何使用 Command 物件和 Views 集合物件 Append 方法，在基礎資料來源中建立新的檢視。

Sub CreateView()

    Dim cmd As New ADODB.Command
    Dim cat As New ADOX.Catalog

    ' Open the Catalog
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Create the command representing the view.
        cmd.CommandText = "Select * From Customers"

    ' Create the new View
    cat.Views.Append "AllCustomers", cmd

End Sub


Catalog ActiveConnection 範例 (ADOX)

Catalog ActiveConnection 範例

將 ActiveConnection 屬性設定為有效的開放連接，可以「開啟」目錄。您可以從開啟的目錄存取目錄內的結構敘述。

Sub OpenConnection()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog

        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Debug.Print cat.Tables(0).Type

End Sub

將 ActiveConnection 屬性設定為有效的連接字串，也可以「開啟」目錄。

Sub OpenConnectionWithString()

    Dim cat As New ADOX.Catalog

    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Debug.Print cat.Tables(0).Type

End Sub


刪除檢視範例 (ADOX)

刪除檢視範例

下列程式碼說明如何使用 Delete 方法，從目錄中刪除檢視。

Sub DeleteView()

    Dim cat As New ADOX.Catalog

    ' Open the catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    'Delete the View
    cat.Views.Delete "AllCustomers"

End Sub


關閉連接範例 (ADOX)

關閉連接範例

將 ActiveConnection 屬性設定為 Nothing，應該會「關閉」目錄。相關的集合物件會成為空的。根據目錄內之結構敘述物件來建立的任何物件都會被遺棄。您仍可以使用這些物件的任何已快取的屬性，但如果您試圖讀取的屬性需要呼叫提供者，則不會成功。

Sub CloseConnectionByNothing()

    Dim cnn As New Connection
    Dim cat As New Catalog
    Dim tbl As Table

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Set tbl = cat.Tables(0)
    Debug.Print tbl.Type    ' Cache tbl.Type info
    Set cat.ActiveConnection = Nothing
    Debug.Print tbl.Type    ' tbl is orphaned
    ' Previous line will succeed if this was cached
    Debug.Print tbl.Columns(0).DefinedSize
    ' Previous line will fail if this info has not been cached

End Sub

Closing a Connection object that was used to "open" the catalog should have the same effect as setting the ActiveConnection property to Nothing.

Sub CloseConnection()

    Dim cnn As New Connection
    Dim cat As New Catalog
    Dim tbl As Table

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Set tbl = cat.Tables(0)
    Debug.Print tbl.Type    ' Cache tbl.Type info
    cnn.Close
    Debug.Print tbl.Type    ' tbl is orphaned
    ' Previous line will succeed if this was cached
    Debug.Print tbl.Columns(0).DefinedSize
    ' Previous line will fail if this info has not been cached

End Sub


刪除程序範例 (ADOX)

刪除程序範例

下列程式碼說明如何使用 Procedures 集合物件 Delete 方法來刪除程序。

Sub DeleteProcedure()

Dim cat As New ADOX.Catalog

    ' Open the Catalog.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Delete the Procedure.
    cat.Procedures.Delete "CustomerById"

End Sub


程序參數範例 (ADOX)

程序參數範例

下列程式碼說明如何使用 Command 物件和 Command 屬性來擷取程序的參數資訊。

Sub ProcedureParameters()

    Dim cnn As New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the command object
    Set cmd = cat.Procedures("CustomerById").Command

    ' Retrieve Parameter information
    cmd.Parameters.Refresh
    For Each prm In cmd.Parameters
        Debug.Print prm.Name & ":" & prm.Type
    Next

End Sub


程序文字範例 (ADOX)

程序文字範例

下列程式碼說明如何使用 Command 來更新程序文字。

Sub ProcedureText()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the Command
    Set cmd = cat.Procedures("CustomerById").Command

    ' Update the CommandText
    cmd.CommandText = "Select CustomerId, CompanyName, ContactName " & _
        "From Customers " & _
        "Where CustomerId = [CustId]"

    ' Update the Procedure
    Set cat.Procedures("CustomerById").Command = cmd

End Sub


檢視欄位範例 (ADOX)

檢視欄位範例

下列程式碼說明如何使用 Command 屬性和 ADO Recordset 物件來擷取檢視的欄位資訊。

Sub ViewFields()

    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim fld As ADODB.Field
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Set the Source for the Recordset
    Set rst.Source = cat.Views("AllCustomers").Command

    ' Retrieve Field information
    rst.Fields.Refresh
    For Each fld In rst.Fields
        Debug.Print fld.Name & ":" & fld.Type
    Next

End Sub


檢視文字範例 (ADOX)

檢視文字範例

下列程式碼說明如何使用 Command 來更新檢視文字。

Sub ViewText()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command

    ' Open the Connection
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the command
    Set cmd = cat.Views("AllCustomers").Command

    ' Update the CommandText of the Command
    cmd.CommandText = _
        "Select CustomerId, CompanyName, ContactName From Customers"

    ' Update the View
    Set cat.Views("AllCustomers").Command. = cmd

End Sub


ParentCatalog 範例 (ADOX)

ParentCatalog 範例

下列程式碼說明在表格附加到目錄之前，如何使用 ParentCatalog 屬性來存取提供者特定屬性。

Sub SetAllowZeroLength()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tbl As New ADOX.Table
    Dim col As New ADOX.Column

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    tbl.Name = "MyTable"
    tbl.Columns.Append "Column1", adInteger
    Set col.ParentCatalog = cat
    col.Name = "Column2"
    col.Type = adVarWChar
    col.Properties("Jet OLEDB:Allow Zero Length") = True
    tbl.Columns.Append col
    cat.Tables.Append tbl

End Sub


重新整理程序範例 (ADOX)

重新整理程序範例

下列程式碼說明如何重新整理 Catalog 的 Procedures 集合物件。

Sub ProcedureRefresh()

    Dim cat As New ADOX.Catalog

    ' Open the Catalog
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Refresh the Procedures collection
    cat.Procedures.Refresh

End Sub


AutoIncrement 資料行範例 (ADOX)

AutoIncrement 資料行範例

下列程式碼說明如何在 Jet 資料庫內建立 AutoIncrement 資料行。

Sub CreateAutoIncrColumn()

        Dim cat     As New ADOX.Catalog
        Dim tbl     As New ADOX.Table
        Dim col     As New ADOX.Column

    ' Open the catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    With tbl
        .Name = "MyContacts"
        Set .ParentCatalog = cat
        ' Create fields and append them to the new Table object.
        .Columns.Append "ContactId", adInteger
        ' Make the ContactId column and auto incrementing column
        .Columns("ContactId").Properties("AutoIncrement") = True
        .Columns.Append "CustomerID", adVarWChar
        .Columns.Append "FirstName", adVarWChar
        .Columns.Append "LastName", adVarWChar
        .Columns.Append "Phone", adVarWChar, 20
        .Columns.Append "Notes", adLongVarWChar
    End With

    cat.Tables.Append tbl

    Set cat = Nothing


Microsoft ADO MD 程式人員參考手冊

Microsoft® ActiveX® Data Objects (Multidimensional) (ADO MD) 對類似 Microsoft® Visual Basic®、Microsoft® Visual C++®、以及Microsoft® Visual J++™ 這類語言，提供了簡單讀取多維資料的方式。ADO MD 擴充了 Microsoft® ActiveX® Data Objects (ADO) 的功能，將多維資料所特有的物件含蓋了進來，這類物件有 CubeDef 與 Cellset 等。使用ADO MD之後，您可以瀏覽多維的結構敘述、查詢cube的資料、並擷取結果。

就像 ADO 一樣，ADO MD使用了一種隱藏的 OLE DB 提供者，來進行資料讀取的作業。為了與 ADO MD 合作，該提供者必須是多維的資料提供者 (MDP)，就如同用在OLAP規格的OLE DB所定義的一樣。MDP以多維檢視的方式呈現資料，這和表格式資料提供者 (TDPs) 的做法不同，後者在呈現資料時係以表格的方式進行的。如果要知道您使用的提供者所支援的語法及行為的話，請參考您的 OLAP OLE DB 提供者所附的相關文件。

本份文件在撰寫時，已經假設您具備了Visual Basic程式語言的操作知識、以及ADO與OLAP的一般性知識。如果您想知道更多的內容，請參閱 ADO 程式人員參考手冊。如果您想知道更多有關ADO MD的資料，則請參考底下的主題：

  • 多維結構敘述與資料的概論

  • 多維資料的使用

  • 在 ADO 中使用 ADO MD 的方法

  • 在程式中使用 ADO MD 的方法

  • ADO MD Object 模式


多維結構敘述與資料的綜覽

認識多維結構敘述

在 ADO MD中，集中的超資料物件稱為 cube，它包含了一組結構化且相互關聯的維數、階層、層次、以及成員。

維數的意義指的是位於多維資料庫中一組獨立的資料，這是由您的業務項目所衍生出來的。維數通常包含了可用來做為查詢準則的項目，這些準則是做為資料庫測量之用的。

階層是維數集合的路徑。維數可能擁有多層次的粒子，彼此間存在著父與子的關係。階層的作用就是在定義這些層次間的關聯方式。

層次指的是在階層中的集合步驟。對具有多層資料的維數來說，每一層都代表了一個層次。

成員則是維數中的一個資料項目。通常，您可以使用成員建立標題、或描述資料庫的量測。

在ADO MD中，Cube是由 CubeDef 物件所代表的。維數、階層、層次、以及成員也都由對應的ADO MD物件來表示，它們分別是：Dimension、Hierarchy、Level、以及 Member。

維數

Cube的維數要視您在資料庫中要建構的業務項目與資料類型而定，通常，每個維數都代表一個獨立的輸入點、或選取資料的機制。

舉例來說，包含銷售資料的cube有底下五個維數：Salesperson、Geography、Time、Products、與 Measures。Measures 維數包含了真正的銷售資料數值，其它的維數呈現的則是將這些數值進行分類的方式。

Geography 維數包含了底下的成員組：

{All, North America, Europe, Canada, USA, UK, Germany, Canada-West,
Canada-East, USA-NW, USA-SW, USA-NE, USA-SE, England, Scotland,
Wales,Ireland, Germany-North, Germany-South, Ottawa, Toronto,
Vancouver, Calgary, Seattle, Boise, Los Angeles, Houston,
Shreveport, Miami, Boston, New York, London, Dover, Glasgow,
Edinburgh, Cardiff, Pembroke, Belfast, Londonderry, Berlin,
Hamburg, Munich, Stuttgart}

階層

階層所定義的，是不同層次的維數可以被加總的方式。一個維數可以擁有一個以上的階層，在 Geography 維數中存在了一個自然的階層：

層次

在前個圖形的範例 Geography 維數中，每個方塊都代表了階層中的一個層次。

每個層次都有一組成員，它們的內容如下：

  • The World = {All}

  • Continents = {North America, Europe}

  • Countries = {Canada, USA, UK, Germany}

  • Regions = {Canada-East, Canada-West, USA-NE, USA-NW, USA-SE, USA-SW, England, Ireland, Scotland, Wales, Germany-North, Germany-South}

  • Cities = {Ottawa, Toronto, Vancouver, Calgary, Seattle, Boise, Los Angeles, Houston, Shreveport, Miami, Boston, New York, London, Dover, Glasgow, Edinburgh, Cardiff, Pembroke, Belfast, Londonderry, Berlin, Hamburg, Munich, Stuttgart}

成員

在階層的葉層次的成員就沒有 children，而在根層次的成員則沒有 parent。所有其它的成員至少都會有一個 parent 與 children。比方說，在 Geography 維數中做個局部的審查，就會發現底下的 parent-children 關係：

  • {All} (parent of) {Europe, North America}

  • {North America} (parent of) {Canada, USA}

  • {USA} (parent of) {USA-NE, USA-NW, USA-SE, USA-SW}

  • {USA-NW} (parent of) {Boise, Seattle}

成員可以依每個維數的一個、或更多階層予以合併，讓我們考慮 Time 維數的情況，我們有兩種方式可以從 Days 層次加總到 Year 的層次：

這個範例也說明了另一項特徵：有些 Year-Week 階層的 Week 層次中的成員，並沒有出現在 Year-Quarter 階層的任何層次當中。因此，一個階層並不一定要包括所有維數的成員。


多維資料的使用

儲存格組 (cellset) 是查詢多維資料後的結果。它包含了一組軸，通常不會超過四個，一般來說都只有二、或三個。軸 (axis)是一個、或一個以上的維數成員的集合體，用來找出、或過濾 cube 中特定的數值。

位置 (position) 指的是軸上的一個點，對包含單一維數的軸來說，這些位置都是維數成員的子集合。如果軸包含了一個以上的維數時，每個位置就成了組合的項目，它擁有 n 個部份，其中的n代表的是該軸維數的數目。位置的每個部份都是構成維數中的某個成員。

舉例來說，在某個包含銷售資料的cube中，如果它的 Geography 與 Product 維數是沿著儲存格組的x軸的，沿著這條軸的位置可能包含 "USA" 與"Computers" 的成員。在這個範例中，如果要沿著x軸決定某個位置的話，需要每個維數的成員都沿著這條軸存在。

一個儲存格 (cell) 指的是在軸交叉處的物件。每個儲存格都有多重的資料，包括資料本身、格式化的字串（儲存格資料的可顯示形式）、以及儲存格的序號。（每個儲存格在儲存格組中都有一個唯一的序號，在儲存格組中第一個儲存格的序號為 0，在儲存格組中第二列的最左側、帶有八個資料欄的儲存格的序號則為8。）

比方說，有個cube擁有底下六個維數（請注意這個cube的結構敘述與在多維結構敘述和資料 範例中的有些許的不同）：

  • Salesperson

  • Geography (自然的階層) — Continents, Countries, States, 等等

  • Quarters—Quarters, Months, Days

  • Years

  • Measures—Sales, PercentChange, BudgetedSal%s

  • Products

底下的儲存格組所呈現的，是 1991 年所有產品的銷售資料：

注意 在本範例中的儲存格數值，可以依軸位置順序予以檢視，其中第一個數字表示的是 x 軸的位置、而第二個數字則代表 y 軸的位置。

這個儲存格組的特徵如下：

  • Axis 維數: Quarters, Salesperson, Geography

  • Filter 維數: Measures, Years, Products

  • 兩軸: COLUMN (x, 或 Axis 0) 與 ROW (y, 或 Axis 1)

  • x-軸: 兩個巢狀的維數, Salesperson 與 Geography

  • y-軸: Quarters 維數

其中的x-軸有兩個巢狀的維數，也就是 Salesperson 與 Geography。從 Geography 中，選取了四個成員：Seattle, Boston, USA-South, 與 Japan。從 Salesperson 中，則選取了二個成員：Valentine 與 Nash。這就在該軸上產生了總數為八的位置(8 = 4*2)。

每個座標都代表了一個擁有兩個成員的位置，其中一個成員來自 Salesperson 維數、另一個則從Geography 維數而來：

(Valentine, Seattle), (Valentine, Boston), (Valentine, USA_North),
(Valentine, Japan), (Nash, Seattle), (Nash, Boston), (Nash, USA_North),
(Nash, Japan)

而y-軸則只有一個維數，包含了底下八個位置：

Jan, Feb, Mar, Qtr2, Qtr3, Oct, Nov, Dec

在ADO MD中，儲存格組、儲存格、軸、與位置都由對應的物件來表示，它們分別是：Cellset, Cell, Axis, 與 Position。


在 ADO 中使用 ADO MD 的方法

ADO 與 ADO MD 是彼此關聯、但分開存在的物件模式。ADO 所提供的物件，作用都是在連接資料來源、執行指令、在表格格式中擷取表格資料與結構敘述、以及檢視提供者錯誤訊息。ADO MD所提供的物件，作用則在擷取多維資料、以及檢視多維結構敘述的超資料。

當使用MDP時，您可以在應用程式中選擇使用 ADO、ADO MD、或兩者。透過參考在您的專案中的兩個程式庫，您可以充分使用您的MDP所提供的功能。

對消費者來說，以平面、表格的方式檢視多維資料組通常是很有用的做法。您可以用ADO Recordset物件執行這項作業。將 Cellset 的來源指定為 Recordset 的 Open 方法的 Source 參數，而不是 ADO MD Cellset 的來源

另外，以表格檢視、而不是物件階層方式檢視結構敘述的超資料也相當有用。在 Connection 物件上的ADO OpenSchema 方法，讓使用者可以開啟一個包含結構敘述資料的 Recordset。OpenSchema 方法的 QueryType 參數有許多數值，都是特別與 MDP 有關的，這些數值分別是：

  • adSchemaCubes

  • adSchemaDimensions

  • adSchemaHierarchies

  • adSchemaLevels

  • adSchemaMeasures

  • adSchemaMembers

為了要將 ADO enum 數值與 ADO MD 的屬性或方法共用，您的專案必須同時參考 ADO 與 ADO MD 的程式庫。舉例來說，您可以將 ADO adState enum數值與 ADO MD 的 State 屬性一起使用。如果您想對如何建立與程式庫的參考取得更多的資料的話，請參閱開發工具的相關文件。

如果您想對 ADO 物件與方法知道更多的話，則請參閱 ADO Programmer’ s Reference。


在程式中使用 ADO MD 的方法

為了要將 ADO MD 與您的開發工具一起使用，您應該與 ADO MD 類型程式庫建立參考的關係。ADO MD程式庫的說明是 Microsoft ActiveX Data Objects (Multi-dimensional) Library。ADO MD 程式庫的檔名為 msadomd.dll，而它的程式ID(ProgID)為 "ADOMD"。如果您想對如何建立與程式庫的參考取得更多的資料的話，請參閱開發工具的相關文件。


ADO MD API 參考資訊

ADO MD 文件在本章節裡包含了每個 ADO MD 物件，集合物件，方法，及屬性的主題，同時在合適的地方加上範例程式碼。要取得更多的資訊，請在索引裡搜尋特定的主題，或是直接參考下列主題：

  • ADO MD 物件

  • ADO MD 集合物件

  • ADO MD 方法

  • ADO MD 屬性

  • ADO MD 範例


ADO MD 物件模型

ADO MD 物件模式

下列的圖示顯示這些物件在 ADO MD 裡所代表的意義及彼此的關係。

Axis 及 Cell 物件都有一個 Positions 集合物件。

Level 及 Position 物件都有一個 Members 集合物件。

Axis, Cell, Cellset, CubeDef, Dimension, Hierarchy, Level, 及 Member 物件都有一個標準的 ADO Properties 集合物件。


ADO MD 物件

ADO MD 物件摘要

物件 | 說明
Axis | 代表一個儲存格集合物件位置上或條件上的軸，包含所選取的一或多維的成員。
Catalog | 包含某個多維資料提供者 (MDP) 的多維結構敘述資訊 (也就是立方體及基本維度，階層架構，等級及成員等)。
Cell | 代表包含在一個儲存格集合物件裡，軸座標交叉點的資料。
Cellset | 代表一個多維查詢的結果。它是一個由立方體或其它儲存格集合物件所選取的儲存格集合物件。
CubeDef | 由多維結構敘述來表示一個立方體，包含一組相關的維度。
Dimension | 代表多維立方體的其中一個維度，包含成員的一或多個階層架構。
Hierarchy | 代表一個維度的成員能被聚合或包裹起來的方式。一個維度能由一或多個階層架構所聚合而成。
Level | 包含一組成員，每個在階層架構裡都有相同的等級。
Member | 代表一個在立方體裡等級的成員，一個等級的成員的 child，或是一個在儲存格集合物件的軸上位置的成員。
Position | 代表在軸上定義一個點的不同維度，它的一組一或多個成員。

同時，Catalog 物件被連接到一個 ADO Connection 物件，這個物件包含在標準的 ADO 程式庫裡 :

物件 | 說明
Connection | Connection 物件代表一個連至資料來源的連接。

關於這些物件的關於說明會在 ADO MD 物件模式說明。

很多的 ADO MD 物件都能被包含在一個相關的集合物件裡；例如一個 CubeDef 物件能被包含在一個 Catalog 的 CubeDefs 集合物件裡。 要取得更多的資訊，請參閱 ADO MD 集合物件。


Axis 物件 (ADO MD)

Axis 物件

代表一個儲存格集合物件位置上或條件上的軸，包含所選取的一或多維的成員。

備註

一個 Axis 物件能被包含在一個 Axes 集合物件裡，或是由一個 Cellset 的 FilterAxis 屬性所傳回。

以 Axis 物件的集合物件和屬性，您可以達成下列目的：

  • 以 Name 屬性來識別 Axis。

  • 使用 Positions 集合物件在 Axis 上找出每個位置。

  • 以 DimensionCount 屬性取得 Axis 上維度的數目。

  • 以標準的 ADO Properties 集合物件來取得 Axis 的提供者特定的屬性。


Catalog 物件 (ADO MD)

Catalog 物件

包含某個多維資料提供者 (MDP) 的多維結構敘述資訊 (也就是立方體及基本維度，階層架構，等級及成員等)。

備註

以 Catalog 物件的集合物件和屬性，您可以達成下列目的：

  • 將 ActiveConnection 屬性設定至一個標準的 ADO Connection 物件或設為一個有效的連接字串，來開啟這個目錄。

  • 以 Name 屬性來識別 Catalog。

  • 以 CubeDefs 集合物件來取得目錄裡的立方體。


Cell 物件 (ADO MD)

Cell 物件

代表包含在一個儲存格集合物件裡，軸座標交叉點的資料。

備註

一個 Cell 物件是由 Cellset 物件的 Item 方法所傳回。

以 Cell 物件的集合物件和屬性，您可以達成下列目的：

  • 以 Value 屬性傳回在 Cell 裡的資料。

  • 以 FormattedValue 屬性傳回 Value 屬性在格式化顯示後的字串。

  • 以 Ordinal 屬性傳回這個 Cell 在 Cellset 裡的序數值。

  • 以 Positions 集合物件判斷這個 Cell |b CubeDef 裡的位置。

  • 以標準的 ADO Properties 集合物件取得關於這個 Cell 的其它資訊。

Properties 集合物件包含提供者所提供的屬性。下列的表格列出可能有效的屬性；實際的屬性列表可能會依提供者的實作而有所不同。請參閱您提供者的文件以取得一個較完全的有效屬性列表。

名稱 | 說明
BackColor | 當顯示這個儲存格時所使用的背景顏色
FontFlags | 對字型有不同影響的圖點遮罩。
FontName | 顯示儲存格值的字型
FontSize | 顯示儲存格值的字型大小。
ForeColor | 顯示儲存格時的前景顏色
FormatString | 以格式化字串顯示的值。


Cellset 物件 (ADO MD)

Cellset 物件

代表一個多維查詢的結果。它是一個由立方體或其它儲存格集合物件所選取的儲存格集合物件。

備註

在 Cellset 裡的資料是以直接，陣列式的存取來取得。您可以直接指定某個成員來取得這個成員的資料。例如：下列的程式碼會傳回名為 cst 的儲存格集合物件裡的第一個軸上，在第一個位置的第一個成員的標題：

cst.Axes(0).Positions(0).Members(0).Caption

在儲存格集合物件裡沒有目前儲存格的觀念。取而代之的是以 Item 方法自儲存格集合物件裡取得特定的 Cell 物件。Item 方法的引數決定取得那一個儲存格。您可以指定一個儲存格唯一的序數值。也可以在這個儲存格集合物件的每個軸上使用位置號碼來取得儲存格。要得到關於取得儲存格更多的資訊，請參閱 Item 方法。

以 Cellset 物件的集合物件，方法和屬性，您可以達成下列目的：

  • 藉由設定 ActiveConnection 屬性將一個開啟的連接和 Cellset 物件連接起來。

  • 以 Open 方法執行及取得多維查詢的結果。

  • 以 Item 方法由 Cellset 取得 Cell 物件。

  • 以 Axes 集合物件傳回定義 Cellset 的 Axis 物件。

  • 以 FilterAxis 屬性來取得關於用來過濾 Cellset 裡資料的 Dimensions 資訊。

  • 以 Source 屬性傳回或指定用來定義 Cellset 的查詢。

  • 以 State 屬性傳回 Cellset 目前的狀態 (開啟，關閉，執行中，或連接中)。

  • 以 Close 方法關閉一個已開啟的 Cellset。

  • 以標準的 ADO Properties 集合物件取得關於 Cellset 的提供者特定資訊。


CubeDef 物件 (ADO MD)

CubeDef 物件

由多維結構敘述來表示一個立方體，包含一組相關的維度。

備註

以 CubeDef 物件的集合物件和屬性，您可以達成下列目的：

  • 以 Name 屬性來識別 CubeDef。

  • 以 Description 屬性傳回說明這個立方體的字串。

  • 以 Dimensions 集合物件傳回組成這個立方體的 Dimension。

  • 以標準的 ADO Properties 集合物件取得關於這個 CubeDef 的額外資訊。

Properties 集合物件包含了提供者所提供的屬性。下列的表格列出可能有效的屬性；實際的屬性列表可能會依提供者的實作而有所不同。請參閱您提供者的文件以取得一個較完全的有效屬性列表。

名稱 | 說明
CatalogName | 這個立方體所屬的 catalog 的名稱。
CreatedOn | 這個立方體產生的日期及時間。
CubeGUID | 立方體 GUID。
CubeName | 立方體的名稱。
CubeType | 立方體的類型。
DataUpdatedBy | 做最後資料更新那個人的使用者 ID。
Description | 這個立方體有意義的說明。
LastSchemaUpdate | 結構敘述最後更新的日期及時間。
SchemaName | 這個立方體所屬結構敘述的名稱。
SchemaUpdatedBy | 做最後結構敘述更新那個人的使用者 ID。


Dimension 物件 (ADO MD)

Dimension 物件

代表多維立方體的其中一個維度，包含成員的一或多個階層架構。

備註

以 Dimension 物件的集合物件和屬性，您可以達成下列目的：

  • 以 Name 及 UniqueName 屬性來識別 Dimension。

  • 以 Description 屬性傳回一個說明 Dimension 有意義的字串。

  • 以 Hierarchies 集合物件傳回組成這個 Dimension 的Hierarchy 物件。

  • 使用標準的 ADO Properties 集合物件來取得關於 Dimension 物件的額外資訊。

Properties 集合物件包含了提供者所提供的屬性。下列的表格列出可能有效的屬性；實際的屬性列表可能會依提供者的實作而有所不同。請參閱您提供者的文件以取得一個較完全的有效屬性列表。

名稱 | 說明
CatalogName | 這個立方體所屬的 catalog 的名稱。
CubeName | 立方體的名稱。
DefaultHierarchy | 預設 hierarchy 唯一的名稱。
Description | 這個立方體有意義的說明。
DimensionCaption | 和這個 Dimension 相關連的標籤或標題。
DimensionCardinality | 在 Dimension 裡的成員數目。
DimensionGUID | Dimension 的 GUID。
DimensionName | 這個 Dimension 的名稱。
DimensionOrdinal | 這個 Dimension 在組成立方體的這群 Dimension 中的序號。
DimensionType | Dimension 的類型。
DimensionUniqueName | 這個 Dimension 明白清楚的名稱。
SchemaName | 這個立方體所屬結構敘述的名稱。


Hierarchy 物件 (ADO MD)

Hierarchy 物件

代表一個維度的成員能被聚合或包裹起來的方式。一個維度能由一或多個階層架構所聚合而成。

備註

以 Hierarchy 物件的集合物件和屬性，您可以達成下列目的：

  • 以 Name 及 UniqueName 屬性來識別 Hierarchy。

  • 以 Description 屬性傳回一個說明 Hierarchy 有意義的字串。

  • 以 Levels 集合物件傳回組成 Hierarchy 的 Level 物件。

  • 使用標準的 ADO Properties 集合物件來取得關於 Hierarchy 物件的額外資訊。

Properties 集合物件包含了提供者所提供的屬性。下列的表格列出可能有效的屬性；實際的屬性列表可能會依提供者的實作而有所不同。請參閱您提供者的文件以取得一個較完全的有效屬性列表。

名稱 | 說明
AllMember | 在這個 hierarchy 裡等級最高的成員。
CatalogName | 這個立方體所屬的 catalog 的名稱。
CubeName | 立方體的名稱。
DefaultMember | 這個 hierarchy 的預設成員唯一的名稱。
Description | 這個 hierarchy 有意義的說明。
DimensionType | 這個 hierarchy 所屬 Dimension 的類型。
DimensionUniqueName | 這個 Dimension 明白清楚的名稱。
HierarchyCaption | 和這個 hierarchy 相關連的標籤或標題。
HierarchyCardinality | 在這個 hierarchy 裡成員的數目。
HierarchyGUID | 這個 hierarchy 的 GUID。
HierarchyName | 這個 hierarchy 的名稱。
HierarchyUniqueName | 這個 hierarchy 明白清楚的名稱。
SchemaName | 這個立方體所屬結構敘述的名稱。


Level 物件 (ADO MD)

Level 物件

包含一組成員，每個在階層架構裡都有相同的等級。

備註

以 Level 物件的集合物件和屬性，您可以達成下列目的：

  • 以 Name 及 UniqueName 屬性來識別 Level 。

  • 以 Caption 屬性傳回顯示這個 Level 時使用的字串。

  • 以 Description 屬性傳回一個說明 Level 有意義的字串。

  • 以 Members 集合物件傳回組成 Level 的 Member 物件。

  • 以 Depth 屬性傳回由 Level 的根開始的層級數目。

  • 使用標準的 ADO Properties 集合物件來取得關於 Level 物件的額外資訊。

Properties 集合物件包含了提供者所提供的屬性。下列的表格列出可能有效的屬性；實際的屬性列表可能會依提供者的實作而有所不同。請參閱您提供者的文件以取得一個較完全的有效屬性列表。

名稱 | 說明
CatalogName | 這個立方體所屬的 catalog 的名稱。
CubeName | 立方體的名稱。
Description | 這個 level 有意義的說明。
DimensionUniqueName | 這個 Dimension 明白清楚的名稱。
HierarchyUniqueName | 這個 hierarchy 明白清楚的名稱。
LevelCaption | 和這個 level 相關連的標籤或標題。
LevelCardinality | 在一個 level 裡 member 的數目。
LevelGUID | Level 的 GUID。
LevelName | Level 的名稱。
LevelNumber | 在這個 level 和 hierarchy 根部之間的距離。
LevelType | Level 的類型。
LevelUniqueName | 這個 level 明白清楚的名稱。
SchemaName | 這個立方體所屬結構敘述的名稱。


Member 物件 (ADO MD)

Member 物件

代表一個在立方體裡等級的成員，一個等級的成員的 children，或是一個在儲存格集合物件的軸上位置的成員。

備註

一個 Member 的屬性依使用的內容而不同。在 CubeDef 裡，一個 Level 的 Member 有一個 Children 屬性，它會傳回這個 hierarchy 裡目前 Member 的下一層 Members。對一個 Position 的 Member，Children 集合物件總是空的。同時，Type 屬性只適用 Level 的 Members。

Position 的 Member 有兩個屬性—DrilledDown 及 ParentSameAsPrev—在顯示 Cellset 時是有用的。 如果您在 Level 的 Member 時存取這些屬性，就會發生錯誤。

以 Level 的 Member 物件的集合物件和屬性，您可以達成下列目的：

  • 以 Name 及 UniqueName 屬性來識別這個 Member。

  • 以 Caption 屬性傳回顯示這個 Member 時使用的字串。

  • 以 Description 屬性傳回一個說明度量或公式 Member 有意義的字串。

  • 以 Type 屬性判斷 Member 的種類。

  • 以LevelDepth 及 LevelName 屬性取得關於這個 Member 的 Level 資訊。

  • 以 Parent 及 Children 屬性取得一個 Hierarchy 裡相關的 Members。

  • 以 ChildCount 屬性累計 Member child 的數目。

  • 使用標準的 ADO Properties 集合物件來取得關於 Level 物件的額外資訊。

循著 Axis 上的 Position 的一個 Member，以它的集合物件和屬性，您可以達成下列目的：

  • 以 Name 及 UniqueName 屬性來識別這個 Member。

  • 以 Caption 屬性傳回顯示這個 Member 時使用的字串。

  • 以 Description 屬性傳回一個說明度量或公式 Member 有意義的字串。

  • 以LevelDepth 及 LevelName 屬性取得關於這個 Member 的 Level 資訊。

  • 以 ChildCount 屬性累計 Member children 的數目。

  • 使用 DrilledDown 屬性來判斷在 Axis 上是否至少有一個 children 緊接著這個 Member。

  • 使用 ParentSameAsPrev 屬性來判斷這個 Member 的 parent 是否和前一個 Member 的 parent 相同。

  • 使用標準的 ADO Properties 集合物件來取得關於 Level 物件的額外資訊。

Properties 集合物件包含了提供者所提供的屬性。下列的表格列出可能有效的屬性；實際的屬性列表可能會依提供者的實作而有所不同。請參閱您提供者的文件以取得一個較完全的有效屬性列表。

名稱 | 說明
CatalogName | 這個立方體所屬的 catalog 的名稱。
ChildrenCardinality | 這個 member 所屬的 children 數目
CubeName | 立方體的名稱。
Description | 這個成員有意義的說明。
DimensionUniqueName | 這個 Dimension 明白清楚的名稱。
HierarchyUniqueName | 這個 hierarchy 明白清楚的名稱。
LevelNumber | 在這個 level 和 hierarchy 根部之間的距離。
LevelUniqueName | 這個 level 明白清楚的名稱。
MemberCaption | 和這個 member 相關連的標籤或標題。
MemberGUID | Member 的 GUID
MemberName | Member 的名稱。
MemberOrdinal | Member 的序號。
MemberType | Member 的類型。
MemberUniqueName | 這個 member 明白清楚的名稱。
ParentCount | 這個 member 所屬 parent 的數目。
ParentLevel | 這個 member parent 的 level 數目。
ParentUniqueName | 這個 member parent明白清楚的名稱。
SchemaName | 這個立方體所屬結構敘述的名稱。


Position 物件 (ADO MD)

Position 物件

代表在軸上定義一個點的不同維度，它的一組一或多個成員。

備註

以 Position 物件的集合物件和屬性，您可以達成下列目的：

  • 使用 Ordinal 屬性來傳回循著 Axis 的 Position 順序位置。

  • 使用標準的 ADO Properties 集合物件來取得關於 Axis 物件的額外資訊。


ADO MD 集合物件

ADO MD 集合物件總覽

集合物件 | 描述
Axes | 包含定義一個 cellset 的 Axis 物件。
CubeDefs | 在多維 catalog 裡包含一個代表的立方體的 CubeDef 物件。
Dimensions | 包含組成一個立方體的 Dimension 物件。
Hierarchies | 在一個 dimension 裡包含這組 Hierarchy 物件。
Levels | 包含組成一個 hierarchy 的 Level 物件。
Members | 在 axis 上的一個 level 或一個 position 裡，包含這個 Member 物件。
Positions | 在 axis 上包含定義一點的 Position 物件。


Axes 集合物件 (ADO MD)

Axes 集合物件

包含定義一個 cellset 的 Axis 物件。

備註

Cellset 物件包含一個 Axes 集合物件。一旦 Cellset 開啟之後，這個集合物件至少會包含一個 Axis。請參閱 Axis 物件以取得更多如何使用 Axis 物件的說明細節。

請注意 一個 Cellset 的條件式 axis 並不包含在 Axes 集合物件裡。請參閱 FilterAxis 屬性以取得更多的資訊。

Axes 是一個標準的集合物件。利用這個集合物件的屬性及方法，您可以達成下列目的：

  • 以 Count 屬性取得這個集合物件裡所包含物件的數目。

  • 以預設的 Item 方法自這個集合物件傳回一個所包含的物件。

  • 以 Refresh 方法讓提供者更新這個集合物件裡的物件。


CubeDefs 集合物件 (ADO MD)

CubeDefs 集合物件

在多維 catalog 裡包含一個代表的立方體的 CubeDef 物件。

備註

CubeDefs 是一個標準的集合物件。利用這個集合物件的屬性及方法，您可以達成下列目的：

  • 以 Count 屬性取得這個集合物件裡所包含物件的數目。

  • 以預設的 Item 方法自這個集合物件傳回一個所包含的物件。

  • 以 Refresh 方法讓提供者更新這個集合物件裡的物件。


Dimensions 集合物件 (ADO MD)

Dimensions 集合物件

包含組成一個立方體的 Dimension 物件。

備註

Dimensions 是一個標準的集合物件。利用這個集合物件的屬性及方法，您可以達成下列目的：

  • 以 Count 屬性取得這個集合物件裡所包含物件的數目。

  • 以預設的 Item 方法自這個集合物件傳回一個所包含的物件。

  • 以 Refresh 方法讓提供者更新這個集合物件裡的物件。


Hierarchies 集合物件 (ADO MD)

Hierarchies 集合物件

在一個 dimension 裡包含這組 Hierarchy 物件。

備註

Hierarchies 是一個標準的集合物件。利用這個集合物件的屬性及方法，您可以達成下列目的：

  • 以 Count 屬性取得這個集合物件裡所包含物件的數目。

  • 以預設的 Item 方法自這個集合物件傳回一個所包含的物件。

  • 以 Refresh 方法讓提供者更新這個集合物件裡的物件。


Levels 集合物件 (ADO MD)

Levels 集合物件

包含組成一個 hierarchy 的 Level 物件。

備註

Levels 是一個標準的集合物件。利用這個集合物件的屬性及方法，您可以達成下列目的：

  • 以 Count 屬性取得這個集合物件裡所包含物件的數目。

  • 以預設的 Item 方法自這個集合物件傳回一個所包含的物件。

  • 以 Refresh 方法讓提供者更新這個集合物件裡的物件。


Members 集合物件 (ADO MD)

Members 集合物件

在 axis 上的一個 level 或一個 position 裡，包含這個 Member 物件。

備註

一個 Members 集合物件會包含下列類型的 member：

  • 在一個立方體裡組成一個 level 的 member。他們包含在 Level 物件的 Members 集合物件裡。例如，在 多維 Schemas 及資料的總覽 的範例裡，Countries level 的四個 member 分別是 Canada, USA, UK, 和 Germany。

  • 在一個 hierarchy 裡，這個 members 是特定 member 的子孫。這些 members 是由父親 Member 物件的 Children 屬性所傳回的。例如，我們再使用一次相同的範例，Canada member 的兩個子孫是 Canada-East 和 Canada-West。

  • 這個 member 定義 cellset 裡的 axis 上特定的位置。我們以 以多維的資料運作 作為範例說明如何使用 cellset，在 x-axis 上第一個 position 的兩個 members 是 Valentine 和 Seattle。這些 members 是包含在 Position 物件的 Members 集合物件裡。

Members 是一個標準的集合物件。利用這個集合物件的屬性及方法，您可以達成下列目的：

  • 以 Count 屬性取得這個集合物件裡所包含物件的數目。

  • 以預設的 Item 方法自這個集合物件傳回一個所包含的物件。

  • 以 Refresh 方法讓提供者更新這個集合物件裡的物件。


Positions 集合物件 (ADO MD)

Positions 集合物件

在 axis 上包含定義一點的 Position 物件。

備註

Positions 是一個標準的集合物件。利用這個集合物件的屬性及方法，您可以達成下列目的：

  • 以 Count 屬性取得這個集合物件裡所包含物件的數目。

  • 以預設的 Item 方法自這個集合物件傳回一個所包含的物件。

  • 以 Refresh 方法讓提供者更新這個集合物件裡的物件。


ADO MD Methods

ADO MD 方法

ADO MD 方法摘要

方法 | 說明
Close | 關閉一個開啟的 cellset。
Item | 由一個 cellset 裡以座標取得一個 cell。
Item | 使用名稱或序號傳回集合物件裡指定的成員。
Open | 取得多維查詢的結果，同時傳回結果至一個 cellset。
Refresh | 更新在集合物件裡的物件，以反映出針對提供者特定的有效物件。


Close Method (ADO MD)

Close 方法

關閉一個開啟的 cellset。

語法

Cellset.Close

備註

使用 Close 方法來關閉一個 Cellset 物件，釋放相關連的資料；包括任何在相關的 Cell, Axis, Position, 或 Member 物件裡的資料。關閉一個 Cellset 並不會真的自記憶體中刪除；之後你仍可以變更它的屬性設定及重新開啟它。要完全將一個物件自記憶體中刪除，請設定這個物件變數為 Nothing。

您可以在之後呼叫 Open 方法，以相同或另一個來源字串再開啟這個 Cellset。當這個 Cellset 物件關閉了後，取得任何屬性或呼叫任何會參考到基本資料或中間資料的方法都會產生錯誤。


Item Method (ADO MD Cellset)

Item 方法 (Cellset)

由一個 cellset 裡以座標取得一個 cell。

語法

Set Cell = Cellset.Item ( Positions )

參數

Positions 唯一指定一個 cell 的值的 Variant Array。 Positions 可以是下列項目之一：

  • 位置號碼的陣列

  • 成員名稱的陣列

  • 順序上的位置

備註

使用 Item 方法來傳回一個在 Cellset 物件裡的 Cell 物件。如果 Item 方法無法找到 Positions 引數所相對的 cell，會產生一個錯誤。

Item 方法是 Cellset 物件的預設方法。下列的語法形式是可以互換的：

Cellset.Item ( Positions )

Cellset ( Positions )

Positions 引數指定傳回那個 cell。您可以利用順序的位置或循著每個 axis 的位置指定 cell。當您循著每個 axis 的位置指定 cell 時，您可以指定位置的數值或是每個位置成員的名稱。

順序的位置是一個在 Cellset 裡唯一識別一個 cell 的號碼。在觀念上， cells 在一個 Cellset 的編號方式有如 Cellset 是一個 p 維的陣列；而 p 是 axes 的數目。Cells 是以列為主來編號排序的。下面是計算一個 cell 序號的公式：

如果成員名稱是以字串形式傳至 Item，這個成員必須以數值 axis 識別項遞增的順序列出。在一個 axis 裡， 成員必須以 dimension 巢狀遞增的順序列出 — 也就是說，最外面的 dimension 成員放第一個，再來放較裡面的 dimensions。每個 dimension 應該表示成一個個別的字串，同時成員字串的列表應該以逗點分開。

注意 您的資料提供者可能不支援由成員名稱取得 cells 的方式。請參閱您提供者的文件以取得更多的資訊。


Open Method (ADO MD)

Open 方法

取得多維查詢的結果，同時傳回結果至一個 cellset。

語法

Cellset.Open Source, ActiveConnection

參數

Source 可省略的。一個 Variant 變數，用來辨識是否為一個有效的多維查詢 (例如一個多維陳述式(MDX)查詢) 。 Source 引數相對於 Source 屬性。要取得更多關於 MDX 的資訊，請參閱 Microsoft Data Access SDK。

ActiveConnection 可省略的。 一個 Variant 變數，用來辨識指定的字串是一個有效的 ADO Connection 物件變數名稱或是一個連接的定義。 ActiveConnection 引數指定開啟 Cellset 物件的連接。如果您對這個引數傳入一個連接定義，ADO 會使用指定的參數開啟一個新的連接。 ActiveConnection 引數相對於 ActiveConnection 屬性。

備註

呼叫 Open 方法時，如果省略了它的參數，或是在開啟這個 Cellset 之前尚未設定相關的屬性值，會產生一個錯誤。


ADO MD 屬性

ADO MD 屬性總覽

屬性 | 說明
ActiveConnection | 表示目前的 cellset 或 catalog 是屬於那一個 ADO Connection 物件。
Caption | 表示當顯示一個 Level 或 Member 物件時所使用的文字標題。
ChildCount | 表示 parent 是目前 Member 物件的 members 數目。
Children | 傳回一個 Members 集合物件，而目前的 Member 在 hierarchy 裡是它的 parent。
Count | 表示在一個集合物件裡物件的數目。
Depth | 表示在 hierarchy 的根及一個 Level 之間， levels 的數目。
Description | 傳回目前物件的文字解釋。
DimensionCount | 表示在一個 axis 上的 dimensions 數目。
DrilledDown | 表示這個 member 是否可以再繼續往下深入。
FilterAxis | 表示關於目前 cellset 的條件式資訊。
FormattedValue | 表示一個 cell 值經格式化後的輸出。
LevelDepth | 表示在 hierarchy 的根及一個 member 之間， levels 的數目。
LevelName | 表示一個 member 裡，這個 level 的名稱。
Name | 表示一個物件的名稱。
Ordinal (Cell) | 在一個 cellset 裡，以它的位置唯一的識別一個 cell。
Ordinal (Position) | 在一個 axis 上，唯一的識別一個位置。
Parent | 表示在一個 hierarchy 裡，這個 member 是目前 member 的 parent。
ParentSameAsPrev | 表示在這個位置 member 的 parent 是否和它前一個 member 的 parent 是相同的。
Source | 表示在這個 cellset 裡資料的來源。
State | 表示這個 cellset 的目前狀態。
Type | 表示目前 member 的類型。
UniqueName | 表示目前物件的一個明白清楚的名稱。
Value | 表示目前 cell 的值。


ActiveConnection 屬性 (ADO MD)

ActiveConnection 屬性

表示目前的 cellset 或 catalog 是屬於那一個 ADO Connection 物件。

設定及傳回值

設定或傳回一個 Variant，裡面包含了一個定義連接的字串或 Connection 物件。 預設值是空的。

備註

您可以設定這個屬性為一個有效的 ADO Connection 物件，或是一個有效的連接字串。當這個屬性設定為連接字串時，提供者會使用這個定義來產生一個新的 Connection 物件，同時開啟這個連接。

如果您使用 Open 方法的 ActiveConnection 引數來開啟 Cellset 物件，ActiveConnection 屬性會繼承這個引數的值。

將一個 Catalog 物件的 ActiveConnection 屬性設為 Nothing 會釋放相關的資料，包括在 CubeDefs 集合物件裡的資料及任何相關的 Dimension， Hierarchy， Level，及 Member 物件。 關閉一個用來開啟 Catalog 的 Connection 物件和設定 ActiveConnection 屬性為 Nothing 的效果是一樣的。

如果您試著變更一個已開啟的 Cellset 物件的 ActiveConnection 屬性，會發生錯誤。

請注意 在 Visual Basic®，當設定 ActiveConnection 屬性至一個 Connection 物件時，記得使用 Set 關鍵字。如果您省略了 Set 關鍵字，您會真的設定 ActiveConnection 屬性等於 Connection 物件的預設屬性： ConnectionString。無論如何，這段程式碼還是可以運作，但您會產生了一個額外的連接到資料來源，這可能對執行效能有負面的影響。

當使用 MSOLAP 資料提供者時， 將資料來源設定為指向伺服器名稱的連接字串，同時設定起始的 catalog 為一個由資料來源的 catalog 名稱。要連接至一個已和伺服器中斷連接的立方體檔案，將 .CUB 檔案設為完整的路徑。任其中一種情形，將提供者設定為提供者名稱。例如，下列的字串會連接至 Servername 伺服器上的一個名為 Bobs Video Storeprovider 的 catalog，使用 MSOLAP 提供者：

"Data Source=Servername;Initial Catalog=Bobs Video Store;Provider=msolap"

下列字串連接至一個本地的立方體檔案，位置在 C:\MSDASDK\samples\oledb\olap\data\bobsvid.cub:

"Location=C:\MSDASDK\samples\oledb\olap\data\bobsvid.cub;Provider=msolap"


Caption 屬性 (ADO MD)

Caption 屬性

表示當顯示一個 Level 或 Member 物件時所使用的文字標題。

傳回值

傳回一個 String ，同時是唯讀的。


ChildCount 屬性 (ADO MD)

ChildCount 屬性

表示 parent 是目前 Member 物件的 members 數目。

傳回值

傳回一個 Long integer 集合物件，同時是唯讀的。

備註

使用 ChildCount 屬性傳回一個 Member children 數目的估算。 Member 實際的 children 可以由 Children 屬性傳回。

對 Position 物件的 Member 物件而言，最大傳回的數目是 65536。如果實際上 children 的數目超過 65536，傳回的值仍是 65536。因此應用程式應該將 ChildCount 為 65536 時的情形解釋為大於或等於 65536 個 children 。

對 Level 物件的 Member 物件而言，使用 Children 集合物件裡的 ADO 集合物件 Count 屬性來判斷 children 的真正數目。如果在這個集合物件裡的 children 數目很多，判斷 children 的實際數目可能會很慢。


Children 屬性 (ADO MD)

Children 屬性

傳回一個 Members 集合物件，而目前的 Member 在 hierarchy 裡是它的 parent。

傳回值

傳回一個 Members 集合物件，同時是唯讀的。

備註

Children 屬性包含一個 Members 集合物件，而目前的 Member 物件是它們階層上的 parent。葉片等級的 Member 物件在 Members 集合物件裡沒有 children member。這個屬性只支援在屬於 Level 物件的 Member 物件。當這個 Member 物件屬於 Position 物件時，使用這個屬性會產生錯誤。


Depth 屬性 (ADO MD)

Depth 屬性

表示在 hierarchy 的根及一個 Level 之間， levels 的數目。

傳回值

傳回一個 integer，同時是唯讀的。

備註

在 hierarchy 根部的 Level，它的 Depth 值為零 (0)。


Description 屬性 (ADO MD)

Description 屬性

傳回目前物件的文字解釋。

傳回值

傳回一個 String ，同時是唯讀的。

備註

對 Member 物件而言，Description 只適用於測量及公式的 member。 所有其它類型的 member，Description 會傳回一個空字串("")。要取得更多關於不同類型 member 的資訊，請參閱 Type 屬性。

這個屬性只支援在屬於 Level 物件的 Member 物件。當 Member 物件屬於一個 Position 物件時，使用這個屬性會發生錯誤。


DimensionCount 屬性 (ADO MD)

DimensionCount 屬性

表示在一個 axis 上的 dimensions 數目。

傳回值

傳回一個 Long ，同時是唯讀的。


DrilledDown 屬性 (ADO MD)

DrilledDown 屬性

表示這個 member 是否可以再繼續往下深入。

傳回值

傳回一個 Boolean ，同時是唯讀的。如果在這個 axis 裡目前的 member 沒有子 member，DrilledDown 會傳回 True。如果在這個 axis 裡目前的 member 有一或多個子 member，DrilledDown 會傳回 False。

備註

使用 DrilledDown 屬性來判斷在這個 axis 裡是否有至少一個 children 緊接著這個 member。當顯示這個 member 時，這個資訊是有用的。

這個屬性只支援在屬於 Position 物件的 Member 物件。當 Member 物件屬於一個 Level 物件時，使用這個屬性會發生錯誤。


FilterAxis 屬性 (ADO MD)

FilterAxis 屬性

表示關於目前 cellset 的條件式資訊。

傳回值

傳回一個 Axis 物件，同時是唯讀的。

備註

使用 FilterAxis 屬性來傳回關於用來篩選資料的 dimensions 資訊。Axis 的 DimensionCount 屬性傳回篩選 dimensions 的數目。這個 axis 通常只有一列。

使用 FilterAxis 所傳回的 Axis 不包含在 Cellset 物件的 Axes 集合物件裡。


FormattedValue 屬性 (ADO MD)

FormattedValue 屬性

表示一個 cell 值經格式化後的輸出。

傳回值

傳回一個 String ，同時是唯讀的。

備註

使用 FormattedValue 屬性來取得 Cell 物件的 Value 屬性在格式化後的輸出。例如，如果一個 cell 的 value 是 1056.87，若這個值以金額(元)的方式表示， FormattedValue 應該是 $1,056.87。


LevelDepth 屬性 (ADO MD)

LevelDepth 屬性

表示在 hierarchy 的根及一個 member 之間， levels 的數目。

傳回值

傳回一個 Long integer，同時是唯讀的。

備註

使用 LevelDepth 屬性來判斷由 hierarchy 的根 level 至 Member 物件的距離。一個在根 level 的 member 的 LevelDepth 為 0。這個屬性相對於 Level 物件的 Depth 屬性。


LevelName 屬性 (ADO MD)

LevelName 屬性

表示一個 member 裡，這個 level 的名稱。

傳回值

傳回一個 String ，同時是唯讀的。

備註

使用 LevelName 屬性來取得一個 member 所屬的 level 名稱。這個屬性相對於 Level 物件的 Name 屬性。


Name 屬性 (ADO MD)

Name 屬性

表示一個物件的名稱。

傳回值

傳回一個 String ，同時是唯讀的。

備註

您可以由一個順序上的參考值來取得一個物件的 Name 屬性。之後您可以使用名稱來指向這個物件。例如，如果 cdf.CubeDefs(0).Name 得到 "Bobs Video Store"，您可以用 cdf.CubeDefs("Bobs Video Store") 來指向這個 CubeDef。


Ordinal 屬性 (ADO MD Cell)

Ordinal 屬性 (Cell)

在一個 cellset 裡，以它的位置唯一的識別一個 cell。

傳回值

傳回一個 Long integer，同時是唯讀的。

備註

cell 的序號值可以唯一的識別在 cellset 裡的一個 cell。在觀念上， cells 在一個 cellset 的編號方式有如 Cellset 是一個 p 維的陣列；而 p 是 axes 的數目。Cells 是以列為主來編號排序的。這裡是計算一個 cell 序號的公式：

cell 的序號值可以使用在 Cellset 物件裡的 Item 方法，快速的取得 Cell 物件。


Ordinal 屬性 (ADO MD 位置)

Ordinal 屬性 (Position)

在一個 axis 上，唯一的識別一個位置。

傳回值

傳回一個 Long integer，同時是唯讀的。

備註

Position 物件的 Ordinal 屬性相對於在 Positions 集合物件裡 Position 的索引值。

在每個 axis 上，Position 的 Ordinal 可以使用在 Cellset 物件裡的 Item 方法，快速的取得一個 cell。


Parent 屬性 (ADO MD)

Parent 屬性

表示在一個 hierarchy 裡，這個 member 是目前 member 的 parent。

傳回值

傳回一個 Member 物件，同時是唯讀的。

備註

在 hierarchy 頂層的 member 沒有 parent。這個屬性只支援在屬於 Level 物件的 Member 物件。當 Member 物件屬於一個 Position 物件時，使用這個屬性會發生錯誤。


ParentSameAsPrev 屬性 (ADO MD)

ParentSameAsPrev 屬性

表示在這個位置 member 的 parent 是否和它前一個 member 的 parent 是相同的。

傳回值

傳回一個 Boolean ，同時是唯讀的。

備註

這個屬性只支援在屬於 Position 物件的 Member 物件。當 Member 物件屬於一個 Level 物件時，使用這個屬性會發生錯誤。


Source 屬性 (ADO MD)

Source 屬性

表示在這個 cellset 裡資料的來源。

設定及傳回值

設定或傳回一個 Variant。對一個已關閉的 Cellset 物件，它是可讀寫的；對一個已開啟的 Cellset 物件，它是唯讀的。Variant 應該包含一個有效的 String，例如一個 MDX 查詢。


State 屬性 (ADO MD)

State 屬性

表示這個 cellset 的目前狀態。

傳回值

傳回一個 Long integer，表示 Cellset 物件的目前狀態，同時這個屬性是唯讀的。下列值是有效的：

常數 | 值 | 說明
AdStateClosed | 0 | 這個 Cellset 已關閉。
AdStateOpen | 1 | 這個 Cellset 已開啟。

備註

使用這些常數名稱，您必須在您的專案裡參考 ADO 型態程式庫。請參閱 以 ADO MD 使用 ADO 取得更多資訊。


Type 屬性 (ADO MD)

Type 屬性

表示目前 member 的類型。

傳回值

傳回一個 Enum 值，同時是唯讀的。

Type 屬性可以是下列值：

常數 | 值 | 說明
adMemberlRegular | 1 | 預設值，Member 代表一個事業實體的個體。
adMemberMeasure | 2 | Member 屬於測量上的大小；它代表一個可量化的屬性。
adMemberFormula | 4 | Member 以一個公式來計算。
adMemberAll | 8 | Member 表示這個 level 的所有 member。
adMemberUnknown | 16 | 這個類型無法判斷。

備註

這個屬性只支援在屬於 Level 物件的 Member 物件。當 Member 物件屬於一個 Position 物件時，使用這個屬性會發生錯誤。


UniqueName 屬性 (ADO MD)

UniqueName 屬性

表示目前物件的一個明白清楚的名稱。

傳回值

傳回一個 String ，同時是唯讀的。


Value 屬性 (ADO MD)

Value 屬性

表示目前 cell 的值。

傳回值

傳回一個 Variant ，同時是唯讀的。


ADO MD 範例

您可以運用底下的範例主題，學習一些 ADO MD 的程式撰寫要素。

連接多維資料來源

Connection example 的範例說明了如何連接 OLAP (online analytical processing) 資料庫伺服器、或本機的 OLAP cube檔。

讀取 ADO MD 集合物件

CubeDef example 的範例說明了如何顯示在 Catalog 中 CubeDef 的維數名稱。

取得儲存格組

Cellset example 的範例說明了如何執行一項能傳回儲存格組的查詢。這個範例會顯示儲存格組的成員標題、以及儲存格中的格式化數值。

讀取儲存格

Cell example 的範例說明了三種擷取特定儲存格的方法：透過順序的位置、透過軸上的數值位置、以及透過成員名稱。


Connection 範例 (ADO MD)

Connection 範例

底下這段程式碼說明的是，如何使用連接字串設定 ActiveConnection 屬性的方法。這段程式碼假設在 OLAP 伺服器上存有一個名為 Bobs Video Store 的資料來源，這個 OLAP 伺服器的名字叫做 Servername、使用的是 MSOLAP 資料提供者。

Dim cat As New ADOMD.Catalog
cat.ActiveConnection = "Data Source=Servername;" + _
    "Initial Catalog=Bobs Video Store;Provider=msolap;"

底下這段程式碼也在說明如何使用連接字串設定 ActiveConnection 屬性。不過，這段程式碼連接的是本機的cube檔，並沒有連接名字叫做 Servername、使用 MSOLAP 資料提供者的 OLAP 伺服器。

Dim cat As New ADOMD.Catalog
cat.ActiveConnection = _
"Location=C:\MSDASDK\samples\oledb\olap\data\BobsVid.cub;" + _
"Provider=msolap;"

底下這段程式碼說明的是，如何將 ActiveConnection 屬性設定到標準的 ADO Connection 物件。為了使用 ADO Connection 物件，您必須擁有對專案中 ADO 類型程式庫的參考。
Dim cnn  As New ADODB.Connection
Dim cat  As New ADOMD.Catalog
Cnn.Open "Data Source=Servername;" + _
    "Initial Catalog=Bobs Video Store;Provider=msolap;"
Set cat.ActiveConnection = cnn

注意 記得在將 ActiveConnection 屬性設定到 Connection 物件時，要使用 Set 這個關鍵字。如果您遺漏了Set 這個關鍵字的話，您事實上會以 Connection 物件的預設值來設定ActiveConnection屬性，也就是 ConnectionString。程式碼依然效；不過，您將與資料來源產生一個額外的連接，這可能造成執行效能上的負面影響。


CubeDef 範例 (ADO MD)

CubeDef 範例

底下這段程式碼範例說明的是，如何讀取 CubeDefs 與 Dimensions 集合物件的方法。它會將cube中每個維數的名稱列印在出來，這段程式碼假設在叫做Servername的OLAP伺服器上存有一個名為 Bobs Video Store 的資料來源。

Dim cat        As New ADOMD.Catalog
Dim cdf        As ADOMD.CubeDef
Dim I            As Integer
cat.ActiveConnection = "Data Source=Servername;" + _
    "Initial Catalog=Bobs Video Store;Provider=msolap;"
Set cdf = cat.CubeDefs("Bobs Video Store")
For i = 0 To cdf.Dimensions.Count - 1
    Debug.Print cdf.Dimensions(i).Name
Next


Cellset 範例 (ADO MD)

Cellset 範例

底下這段程式碼說明的是，如何開啟 Cellset、列印每個位置的Members 標題、以及列印 Cell 格式化數值的方法。這段程式碼假設在叫做 Servername 的 OLAP 伺服器上存有一個名為 Bobs Video Store 的資料來源。

Dim cat        As New ADOMD.Catalog
Dim cst        As New ADOMD.Cellset
Dim axs        As ADOMD.Axis
Dim I            As Integer
Dim j            As Integer
cat.ActiveConnection = "Data Source=Servername;" + _
    "Initial Catalog=Bobs Video Store;Provider=msolap;"
cst.Source = "SELECT [Product Category].MEMBERS ON ROWS," + _
                            "[Store State].MEMBERS ON COLUMNS" + _
                    "FROM  [Bobs Video Store]" + _
                    "WHERE ([Quantity])"
Set cst.ActiveConnection = cat.ActiveConnection
cst.Open
For i = 0 To cst.Axes(0).Positions.Count - 1
    Debug.Print cst.Axes(0).Positions(i).Members(0).Caption & " ";
    Set axs = cst.Axes(1)
    For j = 0 To axs.Positions.Count - 1
        Debug.Print "     " & axs.Positions(j).Members(0).Caption & _
            " " & cst(i, j).FormattedValue
    Next
Next
cst.Close


Cell 範例 (ADO MD)

Cell 範例

底下這段程式碼說明的是三種讀取特定 Cell 的方法。這段程式碼假設在 OLAP 伺服器上存有一個名為 Bobs Video Store 的資料來源。

Dim cat        As New ADOMD.Catalog
Dim cst        As New ADOMD.Cellset
Dim cll        As ADOMD.Cell
cat.ActiveConnection = "Data Source=Servername;" + _
    "Initial Catalog=Bobs Video Store;Provider=msolap;"
cst.Source = "SELECT [Product Category].MEMBERS ON ROWS," + _
                            "[Store State].MEMBERS ON COLUMNS" + _
                    "FROM  [Bobs Video Store]" + _
                    "WHERE ([Quantity])"
Set cst.ActiveConnection = cat.ActiveConnection
cst.Open
' Retrieve cell using ordinal position.
Set cll = cst(10)
' Retrieve cell using axis numerical position.
Set cll = cst(2,2)
' Retrieve cell using member names.
' This method is not supported by the msolap provider, but is included
' for providers that do support cell access by member name.
' Set cll = cst("Childrens", "New York State")


SID Property (ADOX)

SID Property

Indicates the security identifier for a group or user account.

Settings and Return Values

Sets a String value that is a unique identifier for the group or user.

Remarks

The default value is an empty string ("").

This property is write-only for new objects not yet appended to a collection, and is not available for existing objects.


(Untitled)

# mdmthCnnOpen

$ Open Method (ADO Connection)

K methods,;methods, Open method (ADO Connection);Open method;Open method (ADO Connection);

A mdhowOpenConnection_C;mdmthADOCancel_C;mdmthClose_C;mdmthCnnOpen;mdmthRstOpen_C;mdobjConnection_M;mdobjODBRec_M;

T 231062

# mdmthRstOpen

$ Open Method (ADO Recordset)

K methods,;methods, Open method (ADO Recordset);Open method;Open method (ADO Recordset);

A mdhowExecuteCommand_C;mdhowOpenConnection_C;mdmthADOCancel_C;mdmthClose_C;mdmthCnnOpen_C;mdmthRstOpen;mdobjConnection_M;mdobjODBRec_M;mdrefODBCProvSpec_C;

T 231063

# mdmthOpenSchema

$ OpenSchema Method (ADO)

K methods,;methods, OpenSchema method;OpenSchema method;

A mdmthOpenSchema;mdobjConnection_M;

T 231064

# mdmthQuery

K Query method;methods,;methods, Query method;

A mdmthQuery;mdobjDataFactory_M;mdproConnectProp_C;mdproRecordset_C;mdproSQLProp_C;

$ Query Method (RDS)

T 231065

# mdmthADORefresh

$ Refresh Method (ADO)

K methods,;methods, Refresh method (ADO);Refresh method;Refresh method (ADO);

A mdcolFields_M;mdcolParameters_M;mdcolProperties_M;mdmthADORefresh;mdproCount_C;

T 231066

# mdmthRDSRefresh

K methods,;methods, Refresh method (RDS);Refresh method;Refresh method (RDS);updating query results;

A mdmthRDSCanUpd_C;mdmthRDSRefresh;mdmthSubChanges_C;mdobjDataControl_M;mdproConnectProp_C;mdproSQLProp_C;mdrefADOProvInfo_C;

$ Refresh Method (RDS)

T 231067

# mdmthADORequery

$ Requery Method (ADO)

K methods,;methods, Requery method;Requery method;

A mdmthAddNew_C;mdmthADORequery;mdobjODBRec_M;mdproCommandText_C;

T 231068

# mdmthReset

A mdmthReset;mdobjDataControl_M;

$ Reset Method (RDS)

K methods,;methods, Reset method;Reset method;

T 231069

# mdmthADOResync

$ Resync Method (ADO)

K methods,;methods, Resync method;Resync method;

A mdmthADOResync;mdmthClear_C;mdobjODBRec_M;mdproUnderlyingValue_C;

T 231070

# mdmthRstSave

$ Save Method (ADO Recordset)

K methods,;methods, Save method (ADO Recordset);Save method;

A mdmthClose_C;mdmthCnnOpen_C;mdmthRstSave;mdobjConnection_M;mdobjODBRec_M;

T 231071

# mdmthSubChanges

K SubmitChanges method;methods,;methods, SubmitChanges method;updating databases;

A mdmthRDSCanUpd_C;mdmthRDSRefresh_C;mdmthReset_C;mdmthSubChanges;mdobjDataControl_M;mdobjDataFactory_M;mdproConnectProp_C;mdproServerProp_C;mdproSQLProp_C;

$ SubmitChanges Method (RDS)

T 231072

# mdmthSupports

$ Supports Method (ADO)

K methods,;methods, Supports method;Supports method;

A mdmthAddNew_C;mdmthSupports;mdobjODBRec_M;mdproBookmark_C;mdproCursorType_C;mdrefADSProvSpec_C;mdrefIndServProvSpec_C;mdrefODBCProvSpec_C;

T 231073

# mdmthSynchronize

T 264737

$ Synchronize Method (RDS)

A mdmthSynchronize;

# mdmthUpdate

$ Update Method (ADO)

K methods,;methods, Update method;Update method;

A mdhowManipulateData_C;mdhowUpdateData_C;mdmthAddNew_C;mdmthCancelUpdate_C;mdmthUpdate;mdobjODBRec_M;mdproEditMode_C;

T 231074

# mdmthUpdateBatch

$ UpdateBatch Method (ADO)

K methods,;methods, UpdateBatch method;UpdateBatch method;

A mdhowUpdateData_C;mdmthAddNew_C;mdmthCancelBatch_C;mdmthClear_C;mdmthUpdateBatch;mdobjODBRec_M;mdproLockType_C;

T 231075


ActiveX

ActiveX(R)

一組技術讓軟體元件在網路環境中與其他元件互動，無論它們產生所使用的語言。ActiveX(R) 是在元件物件模式 (COM) 上建立的。


ADISAPI

Advanced Data Internet Server Application Programming Interface. An ISAPI DLL that provides parsing, Automation control, Recordset marshaling, and MIME packaging. The ADISAPI component works through the API provided by Internet Information Server (IIS).


aggregate function

加總函數

一種函數，例如 Count、Avg 和 Var，用於建立可計算總數的查詢。撰寫運算式和設計程式時,您可以使用 SQL 加總函數 (包括上面所述三者) 和網域加總函數來判斷不同的統計資料。


Alias

別名

您提供給 SQL SELECT 陳述式資料行或運算式的替用名稱，一般較短或更一目了然。例如，BobSales 是下列 SELECT 陳述式內的別名： "Select wr-Sales as BobSales from SalesDB"。別名可以用來動態指派資料行來控制連結 DataControl 物件。


apartment thread

apartment 執行緒

一種執行緒，用來呼叫在物件週期中被設定為 “apartment threded” 的元件物件。所有對該物件的呼叫會在 apartment 執行緒上執行。


asynchronous operation

非同步作業

程式碼 (例如查詢) 起始的作業。作業完成之前，程式碼會繼續執行。請參閱非同步作業。


business 物件

對擷取與處理資料的 ActiveX(R) 元件而言。Business 物件通常是在中間層。

遠端資料服務提供一個預設的中間層 business 物件，RDSServer.DataFactory，它會接收用戶端的請求並提供對特定資料來源讀寫的存取權，但不包含任何驗證或 business 規則邏輯。

您可以建立與 RDSServer.DataFactory 提供相同功能的自訂 business 物件，如同封包您應用程式的 business 規則。


business 規則

結合驗證編輯、登入認可、資料庫查閱、處理方式與演算轉型等組成企業執行 business 的方法。也稱為 business 邏輯。


child

child 是階層結構的節點，上面有其它的節點 (更靠近根)。


類別 ID (CLSID)

通用唯一的識別項 (UUID) 可以辨認一個 COM 元件。每個 COM 元件在 Windows Registry 有它自己的 CLSID，所以它可以被其他應用程式載入。


用戶端層

代表本機電腦的邏輯層。

用戶端是應用程式或系統的一部份，代表給使用者輸入資料以及處理。它也稱為前端，用戶端不執行資料函數，實際上用戶端會以輸入為基礎，從伺服器要求資料，然後製作格式後顯示結果。請參閱中間層、資料來源層。


元件物件模式 (COM)

基於物件導向技術，針對跨平台用戶端/伺服器應用程式發展的一個開放式架構。用戶端透過在物件上建置的介面來使用物件。COM 與語言無關，所以任何可產生 ActiveX(R) 元件的語言也可以產生 COM 應用程式。


元件

ActiveX(R) 技術產生的個別程式碼單元，透過適當指定的介面傳送適當指定的服務集合。元件提供在執行階段用戶端要求的物件。在遠端資料服務中，當它們包含支援 business 處理的主要邏輯時，元件也被引用成一個 business 物件。


connection pooling

連接集區化

以使用預配資源的集合物件 (例如物件或資料庫集合物件) 為基礎，達到效能最佳化。將結果集中起來，可以更有效分配資源。


cursor

資料指標

可傳回記錄和定義 ADO 如何存取和使用這些記錄的機制。資料指標會控制記錄的巡覽、資料更新性以及是否顯示其他使用者對資料庫所作的變更。


可聯繫資料的控制項

可以從資料庫使用資料的控制項。一但您經由 RDS.DataControl 物件連結控制項到一個資料庫，控制項會被引用為連結控制項。


data provider

資料提供者

一種軟體，擁有資料且直接提供在表格式表單中給您的應用程式。請參閱服務提供者、服務元件。


資料來源

應用程式使用來請求連線到一個系統 ODBC 資料來源的名稱。它指定電腦名稱與 (選擇性地) 資料來源名稱 (DSN) 對應到的資料庫。

一個系統資料來源是一個每位電腦使用者都可用的資料來源。在網路伺服器上使用的資料來源必須是系統資料來源。


DCOM

DCOM (Distributed Component Object Model)

啟動 ActiveX(R) 元件來直接透過網路與其他通訊的物件通訊協定。DCOM 是一種中性的語言，所以任何可以產生 ActiveX 元件的語言也可以產生 DCOM 應用程式。


設計階段

在設計環境以新增控制項、設定控制項或是表單屬性等等來產生應用程式的期間。相對的，在執行階段，您以使用者的角色與應用程式互動。

當您創作網頁時，您可以在設計階段中在物件的 OBJECT 標籤中設定屬性。您可以在執行階段以您的 script 程式碼設定屬性 (例如，VBScript)。


disconnected recordset

中斷的 recordset

用戶端快取記憶體內而且已經不與伺服器連接的 recordset。若您需要在原始資料來源執行動作，例如更新資料，您需要重新連接。


DLL (動態連結程式庫)

一個檔案包含一或多個被編譯、連結然後從使用它們過程中分開儲存的函數。當過程開始或執行時，作業系統會對應 DLL 到呼叫程序的位址空間。

ADISAPI

Advanced Data Internet Server Application Programming Interface。一種提供分析、自動控制、Recordset 分散以及 MIME 封裝的 ISAPI DLL。ADISAPI 元件可以用在 Internet Information Server (IIS) 提供的 API。


資料來源層

一個表示執行 DBMS，例如SQL Server 資料庫電腦的邏輯層。也請參閱用戶端層、中間層。


dynamic property

動態屬性

資料提供者或資料指標特定的屬性。物件的 Properties 集合物件會在適當 (“動態”) 時自動由這些產生。物件只要在透過特定資料提供者連接到資料來源時，才會有動態屬性。


event

事件

物件識別的動作，您可以撰程式碼來回應。事件可以由透過在其它動作中執行指令、完成交易、巡覽 recordset 以及更新資料等等來產生。要執行的程式碼會附加到相對的事件處理常式。


grandchild aggregate

grandchild 加總

累計 chapter 的記錄，或者累計 chapter 內某 chapter 的記錄等等。


event handler

事件處理常式

事件處理常式可以包含當事件發生時要執行的程式碼。


ISAPI

Internet Server Application Programming Interface。Internet 伺服器， (例如執行Microsoft® Internet Information Server – IIS 的 Windows NT® Server) 的功能組。


marshaling

跨執行緒與處理範圍包裝與傳送介面方法的過程。


Remote Data Service

一個高效能的 Web-based 技術，引進資料庫傳通性與結合資料發行到 Internet 與 intranet應用程式的能力。


Microsoft Transaction Server

一個 component-based 交易處理系統，可以發展、建置與管理高效能、可調整與穩定的企業、Internet 與 intranet 伺服器應用程式。Microsoft (R) Transaction Server 定義一個應用程式設計模式以供發展分置、component-based 的應用程式。它也提供建置與管理這些應用程式執行階段的基礎建設。


中間層

也稱為應用程式伺服器層。在使用者介面或網路用戶端與資料庫間的邏輯層。通常就是網路伺服器所在的地方，並且也是 business 物件被建立的地方。中間層是資訊產生與運算 business 規則與函數的集合物件。它們透過 business 規則完成此工作，可以經常變更，並且會被封包成實體與應用程式邏輯本身分隔的元件。也請參閱用戶端層、資料來源層。


MIME

一個標準以允許二進位資料可以在 Internet 上發行與讀取。二進位資料檔案的前置資料包含 MIME 類型資料；這會通知用戶端程式 (舉例來說，網路瀏覽器與郵件封包) 它們須以不同於純文字的方式來處理資料。例如，JPEG 圖形的網路文件前置資料包含指定給 JPEG 檔案格式的 MIME 類型。如果有的話，這會允許瀏覽器以以它的 JPEG 檢視器來檢視檔案。


物件變數

一個變數包含一個物件的引用項目。例如，objCustomObject 是一個變數，指向一個類型物件 CustomObject：

Set objCustomObject = ADS1.CreateObject("CustomObject", _
    "http://SalesWeb")


ODBC

ODBC (Open Database Connectivity)

一個標準的程式設計語言介面是被用來連接到不同的資料來源。這通常是透過 [控制台] 來使用，在這裡資料來源名稱 (DSN) 可以被指定為使用特定的 ODBC 驅動程式。


parameterized command

參數化指令

會使用參數的指令，您可以在程式碼設定其值以及從一個指令執行下一個執行來加以變更。這些值會由指令傳送到提供者。


parent

表格關係的主控端。


parent-child relationship

parent-child 關係

在階層結構中，parent 是較高的一層而且直接和一或多個 children 產生關聯。Child 位在較下層而且必須要有一個 parent。


persist

保留

保留 COM 物件，例如檔案或 recordset 目前的狀態。


proxy

一個介面指定的物件提供參數排列，與用戶端呼叫在不同執行環境執行的應用程式物件所需的通訊，就像在不同執行緒或另一個過程中。proxy 是位於用戶端與被呼叫的應用程式物件所在的對應 stub 通訊。


recordset

一個會經由 ActiveX(R) Data Objects (ADO) 提供的資料列集。巡覽和編輯資料的主要機制。它是一個物件，包含資料列集和方法以及屬性，可用來存取和更新資料。


rowset

資料庫的資料列集，全部擁有相同的欄位結構敘述。rowset 可以代表所有或部份的表格欄位。rowset 也可以代表虛擬表格 – 它是由查詢或兩個以上的表格結合後所建立的。


執行階段

應用程式執行中的期間。在執行階段中，您可以和應用程式互動。相對的，在設計階段，您建立物件與修改它們的設計。

當您創作網頁時，您可以在設計階段中在 HTML 物件的 OBJECT 標籤中設定屬性。您可以在執行階段以您的 script 程式碼設定屬性 (例如，VBScript)。


service component

服務元件

一種服務提供者，可配合服務提供者和資料提供者，進一步擴大應用程式的服務。請參閱資料提供者、服務提供者。


service provider

服務提供者

一種軟體，可產生和消耗資料、擴大 ADO 應用程式功能來包裝服務。這種提供者不會直接提供資料，實際上它提供服務，例如查詢處理。服務提供者會處理資料提供者提供的資料。請參閱資料提供者、服務元件。


single-threaded control

單執行緒式控制項

一種所有物件會在單一執行緒上執行的模式。


stub

一個介面指定的物件提供參數排列，與用戶端呼叫在不同執行環境執行的應用程式物件所需的通訊，就像在不同執行緒或另一個過程中。stub 是位於應用程式物件並與在用戶端呼叫它對應的proxy 通訊。


synchronous operation

同步作業

程式碼 (例如查詢) 起始的作業，它會在其它作業開始之前完成。請參閱非同步作業。


tablegram

用於傳輸結果集到到用戶端，或從用戶端傳送結果的屬性資料格式。


Variant

在 Automation 中，VARIENT 資料類型的實例，可以代表很多類型的值，例如整數、浮點、布林、字串、指標等等。請參閱 Visaul Baisc 內旳資料類型。


網路伺服器

對 intranet 與 Internet 使用者提供網路服務與網頁的電腦。Internet Information Server 會安裝在網路伺服器上，而伺服器端 business 物件通常會在這裡建立。


設定 SQL Server 電腦來使用 TCP/IP Sockets

在 SQL Server 電腦上執行 SQL Server 安裝程式，資料源的交易就可以使用 TCP/IP Socket 網路程式庫。

在 SQL Server 電腦上指定 TCP/IP Socket 網路程式庫

  1. 從 [開始] 功能表指到 [程式集]，再指到 [Microsoft SQL Server 6.5]，然後按一下 [SQL 設定]。

  2. 連按兩下 [繼續]。就會出現 [Microsoft SQL Server 6.5—選項] 對話方塊。

  3. 選取 [變更網路支援]，然後按一下 [繼續]。

  4. 確定選取 [TCP/IP Sockets] 核取方塊，然後按一下 [確定]。

  5. 按一下繼續來完成，然後結束安裝。


設定 Web 伺服器來使用 TCP/IP Sockets

有兩個選項可設定 Web 伺服器來使用 TCP/IP Sockets。您所執行的動作會根據您是從 Web 伺服器存取所有的 SQL Server，或僅存取特定的 SQL Server 而有所不同。

如果是從 Web 伺服器存取所有的 SQL Server，您必須在 Web 伺服器電腦上執行 SQL Server 用戶端組態公用程式。以下的步驟可由此 IIS Web 伺服器來變更所有 SQL Server 連線的預設網路程式庫，以便使用TCP/IP Sockets 網路程式庫。

設定 Web 伺服器 (所有的 SQL Server)

  6. 從 [開始] 功能表指到 [程式集]，再指到 [Microsoft SQL Server 6.5]，然後按一下 [SQL 用戶端組態公用程式]。

  7. 選取 [網路程式庫] 索引標籤。

  8. 在 [預設網路] 方塊中選取 [TCP/IP Sockets]。

  9. 按一下 [完成] 來儲存所做的變更，並結束該公用程式。

如果是從 Web 伺服器存取一個特定 SQL Server，您必須在 Web 伺服器電腦上執行 SQL Server 用戶端組態公用程式。若要變更特定 SQL Server 連線的網路程式庫，您必須在 Web 伺服器電腦上設定 SQL Server 用戶端軟體，如下所示：

設定 Web 伺服器 (特定的 SQL Server)

  10. 從 [開始] 功能表指到 [程式集]，再指到 [Microsoft SQL Server 6.5]，然後按一下 [SQL 用戶端組態公用程式]。

  11. 選取 [進階] 索引標籤。

  12. 在 [伺服器] 方塊中鍵入要連接的伺服器名稱以便使用 [TCP/IP Sockets]。

  13. 在 [DLL 名稱] 方塊中選取 [TCP/IP Sockets]。

  14. 按一下 [新增/修改]。所有指向這個伺服器的資料源現在都會使用 TCP/IP Sockets。

  15. 按一下 [完成]。