自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

把Oracle數(shù)據(jù)庫(kù)編寫到OLEDB的程序

數(shù)據(jù)庫(kù) Oracle
下面的文章主要是介紹如何使用OLEDB來編寫Oracle數(shù)據(jù)庫(kù)的實(shí)際應(yīng)用程序的相關(guān)實(shí)例的描述,以下就是正文的相關(guān)內(nèi)容的描述。

我們都知道Oracle數(shù)據(jù)庫(kù)的服務(wù)端編程主要是使用OLE DB等一些方法。Oracle數(shù)據(jù)庫(kù)的編程的運(yùn)用的過程中,我們需要掌握的是一些關(guān)于訪問數(shù)據(jù)庫(kù)技術(shù)方法,還需要注意怎么設(shè)計(jì)高效的數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理與運(yùn)行的優(yōu)化、數(shù)據(jù)庫(kù)語句的優(yōu)化。

使用OLEDB編寫Oracle數(shù)據(jù)庫(kù)應(yīng)用程序的應(yīng)用實(shí)例:

1 概述

 

OLE DB的存在為用戶提供了一種統(tǒng)一的方法來訪問所有不同種類的數(shù)據(jù)源。OLE DB可以在不同的數(shù)據(jù)源中進(jìn)行轉(zhuǎn)換。利用OLE DB,客戶端的開發(fā)人員在進(jìn)行數(shù)據(jù)訪問時(shí)只需把精力集中在很少的一些細(xì)節(jié)上,而不必弄懂大量不同數(shù)據(jù)庫(kù)的訪問協(xié)議。

 

OLE DB是一套通過COM接口訪問數(shù)據(jù)的ActiveX接口。這個(gè)OLE DB接口相當(dāng)通用,足以提供一種訪問數(shù)據(jù)的統(tǒng)一手段,而不管存儲(chǔ)數(shù)據(jù)所使用的方法如何。同時(shí),OLE DB還允許開發(fā)人員繼續(xù)利用基礎(chǔ)數(shù)據(jù)庫(kù)技術(shù)的優(yōu)點(diǎn),而不必為了利用這些優(yōu)點(diǎn)而把數(shù)據(jù)移出來。

 

2 使用ATL使用OLE DB數(shù)據(jù)使用程序

 

由于直接使用OLE DB的對(duì)象和接口設(shè)計(jì)數(shù)據(jù)庫(kù)應(yīng)用程序需要書寫大量的代碼。為了簡(jiǎn)化程序設(shè)計(jì),Visual C++提供了ATL模板用于設(shè)計(jì)OLE DB數(shù)據(jù)應(yīng)用程序和數(shù)據(jù)提供程序。

 

利用ATL模板可以很容易地將OLE DB與MFC結(jié)合起來,使Oracle數(shù)據(jù)庫(kù)的參數(shù)查詢等復(fù)雜的編程得到簡(jiǎn)化。MFC提供的數(shù)據(jù)庫(kù)類使OLE DB的編程更具有面向?qū)ο蟮奶匦?。Viual C++所提供用于OLE DB的ATL模板可分為數(shù)據(jù)提供程序的模板和數(shù)據(jù)使用程序的模板。

 

使用ATL模板創(chuàng)建數(shù)據(jù)應(yīng)用程序一般有以下幾步驟:

 

1)、 創(chuàng)建應(yīng)用框架

 

2)、 加入ATL產(chǎn)生的模板類

 

3)、 在應(yīng)用中使用產(chǎn)生的數(shù)據(jù)訪問對(duì)象

 

3 不用ATL使用OLE DB數(shù)據(jù)使用程序

利用ATL模板產(chǎn)生數(shù)據(jù)使用程序較為簡(jiǎn)單,但適用性不廣,不能動(dòng)態(tài)適應(yīng)Oracle數(shù)據(jù)庫(kù)的變化。下面我們介紹直接使用MFC OLE DB類來生成數(shù)據(jù)使用程序。

 

模板的使用

 

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

 

1)、 會(huì)話類

 

CDataSource類

 

CDataSource類與OLE DB的數(shù)據(jù)源對(duì)象相對(duì)應(yīng)。這個(gè)類代表了OLE DB數(shù)據(jù)提供程序和數(shù)據(jù)源之間的連接。只有當(dāng)數(shù)據(jù)源的連接被建立之后,才能產(chǎn)生會(huì)話對(duì)象,可以調(diào)用Open來打開數(shù)據(jù)源的連接。

 

CSession類

 

CSession所創(chuàng)建的對(duì)象代表了一個(gè)單獨(dú)的Oracle數(shù)據(jù)庫(kù)訪問的會(huì)話。一個(gè)用CDataSource類產(chǎn)生的數(shù)據(jù)源對(duì)象可以創(chuàng)建一個(gè)或者多個(gè)會(huì)話,要在數(shù)據(jù)源對(duì)象上產(chǎn)生一個(gè)會(huì)話對(duì)象,需要調(diào)用函數(shù)Open()來打開。同時(shí),會(huì)話對(duì)象還可用于創(chuàng)建事務(wù)操作。

 

