把Oracle數(shù)據(jù)庫編寫到OLEDB的程序
我們都知道Oracle數(shù)據(jù)庫的服務端編程主要是使用OLE DB等一些方法。Oracle數(shù)據(jù)庫的編程的運用的過程中,我們需要掌握的是一些關于訪問數(shù)據(jù)庫技術(shù)方法,還需要注意怎么設計高效的數(shù)據(jù)庫、數(shù)據(jù)庫管理與運行的優(yōu)化、數(shù)據(jù)庫語句的優(yōu)化。
使用OLEDB編寫Oracle數(shù)據(jù)庫應用程序的應用實例:
1 概述
OLE DB的存在為用戶提供了一種統(tǒng)一的方法來訪問所有不同種類的數(shù)據(jù)源。OLE DB可以在不同的數(shù)據(jù)源中進行轉(zhuǎn)換。利用OLE DB,客戶端的開發(fā)人員在進行數(shù)據(jù)訪問時只需把精力集中在很少的一些細節(jié)上,而不必弄懂大量不同數(shù)據(jù)庫的訪問協(xié)議。
OLE DB是一套通過COM接口訪問數(shù)據(jù)的ActiveX接口。這個OLE DB接口相當通用,足以提供一種訪問數(shù)據(jù)的統(tǒng)一手段,而不管存儲數(shù)據(jù)所使用的方法如何。同時,OLE DB還允許開發(fā)人員繼續(xù)利用基礎數(shù)據(jù)庫技術(shù)的優(yōu)點,而不必為了利用這些優(yōu)點而把數(shù)據(jù)移出來。
2 使用ATL使用OLE DB數(shù)據(jù)使用程序
由于直接使用OLE DB的對象和接口設計數(shù)據(jù)庫應用程序需要書寫大量的代碼。為了簡化程序設計,Visual C++提供了ATL模板用于設計OLE DB數(shù)據(jù)應用程序和數(shù)據(jù)提供程序。
利用ATL模板可以很容易地將OLE DB與MFC結(jié)合起來,使Oracle數(shù)據(jù)庫的參數(shù)查詢等復雜的編程得到簡化。MFC提供的數(shù)據(jù)庫類使OLE DB的編程更具有面向?qū)ο蟮奶匦?。Viual C++所提供用于OLE DB的ATL模板可分為數(shù)據(jù)提供程序的模板和數(shù)據(jù)使用程序的模板。
使用ATL模板創(chuàng)建數(shù)據(jù)應用程序一般有以下幾步驟:
1)、 創(chuàng)建應用框架
2)、 加入ATL產(chǎn)生的模板類
3)、 在應用中使用產(chǎn)生的數(shù)據(jù)訪問對象
3 不用ATL使用OLE DB數(shù)據(jù)使用程序
利用ATL模板產(chǎn)生數(shù)據(jù)使用程序較為簡單,但適用性不廣,不能動態(tài)適應Oracle數(shù)據(jù)庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數(shù)據(jù)使用程序。
模板的使用
OLE DB數(shù)據(jù)使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。
1)、 會話類
CDataSource類
CDataSource類與OLE DB的數(shù)據(jù)源對象相對應。這個類代表了OLE DB數(shù)據(jù)提供程序和數(shù)據(jù)源之間的連接。只有當數(shù)據(jù)源的連接被建立之后,才能產(chǎn)生會話對象,可以調(diào)用Open來打開數(shù)據(jù)源的連接。
CSession類
CSession所創(chuàng)建的對象代表了一個單獨的Oracle數(shù)據(jù)庫訪問的會話。一個用CDataSource類產(chǎn)生的數(shù)據(jù)源對象可以創(chuàng)建一個或者多個會話,要在數(shù)據(jù)源對象上產(chǎn)生一個會話對象,需要調(diào)用函數(shù)Open()來打開。同時,會話對象還可用于創(chuàng)建事務操作。
CEnumeratorAccessor類
CEnumeratorAccessor類是用來訪問枚舉器查詢后所產(chǎn)生的行集中可用數(shù)據(jù)提供程序的信息的訪問器,可提供當前可用的數(shù)據(jù)提供程序和可見的訪問器。
2)、 訪問器類
CAcessor類
CAccessor類代表與訪問器的類型。當用戶知道數(shù)據(jù)庫的類型和結(jié)構(gòu)時,可以使用此類。它支持對一個行集采用多個訪問器,并且,存放數(shù)據(jù)的緩沖區(qū)是由用戶分配的。
CDynamicAccessor類
CDynamicAccessor類用來在程序運行時動態(tài)的創(chuàng)建訪問器。當系統(tǒng)運行時,可以動態(tài)地從行集中獲得列的信息,可根據(jù)此信息動態(tài)地創(chuàng)建訪問器。
CManualAccessor類
CManualAccessor類中以在程序運行時將列與變量綁定或者是將參數(shù)與變量捆定。
3)、 行集類
CRowSet類
CRowSet類封裝了行集對象和相應的接口,并且提供了一些方法用于查詢、設置數(shù)據(jù)等。可以用Move()等函數(shù)進行記錄移動,用GetData()函數(shù)讀取數(shù)據(jù),用Insert()、Delete()、SetData()來更新數(shù)據(jù)。
CBulkRowset類
CBulkRowset類用于在一次調(diào)用中取回多個行句柄或者對多個行進行操作。
CArrayRowset類
CArrayRowset類提供用數(shù)組下標進行數(shù)據(jù)訪問。
4)、 命令類
CTable類
CTable類用于對Oracle數(shù)據(jù)庫的簡單訪問,用數(shù)據(jù)源的名稱得到行集,從而得到數(shù)據(jù)。
CCommand類
CCommand類用于支持命令的數(shù)據(jù)源??梢杂肙pen()函數(shù)來執(zhí)行SQL命令,也可以Prepare()函數(shù)先對命令進行準備,對于支持命令的數(shù)據(jù)源,可以提高程序的靈活性和健壯性。
在stdafx.h頭文件里,加入如下代碼。
- #include <atlbase.h>
 - extern CComModule _Module;
 - #include <atlcom.h>
 - #include <atldbcli.h>
 - #include <atldbsch.h> // if you are using schema templates
 
