OLE DB

OLE DB

OLE DB(OLEDB)是微軟的戰略性的通向不同的數據源的低級應用程式接口。OLE DB不僅包括微軟資助的標準數據接口開放資料庫連通性(ODBC)的結構化問題語言(SQL)能力,還具有面向其他非SQL數據類型的通路。

中科永聯高級技術培訓中心(www.itisedu.com)

OLE DBOLEDB)是微軟的戰略性的通向不同的數據源的低級套用程式接口。OLE DB不僅包括微軟資助的標準數據接口開放資料庫連通性(ODBC)的結構化問題語言(SQL)能力,還具有面向其他非SQL數據類型的通路。作為微軟的組件對象模型(COM)的一種設計,OLE DB是一組讀寫數據的方法(在過去可能被稱為渠道)。OLD DB中的對象主要包括數據源對象、階段對象、命令對象和行組對象。使用OLE DB的應用程式會用到如下的請求序列:初始化OLE連線到數據源發出命令處理結果釋放數據源對象並停止初始化OLE

OLE DB標準中定義的新概念----OLE DB將傳統的資料庫系統劃分為多個邏輯組件,這些組件之間相對獨立又相互通信。這種組件模型中的各個部分被冠以不同的名稱:數據提供者(Data Provider)。 提供數據存儲的軟體組件,小到普通的文本檔案、大到主機上的複雜資料庫,或者電子郵件存儲,都是數據提供者的例子。有的文檔把這些軟體組件的開發商也稱為數據提供者。

我們要開啟如Access 資料庫中的數據,必須用ADO.NET 透過OLE DB 來開啟。ADO.NET 利用OLE DB 來取得數據,這是因為OLE DB 了解如何和許多種數據源作溝通,所以對OLE DB有相當程度的了解是很重要的。OLE DB 為一種開放式的標準,並且設計成COM(Component
Object Model,一種對象的格式。凡是依照COM 的規格所製作出來的組件,皆可以提供功能讓其它程式或組件所使用。)組件。OLE DB 最主要是由三個部分組合而成:

Data Providers 數據提供者

凡是透過OLE DB 將數據提供出來的,就是數據提供者。例如SQL Server 資料庫中的數據表,或是附檔案名稱為mdb 的Access 資料庫檔案等,都是Data Provider。

Data Consumers 數據使用者

凡是使用OLE DB 提供數據的程式或組件,都是OLE DB 的數據使用者。換句話說,凡是使用ADO 的應用程式或網頁都是OLE DB 的數據使用者。

Service Components 服務組件

數據服務組件可以執行數據提供者以及數據使用者之間數據傳遞的工作,數據使用者要向數據提供者要求數據時,是透過OLE DB 服務組件的查詢處理器執行查詢的工作,而查詢到的結果則由指針引擎來管理。

OLE DB

OLE DB 是 Microsoft 的數據訪問模型。它使用組件對象模型 (COM) 接口,與 ODBC 不同的是,OLE DB 假定數據源使用的不是 SQL 查詢處理器。

Adaptive Server Anywhere 包括一個名為 ASAProv 的 OLE DB 提供程式。該提供程式可用於當前的 Windows 和 Windows CE 平台。

您還可以結合使用 【用於 ODBC 的 Microsoft OLE DB 提供程式】(MSDASQL) 和 Adaptive Server Anywhere ODBC 驅動程式來訪問 Adaptive Server Anywhere。

使用 Adaptive Server Anywhere OLE DB 提供程式具有以下幾個優點:

·某些功能(如通過游標更新)不能通過 OLE DB/ODBC Bridge 來使用。

·如果您使用 Adaptive Server Anywhere OLE DB 提供程式,則在部署過程中無需 ODBC。

·MSDASQL 允許 OLE DB 客戶端用於任何 ODBC 驅動程式,但不保證您可以使用每個 ODBC 驅動程式的全部功能。而使用 Adaptive Server Anywhere 提供程式,您可以從 OLE DB 編程環境完全訪問 Adaptive Server Anywhere 的全部功能。

一、OLE DB 結構設計問題

開始編寫 OLE DB 應用程式之前應考慮以下問題:

使用何種編程實現來編寫 OLE DB 應用程式?

Microsoft 提供多種庫來解決該問題:OLE DB 模板庫、OLE DB 屬性以及 OLE DB SDK 中的原始 OLE DB 接口。另外,Microsoft 還提供幫助您編寫程式的嚮導。有關這些實現的更詳細的信息,請參見 OLE DB 模板、屬性和其他實現。

是否需要編寫自己的提供程式?