CEnumeratorAccessor類

 

CEnumeratorAccessor類是用來訪問枚舉器查詢后所產(chǎn)生的行集中可用數(shù)據(jù)提供程序的信息的訪問器,可提供當(dāng)前可用的數(shù)據(jù)提供程序和可見的訪問器。

 

2)、 訪問器類

 

CAcessor類

 

CAccessor類代表與訪問器的類型。當(dāng)用戶知道數(shù)據(jù)庫(kù)的類型和結(jié)構(gòu)時(shí),可以使用此類。它支持對(duì)一個(gè)行集采用多個(gè)訪問器,并且,存放數(shù)據(jù)的緩沖區(qū)是由用戶分配的。

 

CDynamicAccessor類

 

CDynamicAccessor類用來在程序運(yùn)行時(shí)動(dòng)態(tài)的創(chuàng)建訪問器。當(dāng)系統(tǒng)運(yùn)行時(shí),可以動(dòng)態(tài)地從行集中獲得列的信息,可根據(jù)此信息動(dòng)態(tài)地創(chuàng)建訪問器。

 

CManualAccessor類

 

CManualAccessor類中以在程序運(yùn)行時(shí)將列與變量綁定或者是將參數(shù)與變量捆定。

 

3)、 行集類

 

CRowSet類

 

CRowSet類封裝了行集對(duì)象和相應(yīng)的接口,并且提供了一些方法用于查詢、設(shè)置數(shù)據(jù)等??梢杂肕ove()等函數(shù)進(jìn)行記錄移動(dòng),用GetData()函數(shù)讀取數(shù)據(jù),用Insert()、Delete()、SetData()來更新數(shù)據(jù)。

 

CBulkRowset類

 

CBulkRowset類用于在一次調(diào)用中取回多個(gè)行句柄或者對(duì)多個(gè)行進(jìn)行操作。

 

CArrayRowset類

 

CArrayRowset類提供用數(shù)組下標(biāo)進(jìn)行數(shù)據(jù)訪問。

 

4)、 命令類

 

CTable類

 

CTable類用于對(duì)Oracle數(shù)據(jù)庫(kù)的簡(jiǎn)單訪問,用數(shù)據(jù)源的名稱得到行集,從而得到數(shù)據(jù)。

 

CCommand類

 

CCommand類用于支持命令的數(shù)據(jù)源??梢杂肙pen()函數(shù)來執(zhí)行SQL命令,也可以Prepare()函數(shù)先對(duì)命令進(jìn)行準(zhǔn)備,對(duì)于支持命令的數(shù)據(jù)源,可以提高程序的靈活性和健壯性。

 

在stdafx.h頭文件里,加入如下代碼。

 

 

  1. #include <atlbase.h> 
  2. extern CComModule _Module;  
  3. #include <atlcom.h> 
  4. #include <atldbcli.h> 
  5. #include <atldbsch.h> // if you are using schema templates 

 

 

在stdafx.cpp文件里,加入如下代碼。

 

 

  1. #include <atlimpl.cpp> 
  2. CComModule _Module; 

 

 

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

 

獲取數(shù)據(jù)

 

在打開數(shù)據(jù)源,會(huì)話,行集對(duì)象后就可以獲取數(shù)據(jù)了。所獲取的數(shù)據(jù)類型取決于所用的存取程序,可能需要綁定列。按以下步驟。

 

1、 用正確的命令打開行集對(duì)象。

 

2、 如果使用CManualAccessor,在使用之前與相應(yīng)列進(jìn)行綁定。要綁定列,可以用函數(shù)GetColumnInfo,如下所示:

 

 

  1. // Get the column information  
  2. ULONG ulColumns = 0;  
  3. DBCOLUMNINFO* pColumnInfo = NULL;  
  4. LPOLESTR pStrings = NULL;  
  5. if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)  
  6. AfxThrowOLEDBException(rs.m_pRowset, IID_IColumnsInfo);  
  7. struct MYBIND* pBind = new MYBIND[ulColumns];  
  8. rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);  
  9. for (ULONG l=0; l<ulColumns; l++)  
  10. rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, 
    &pBind[l].szValue, NULL, &pBind[l].dwStatus);  
  11. rs.Bind(); 

 

 

3、 用while循環(huán)來取數(shù)據(jù)。在循環(huán)中,調(diào)用MoveNext來測(cè)試光標(biāo)的返回值是否為S_OK,如下所示:

 

 

  1. while (rs.MoveNext() == S_OK)  
  2. {  
  3. // Add code to fetch data here  
  4. // If you are not using an auto accessor, call rs.GetData()  

 

 

4、 在while循環(huán)內(nèi),可以通過不同的存取程序獲取數(shù)據(jù)。

 

1) 如果使用的是CAccessor類,可以通過使用它們的數(shù)據(jù)成員進(jìn)行直接訪問。如下所示:

 

