定義
OLEDB(ObjectLinkingandEmbedding,Database,又稱為OLEDB或OLE-DB),一個基於COM的數據存儲對象,能提供對所有類型的數據的操作,甚至能在離線的情況下存取數據(比方說,你使用的是你的便攜機,你可以毫不費力地看到最後一次數據同步時的數據映像)。簡介
OLEDB位於ODBC層與應用程式之間。在你的ASP頁面里,ADO是位於OLEDB之上的應用程式.你的ADO調用先被送到OLEDB,然後再交由ODBC處理.你可以直接連線到OLEDB層,如果你這么做了,你將看到伺服器端游標(recordset的預設的游標,也是最常用的游標)性能的提升.OLEDB(OLEDB)是微軟的戰略性的通向不同的數據源的低級套用程式接口。OLEDB不僅包括微軟資助的標準數據接口開放資料庫連線(ODBC)的結構化查詢語言(SQL)能力,還具有面向其他非SQL數據類型的通路。作為微軟的組件對象模型(COM)的一種設計,OLEDB是一組讀寫數據的方法(在過去可能被稱為渠道)。OLEDB中的對象主要包括數據源對象、階段對象、命令對象和行組對象。使用OLEDB的應用程式會用到如下的請求序列:初始化OLE、連線到數據源、發出命令、處理結果、釋放數據源對象並停止初始化OLE。
組成
OLEDB標準中定義的新概念----OLEDB將傳統的資料庫系統劃分為多個邏輯組件,這些組件之間相對獨立又相互通信。這種組件模型中的各個部分被冠以不同的名稱。例如:數據提供者(DataProvider)是指提供數據存儲的軟體組件,小到普通的文本檔案、大到主機上的複雜資料庫,或者電子郵件存儲,都是數據提供者的例子。有的文檔把這些軟體組件的開發商也稱為數據提供者。我們要開啟如Access資料庫中的數據,必須用ADOT透過OLEDB來開啟。AT利用OLEDB來取得數據,這是因為OLEDB了解如何和許多種數據源作溝通,所以對OLEDB有相當程度的了解是很重要的。OLEDB為一種開放式的標準,並且設計成COM(ComponentObjectModel,一種對象的格式。凡是依照COM的規格所製作出來的組件,皆可以提供功能讓其它程式或組件所使用。)組件。OLEDB最主要是由三個部分組合而成:
1.DataProviders數據提供者
凡是透過OLEDB將數據提供出來的,就是數據提供者。例如SQLServer資料庫中的數據表,或是附檔案名稱為mdb的Access資料庫檔案等,都是DataProvider。
⒉DataConsumers數據使用者
凡是使用OLEDB提供數據的程式或組件,都是OLEDB的數據使用者。換句話說,凡是使用ADO的應用程式或網頁都是OLEDB的數據使用者。
⒊ServiceComponents服務組件
數據服務組件可以執行數據提供者以及數據使用者之間數據傳遞的工作,數據使用者要向數據提供者要求數據時,是透過OLEDB服務組件的查詢處理器執行查詢的工作,而查詢到的結果則由指針引擎來管理。
功能
使用OLEDB的應用程式會用到如下的請求序列: 初始化OLE 連線到數據源 發出命令 處理結果 釋放數據源對象並停止初始化OLEOLEDB是Microsoft的數據訪問模型。它使用組件對象模型(COM)接口,與ODBC不同的是,OLEDB假定數據源使用的不是SQL查詢處理器。
AdaptiveServerAnywhere包括一個名為ASAProv的OLEDB提供程式。該提供程式可用於當前的Windows和WindowsCE平台。
您還可以結合使用【用於ODBC的MicrosoftOLEDB提供程式】(MSDASQL)和AdaptiveServerAnywhereODBC驅動程式來訪問AdaptiveServerAnywhere。
使用AdaptiveServerAnywhereOLEDB提供程式具有以下幾個優點:
·某些功能(如通過游標更新)不能通過OLEDB/ODBCBridge來使用。
·如果您使用AdaptiveServerAnywhereOLEDB提供程式,則在部署過程中無需ODBC。
·MSDASQL允許OLEDB客戶端用於任何ODBC驅動程式,但不保證您可以使用每個ODBC驅動程式的全部功能。而使用AdaptiveServerAnywhere提供程式,您可以從OLEDB編程環境完全訪問AdaptiveServerAnywhere的全部功能。
結構問題
開始編寫OLEDB應用程式之前應考慮以下問題:使用何種編程實現來編寫OLEDB應用程式?
Microsoft提供多種庫來解決該問題:OLEDB模板庫、OLEDB屬性以及OLEDBSDK中的原始OLEDB接口。另外,Microsoft還提供幫助您編寫程式的嚮導。有關這些實現的更詳細的信息,請參見OLEDB模板、屬性和其他實現。
是否需要編寫自己的提供程式?
大多數開發人員無需這樣。Microsoft提供多種提供程式。無論用戶何時創建一個數據連線,例如,當使用ATLOLEDB使用者嚮導向項目中添加使用者時,“數據連結屬性”對話框都將列出系統中所有被註冊的可用提供程式。如果其中一個提供程式適合於用戶自己的數據存儲和數據訪問應用程式,最簡單的辦法就是使用該提供程式。但是,如果用戶的數據存儲不適合所提供的類別,則必須創建自己的提供程式。有關創建提供程式的信息,請參見OLEDB提供程式模板及其子主題。
需要為自己的使用者提供何種級別的支持?
一些使用者可能非常簡單,另一些可能非常複雜。OLEDB對象的功能由屬性指定。使用ATLOLEDB使用者嚮導創建使用者或者使用資料庫提供程式嚮導創建提供程式時,嚮導將為用戶設定合適的對象屬性來提供一組標準功能。但是,如果嚮導生成的使用者類或提供程式類並不具有您需要的所有支持功能,那么您需要查閱這些類在OLEDB模板庫中的接口。這些接口包裝原始OLEDB接口,提供附加實現以使其使用起來更加簡單。
例如,如果您希望更新行集合中的數據,但在使用嚮導創建使用者時卻忘記指定該功能,則可以在創建使用者之後通過對命令對象設定DBPROP_IRowsetChange和DBPROP_UPDATABILITY屬性來指定該功能。這樣,當行集合創建之後,它將具有IRowsetChange接口。
您是否有使用其他數據訪問技術(ADO、ODBC或DAO)的舊版代碼?
由於可能有各樣各樣的技術組合(例如ADO組件和OLEDB組件一起使用、將ODBC代碼遷移至OLEDB等等),所以VisualC++文檔不能涵蓋所有的情形。
實戰套用
1概述OLEDB的存在為用戶提供了一種統一的方法來訪問所有不同種類的數據源。OLEDB可以在不同的數據源中進行轉換。利用OLEDB,客戶端的開發人員在進行數據訪問時只需把精力集中在很少的一些細節上,而不必弄懂大量不同資料庫的訪問協定。OLEDB是一套通過COM接口訪問數據的ActiveX接口。這個OLEDB接口相當通用,足以提供一種訪問數據的統一手段,而不管存儲數據所使用的方法如何。同時,OLEDB還允許開發人員繼續利用基礎資料庫技術的優點,而不必為了利用這些優點而把數據移出來。
2使用ATL使用OLEDB數據使用程式由於直接使用OLEDB的對象和接口設計資料庫應用程式需要書寫大量的代碼。為了簡化程式設計,VisualC++提供了ATL模板用於設計OLEDB數據應用程式和數據提供程式。利用ATL模板可以很容易地將OLEDB與MFC結合起來,使資料庫的參數查詢等複雜的編程得到簡化。MFC提供的資料庫類使OLEDB的編程更具有面向對象的特性。ViualC++所提供用於OLEDB的ATL模板可分為數據提供程式的模板和數據使用程式的模板。
使用ATL模板創建數據應用程式一般有以下幾步驟:
創建套用框架加入ATL產生的模板類在套用中使用產生的數據訪問對象 不用ATL使用OLEDB數據使用程式利用ATL模板產生數據使用程式較為簡單,但適用性不廣,不能動態適應資料庫的變化。下面我們介紹直接使用MFCOLEDB類來生成數據使用程式。模板的使用OLEDB數據使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。會話類CDataSource類CDataSource類與OLEDB的數據源對象相對應。這個類代表了OLEDB數據提供程式和數據源之間的連線。只有當數據源的連線被建立之後,才能產生會話對象,可以調用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頭檔案里,加入如下代碼。
#includeexternCComModule_Module;#include#include#include//ifyouareusingschematemplates在stdafx.cpp檔案里,加入如下代碼。
#includeCComModule_Module;
決定使用何種類型的存取程式和行集。獲取數據在打開數據源,會話,行集對象後就可以獲取數據了。所獲取的數據類型取決於所用的存取程式,可能需要綁定列。按以下步驟。
用正確的命令打開行集對象。如果使用CManualAccessor,在使用之前與相應列進行綁定。要綁定列,可以用函式GetColumnInfo,如下所示:
//GetthecolumninformationULONGulColumns=0;DBCOLUMNINFO*pColumnInfo=NULL;
LPOLESTRpStrings=NULL;
if(rs.GetColumnInfo(&ulColumns,&pColumnInfo,&pStrings)!=S_OK)AfxThrowOLEDBException(rs.m_pRowset,ⅡD_IColumnsInfo);
structMYBIND*pBind=newMYBIND【ulColumns】;
rs.CreateAccessor(ulColumns,&pBind【0】,sizeof(MYBIND)*ulColumns);
for(ULONGl=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){//Addcodetofetchdatahere//Ifyouarenotusinganautoaccessor,callrs.GetData()}
在while循環內,可以通過不同的存取程式獲取數據。如果使用的是CAccessor類,可以通過使用它們的數據成員進行直接訪問。如下所示:
如果使用的是CDynamicAccessor或CDynamicParameterAccessor類,可以通過GetValue或GetColumn函式來獲取數據。可以用GetType來獲取所用數據類型。如下所示:
while(rs.MoveNext()==S_OK){//Usethedynamicaccessorfunctionstoretrieveyour//dataULONGulColumns=rs.GetColumnCount();for(ULONGi=0;i<>{rs.GetValue(i);}}
如果使用的是CManualAccessor,可以指定自己的數據成員,綁定它們。就可以直接存取。如下所示:
while(rs.MoveNext()==S_OK){//Usethedatamembersyouspecifiedinthecallsto//AddBindEntry.wsprintf("%s",szFoo);}
決定行集的數據類型在運行時決定數據類型,要用動態或手工的存取程式。如果用的是手工存取程式,可以用GetColumnInfo函式得到行集的列信息。從這裡可以得到數據類型。
3總結由於現在有多種數據源,想要對這些數據進行訪問管理的唯一途徑就是通過一些同類機制來實現,如OLEDB。高級OLEDB結構分成兩部分:客戶和提供者。
客戶使用由提供者生成的數據。就像其它基於COM的多數結構一樣,OLEDB的開發人員需要實現很多的接口,其中大部分是模板檔案。當生成一個客戶對象時,可以通過ATL對象嚮導指向一個數據源而創建一個簡單的客戶。ATL對象嚮導將會檢查數據源並創建資料庫的客戶端代理。從那裡,可以通過OLEDB客戶模板使用標準的瀏覽函式。當生成一個提供者時,嚮導提供了一個很好的開端,它們僅僅是生成了一個簡單的提供者來列舉某一目錄下的檔案。然後,提供者模板包含了OLEDB支持的完全補充內容。在這種支持下,用戶可以創建OLEDB提供者,來實現行集定位策略、數據的讀寫以及建立書籤。