在stdafx.cpp文件里,加入如下代碼。
- #include <atlimpl.cpp>
 - CComModule _Module;
 
決定使用何種類型的存取程序和行集。
獲取數(shù)據(jù)
在打開數(shù)據(jù)源,會話,行集對象后就可以獲取數(shù)據(jù)了。所獲取的數(shù)據(jù)類型取決于所用的存取程序,可能需要綁定列。按以下步驟。
1、 用正確的命令打開行集對象。
2、 如果使用CManualAccessor,在使用之前與相應列進行綁定。要綁定列,可以用函數(shù)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<ulColumns; l++)
 - rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40,
 
&pBind[l].szValue, NULL, &pBind[l].dwStatus);- rs.Bind();
 
3、 用while循環(huán)來取數(shù)據(jù)。在循環(huán)中,調(diào)用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()
 - }
 
4、 在while循環(huán)內(nèi),可以通過不同的存取程序獲取數(shù)據(jù)。
1) 如果使用的是CAccessor類,可以通過使用它們的數(shù)據(jù)成員進行直接訪問。如下所示:
2) 如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 類,可以通過GetValue或GetColumn函數(shù)來獲取數(shù)據(jù)??梢杂肎etType來獲取所用數(shù)據(jù)類型。如下所示:
- while (rs.MoveNext() == S_OK)
 - {
 - // Use the dynamic accessor functions to retrieve your
 - // data
 - ULONG ulColumns = rs.GetColumnCount();
 - for (ULONG i=0; i<ulColumns; i++)
 - {
 - rs.GetValue(i);
 - }
 - }
 
3) 如果使用的是CManualAccessor,可以指定自己的數(shù)據(jù)成員,綁定它們。就可以直接存取。如下所示:
- while (rs.MoveNext() == S_OK)
 - {
 - // Use the data members you specified in the calls to
 - // AddBindEntry.
 - wsprintf("%s", szFoo);
 - }
 
決定行集的數(shù)據(jù)類型
在運行時決定數(shù)據(jù)類型,要用動態(tài)或手工的存取程序。如果用的是手工存取程序,可以用GetColumnInfo函數(shù)得到行集的列信息。從這里可以得到數(shù)據(jù)類型。
4 總結(jié)
由于現(xiàn)在有多種數(shù)據(jù)源,,想要對這些數(shù)據(jù)進行訪問管理的***途徑就是通過一些同類機制來實現(xiàn),如OLE DB。高級OLE DB結(jié)構(gòu)分成兩部分:客戶和提供者??蛻羰褂糜商峁┱呱傻臄?shù)據(jù)。
就像其它基于COM的多數(shù)結(jié)構(gòu)一樣,OLE DB的開發(fā)人員需要實現(xiàn)很多的接口,其中大部分是模板文件。
當生成一個客戶對象時,可以通過ATL對象向?qū)е赶蛞粋€數(shù)據(jù)源而創(chuàng)建一個簡單的客戶。ATL對象向?qū)z查數(shù)據(jù)源并創(chuàng)建Oracle數(shù)據(jù)庫的客戶端代理。從那里,可以通過OLE DB客戶模板使用標準的瀏覽函數(shù)。
當生成一個提供者時,向?qū)峁┝艘粋€很好的開端,它們僅僅是生成了一個簡單的提供者來列舉某一目錄下的文件。然后,提供者模板包含了OLE DB支持的完全補充內(nèi)容。在這種支持下,用戶可以創(chuàng)建OLE DB提供者,來實現(xiàn)行集定位策略、數(shù)據(jù)的讀寫以及建立書簽。
【編輯推薦】















 
 
 
 
 
 
 