大多數開發人員無需這樣。Microsoft 提供多種提供程式。無論用戶何時創建一個數據連線,例如,當使用 ATL OLE DB 使用者嚮導向項目中添加使用者時,“數據連結屬性”對話框都將列出系統中所有被註冊的可用提供程式。如果其中一個提供程式適合於用戶自己的數據存儲和數據訪問應用程式,最簡單的辦法就是使用該提供程式。但是,如果用戶的數據存儲不適合所提供的別,則必須創建自己的提供程式。有關創建提供程式的信息,請參見 OLE DB 提供程式模板及其子主題。

需要為自己的使用者提供何種級別的支持?

一些使用者可能非常簡單,另一些可能非常複雜。OLE DB 對象的功能由屬性指定。使用 ATL OLE DB 使用者嚮導創建使用者或者使用資料庫提供程式嚮導創建提供程式時,嚮導將為用戶設定合適的對象屬性來提供一組標準功能。但是,如果嚮導生成的使用者類或提供程式類並不具有您需要的所有支持功能,那么您需要查閱這些類在 OLE DB 模板庫中的接口。這些接口包裝原始 OLE DB 接口,提供附加實現以使其使用起來更加簡單。

例如,如果您希望更新行集合中的數據,但在使用嚮導創建使用者時卻忘記指定該功能,則可以在創建使用者之後通過對命令對象設定 DBPROP_IRowsetChange 和 DBPROP_UPDATABILITY 屬性來指定該功能。這樣,當行集合創建之後,它將具有 IRowsetChange 接口。

您是否有使用其他數據訪問技術(ADO、ODBC 或 DAO)的舊版代碼?

由於可能有各樣各樣的技術組合(例如 ADO 組件和 OLE DB 組件一起使用、將 ODBC 代碼遷移至 OLE DB 等等),所以 Visual C++ 文檔不能涵蓋所有的情形。

二、實戰套用——使用OLE DB

1 概述

OLE DB的存在為用戶提供了一種統一的方法來訪問所有不同種類的數據源。OLE DB可以在不同的數據源中進行轉換。利用OLE DB,客戶端的開發人員在進行數據訪問時只需把精力集中在很少的一些細節上,而不必弄懂大量不同資料庫的訪問協定。

OLE DB是一套通過COM接口訪問數據的ActiveX接口。這個OLE DB接口相當通用,足以提供一種訪問數據的統一手段,而不管存儲數據所使用的方法如何。同時,OLE DB還允許開發人員繼續利用基礎資料庫技術的優點,而不必為了利用這些優點而把數據移出來。

2 使用ATL使用OLE DB數據使用程式

由於直接使用OLE DB的對象和接口設計資料庫應用程式需要書寫大量的代碼。為了簡化程式設計,Visual C++提供了ATL模板用於設計OLE DB數據應用程式和數據提供程式。

利用ATL模板可以很容易地將OLE DB與MFC結合起來,使資料庫的參數查詢等複雜的編程得到簡化。MFC提供的資料庫類使OLE DB的編程更具有面向對象的特性。Viual C++所提供用於OLE DB的ATL模板可分為數據提供程式的模板和數據使用程式的模板。

使用ATL模板創建數據應用程式一般有以下幾步驟:

創建套用框架

加入ATL產生的模板類

在套用中使用產生的數據訪問對象

 

不用ATL使用OLE DB數據使用程式

利用ATL模板產生數據使用程式較為簡單,但適用性不廣,不能動態適應資料庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數據使用程式。

模板的使用

OLE DB數據使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。

會話類

CDataSource類

CDataSource類與OLE DB的數據源對象相對應。這個類代表了OLE DB數據提供程式和數據源之間的連線。只有當數據源的連線被建立之後,才能產生會話對象,可以調用Open來打開數據源的連線。

CSession

CSession所創建的對象代表了一個單獨的資料庫訪問的會話。一個用CDataSource類產生的數據源對象可以創建一個或者多個會話,要在數據源對象上產生一個會話對象,需要調用函式Open()來打開。同時,會話對象還可用於創建事務操作。

CEnumeratorAccessor類

CEnumeratorAccessor類是用來訪問枚舉器查詢後所產生的行集中可用數據提供程式的信息的訪問器,可提供當前可用的數據提供程式和?

CAccessor類代表與訪問器的類型。當用戶知道資料庫的類型和結構時,可以使用此類。它支持對一個行集採用多個訪問器,並且,存放數據的緩衝區是由用戶分配的。

CDynamicAccessor類