2) 如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 類,可以通過GetValue或GetColumn函數(shù)來獲取數(shù)據(jù)。可以用GetType來獲取所用數(shù)據(jù)類型。如下所示:

 

 

  1. while (rs.MoveNext() == S_OK)  
  2. {  
  3. // Use the dynamic accessor functions to retrieve your  
  4. // data  
  5. ULONG ulColumns = rs.GetColumnCount();  
  6. for (ULONG i=0; i<ulColumns; i++)  
  7. {  
  8. rs.GetValue(i);  
  9. }  

 

 

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

 

 

  1. while (rs.MoveNext() == S_OK)  
  2. {  
  3. // Use the data members you specified in the calls to  
  4. // AddBindEntry.  
  5. wsprintf("%s", szFoo);  

 

 

決定行集的數(shù)據(jù)類型

 

在運(yùn)行時(shí)決定數(shù)據(jù)類型,要用動(dòng)態(tài)或手工的存取程序。如果用的是手工存取程序,可以用GetColumnInfo函數(shù)得到行集的列信息。從這里可以得到數(shù)據(jù)類型。

 

4 總結(jié)

 

由于現(xiàn)在有多種數(shù)據(jù)源,,想要對(duì)這些數(shù)據(jù)進(jìn)行訪問管理的***途徑就是通過一些同類機(jī)制來實(shí)現(xiàn),如OLE DB。高級(jí)OLE DB結(jié)構(gòu)分成兩部分:客戶和提供者??蛻羰褂糜商峁┱呱傻臄?shù)據(jù)。

 

就像其它基于COM的多數(shù)結(jié)構(gòu)一樣,OLE DB的開發(fā)人員需要實(shí)現(xiàn)很多的接口,其中大部分是模板文件。

 

當(dāng)生成一個(gè)客戶對(duì)象時(shí),可以通過ATL對(duì)象向?qū)е赶蛞粋€(gè)數(shù)據(jù)源而創(chuàng)建一個(gè)簡(jiǎn)單的客戶。ATL對(duì)象向?qū)?huì)檢查數(shù)據(jù)源并創(chuàng)建Oracle數(shù)據(jù)庫(kù)的客戶端代理。從那里,可以通過OLE DB客戶模板使用標(biāo)準(zhǔn)的瀏覽函數(shù)。

 

當(dāng)生成一個(gè)提供者時(shí),向?qū)峁┝艘粋€(gè)很好的開端,它們僅僅是生成了一個(gè)簡(jiǎn)單的提供者來列舉某一目錄下的文件。然后,提供者模板包含了OLE DB支持的完全補(bǔ)充內(nèi)容。在這種支持下,用戶可以創(chuàng)建OLE DB提供者,來實(shí)現(xiàn)行集定位策略、數(shù)據(jù)的讀寫以及建立書簽。

 

 【編輯推薦】

  1. Oracle創(chuàng)建Split 與Map 函數(shù)的代碼示例
  2. Oracle索引整理的詳細(xì)描述
  3. Oracle 權(quán)限入門如何管理
  4. Oracle 10G for linux常用命令淺析
  5. Oracle數(shù)據(jù)庫(kù)中歸檔進(jìn)程ARCH的詳細(xì)闡述
責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2011-07-13 10:36:53

Delphi

2010-04-22 11:58:00

Oracle數(shù)據(jù)庫(kù)

2009-07-31 17:07:40

ASP.NET數(shù)據(jù)庫(kù)連

2009-01-14 10:12:04

Oracle編寫事務(wù)Oracle控制機(jī)制Oracle數(shù)據(jù)庫(kù)

2010-06-12 12:45:14

高效MySQL數(shù)據(jù)庫(kù)

2010-04-23 09:23:44

Oracle 數(shù)據(jù)庫(kù)

2011-05-26 10:30:12

Oracle數(shù)據(jù)庫(kù)約束

2015-08-21 12:59:38

Oracle數(shù)據(jù)庫(kù)

2011-03-10 13:24:26

2009-09-02 14:55:19

Oracle數(shù)據(jù)庫(kù)

2011-05-26 14:43:49

ORACLE數(shù)據(jù)庫(kù)異常處理

2011-03-24 13:09:11

數(shù)據(jù)庫(kù)代碼

2011-03-16 08:54:45

Oracle數(shù)據(jù)庫(kù)索引

2011-05-19 13:25:14

Oracle數(shù)據(jù)庫(kù)

2010-04-22 16:16:35

Oracle數(shù)據(jù)庫(kù)

2010-05-14 10:39:32

MySQL數(shù)據(jù)庫(kù)

2022-04-25 14:41:15

甲骨文數(shù)據(jù)庫(kù)機(jī)數(shù)據(jù)庫(kù)

2010-04-16 15:05:10

Oracle數(shù)據(jù)庫(kù)

2010-04-14 08:49:43

Oracle數(shù)據(jù)庫(kù)系統(tǒng)

2010-10-26 11:04:48

oracle數(shù)據(jù)導(dǎo)入
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)