CDynamicAccessor類用來在程式運行時動態的創建訪問器。當系統運行時,可以動態地從行集中獲得列的信息,可根據此信息動態地創建訪問器。

CManualAccessor類

CManualAccessor類中以在程式運行時將列與變數綁定或者是將參數與變數捆定。

行集類

CRowSet類

CRowSet類封裝了行集對象和相應的接口,並且提供了一些方法用於查詢、設定數據等。可以用Move()等函式進行記錄移動,用GetData()函式讀取數據,用Insert()、Delete()、SetData()來更新數據。

CBulkRowset類

CBulkRowset類用於在一次調用中取回多個行句柄或者對多個行進行操作。

CArrayRowset類

CArrayRowset類提供用數組下標進行數據訪問。

命令類

CTable類

CTable類用於對資料庫的簡單訪問,用數據源的名稱得到行集,從而得到數據。

CCommand類

CCommand類用於支持命令的數據源。可以用Open()函式來執行SQL命令,也可以Prepare()函式先對命令進行準備,對於支持命令的數據源,可以提高程式的靈活性和健壯性。

在stdafx.h頭檔案里,加入如下代碼。

#include

extern CComModule _Module;

#include

#include

#include // if you are using schema templates

在stdafx.cpp檔案里,加入如下代碼。

#include

CComModule _Module;

決定使用何種類型的存取程式和行集。

獲取數據

在打開數據源,會話,行集對象後就可以獲取數據了。所獲取的數據類型取決於所用的存取程式,可能需要綁定列。按以下步驟。

用正確的命令打開行集對象。

如果使用CManualAccessor,在使用之前與相應列進行綁定。要綁定列,可以用函式GetColumnInfo,如下所示:

// Get the column information

ULONG ulColumns = 0;

DBCOLUMNINFO* pColumnInfo = NULL;

LPOLESTR pStrings = NULL;

if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)

AfxThrowOLEDBException(rs.m_pRowset, IID_IColumnsInfo);

struct MYBIND* pBind = new MYBIND【ulColumns】;

rs.CreateAccessor(ulColumns, &pBind【0】, sizeof(MYBIND)*ulColumns);

for (ULONG l=0; l<>

rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind【l】.szValue, NULL, &pBind【l】.dwStatus);

rs.Bind();

用while循環來取數據。在循環中,調用MoveNext來測試游標的返回值是否為S_OK,如下所示:

while (rs.MoveNext() == S_OK)

{

// Add code to fetch data here

// If you are not using an auto accessor, call rs.GetData()

}

在while循環內,可以通過不同的存取程式獲取數據。

如果使用的是CAccessor類,可以通過使用它們的數據成員進行直接訪問。如下所示:

如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 類,可以通過GetValue或GetColumn函式來獲取數據。可以用gettype來獲取所用數據類型。如下所示:

while (rs.MoveNext() == S_OK)

{

// Use the dynamic accessor functions to retrieve your

// data

ULONG ulColumns = rs.GetColumnCount();

for (ULONG i=0; i<>

{

rs.GetValue(i);

}

}

如果使用的是CManualAccessor,可以指定自己的數據成員,綁定它們。就可以直接存取。如下所示:

while (rs.MoveNext() == S_OK)

{

// Use the data members you specified in the calls to

// AddBindEntry.

wsprintf("%s", szFoo);

}

決定行集的數據類型

在運行時決定數據類型,要用動態或手工的存取程式。如果用的是手工存取程式,可以用GetColumnInfo函式得到行集的列信息。從這裡可以得到數據類型。

3 總結

由於現在有多種數據源,,想要對這些數據進行訪問管理的唯一途徑就是通過一些同類機制來實現,如OLE DB。高級OLE DB結構分成兩部分:客戶和提供者。客戶使用由提供者生成的數據。

就像其它基於COM的多數結構一樣,OLE DB的開發人員需要實現很多的接口,其中大部分是模板檔案。

當生成一個客戶對象時,可以通過ATL對象嚮導指向一個數據源而創建一個簡單的客戶。ATL對象嚮導將會檢查數據源並創建資料庫的客戶端代理。從那裡,可以通過OLE DB客戶模板使用標準的瀏覽函式。

當生成一個提供者時,嚮導提供了一個很好的開端,它們僅僅是生成了一個簡單的提供者來列舉某一目錄下的檔案。然後,提供者模板包含了OLE DB支持的完全補充內容。在這種支持下,用戶可以創建OLE DB提供者,來實現行集定位策略、數據的讀寫以及建立書籤。(來源Builder.com.cn)
 

相關詞條

相關搜尋

熱門詞條

聯絡我們