數(shù)據(jù)庫編程總結(jié)
當(dāng)前各種主流數(shù)據(jù)庫有很多,包括, MS SQL , , ,MySQL, DB2, / , , , SAP/DB, , MS 等等。數(shù)據(jù)庫編程是對(duì)數(shù)據(jù)庫的創(chuàng)建、讀寫等一列的操作。數(shù)據(jù)庫編程分為數(shù)據(jù)庫客戶端編程與數(shù)據(jù)庫服務(wù)器端編程。數(shù)據(jù)庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;數(shù)據(jù)庫服務(wù)端編程主要使用OLE DB等方法。數(shù)據(jù)庫編程需要掌握一些訪問數(shù)據(jù)庫技術(shù)方法,還需要注意怎么設(shè)計(jì)高效的數(shù)據(jù)庫、數(shù)據(jù)庫管理與運(yùn)行的優(yōu)化、數(shù)據(jù)庫語句的優(yōu)化。
一、訪問數(shù)據(jù)庫技術(shù)方法
數(shù)據(jù)庫編程分為數(shù)據(jù)庫客戶端編程與數(shù)據(jù)庫服務(wù)器端編程。數(shù)據(jù)庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;數(shù)據(jù)庫服務(wù)端編程主要使用OLE DB等方法。
1、幾種是數(shù)據(jù)庫訪問方法比較
是一種適合數(shù)據(jù)庫底層開發(fā)的編程方法,提供大量對(duì)數(shù)據(jù)源的操作,能夠靈活地操作游標(biāo),支持各種幫定選項(xiàng),在所有ODBC相關(guān)編程中,API編程具有最高的執(zhí)行速度。
DAO提供了很好的數(shù)據(jù)庫編程的對(duì)象模型.但是,對(duì)數(shù)據(jù)庫的所有調(diào)用以及輸出的數(shù)據(jù)都必須通過/Jet數(shù)據(jù)庫引擎,這對(duì)于使用數(shù)據(jù)庫應(yīng)用程序,是嚴(yán)重的瓶頸。
OLEDB提供了COM接口主流數(shù)據(jù)庫有哪些,與傳統(tǒng)的數(shù)據(jù)庫接口相比,有更好的健壯性和靈活性,具有很強(qiáng)的錯(cuò)誤處理能力,能夠同非關(guān)系數(shù)據(jù)源進(jìn)行通信。
ADO最主要的優(yōu)點(diǎn)在于易于使用、速度快、內(nèi)存支出少和磁盤遺跡小。
ADO.NET 是利用數(shù)據(jù)集的概念將數(shù)據(jù)庫數(shù)據(jù)讀入內(nèi)存中,然后在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行操作,最后將數(shù)據(jù)集數(shù)據(jù)回寫到源數(shù)據(jù)庫中。
OTL 是 , Odbc and DB2-CLI 的縮寫,是一個(gè)C++編譯中操控關(guān)系數(shù)據(jù)庫的模板庫, OTL中直接操作主要是通過提供的OCI接口進(jìn)行,進(jìn)行操作DB2數(shù)據(jù)庫則是通過CLI接口來進(jìn)行,至于MS的數(shù)據(jù)庫和其它一些數(shù)據(jù)庫,則OTL只提供了ODBC來操作的方式。當(dāng)然和DB2也可以由OTL間接使用ODBC的方式來進(jìn)行操縱。具有以下優(yōu)點(diǎn):跨平臺(tái);運(yùn)行效率高,與C語言直接調(diào)用API相當(dāng);開發(fā)效率高,起碼比使用起來更簡(jiǎn)單,更簡(jiǎn)潔;部署容易,不需要ADO組件,不需要.net 等。
2、VC數(shù)據(jù)庫編程幾種方法
VC數(shù)據(jù)庫編程幾種方法,包括ODBC連接、MFC ODBC連接、DAO連接、OLEDB、OLE DB 連接、ADO、專用方法(OCI()訪問、++ )。
通用方法
1. ODBC連接
ODBC(Open )是MSOA的一部分,是一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)庫接口。它提供對(duì)關(guān)系數(shù)據(jù)庫訪問的統(tǒng)一接口,實(shí)現(xiàn)對(duì)異構(gòu)數(shù)據(jù)源的一致訪問。
ODBC數(shù)據(jù)訪問由以下部分組成:
句柄():ODBC使用句柄來標(biāo)識(shí)ODBC環(huán)境、連接、語句和描述器.
緩存區(qū)():
數(shù)據(jù)類型(Data types)
一致性級(jí)別( )
用ODBC設(shè)計(jì)客戶端的一般步驟:
分配ODBC環(huán)境
分配連接句柄
連接數(shù)據(jù)源
構(gòu)造和執(zhí)行SQL語句
獲得查詢結(jié)果
斷開數(shù)據(jù)源的連接
釋放ODBC環(huán)境
ODBC API是一種適合數(shù)據(jù)庫底層開發(fā)的編程方法,ODBC API提供大量對(duì)數(shù)據(jù)源的操作,ODBC API能夠靈活地操作游標(biāo),支持各種幫定選項(xiàng),在所有ODBC相關(guān)編程中,API編程具有最高的執(zhí)行速度.因此,ODBC API編程屬于底層編程。
2. MFC ODBC連接
MFC ODBC是MFC對(duì)ODBC進(jìn)行的封裝,以簡(jiǎn)化對(duì)ODBC API的 調(diào)用,從而實(shí)現(xiàn)面向?qū)ο蟮臄?shù)據(jù)庫編程接口.
MFC ODBC的封裝主要開發(fā)了類和類
(1) 類
類用于應(yīng)用程序建立同數(shù)據(jù)源的連接。類中包含一個(gè)變量,它代表了數(shù)據(jù)源的連接句柄。如果要建立類的實(shí)例,應(yīng)先調(diào)用該類的構(gòu)造函數(shù),再調(diào)用Open函數(shù),通過調(diào)用,初始化環(huán)境變量,并執(zhí)行與數(shù)據(jù)源的連接。在通過Close函數(shù)關(guān)閉數(shù)據(jù)源。
類提供了對(duì)數(shù)據(jù)庫進(jìn)行操作的函數(shù)及事務(wù)操作。
(2) 類
類定義了從數(shù)據(jù)庫接收或者發(fā)送數(shù)據(jù)到數(shù)據(jù)庫的成員變量,以實(shí)現(xiàn)對(duì)數(shù)據(jù)集的數(shù)據(jù)操作。
類的成員變量代表了定義該記錄集的SQL語句句柄,為記錄集中字段的個(gè)數(shù),為記錄集所使用的參數(shù)個(gè)數(shù)。
的記錄集通過實(shí)例的指針實(shí)現(xiàn)同數(shù)據(jù)源的連接,即的成員變量.
MFC ODBC編程更適合于界面型數(shù)據(jù)庫應(yīng)用程序的開發(fā),但由于類和類提供的數(shù)據(jù)庫操作函數(shù)有限,支持的游標(biāo)類型也有限,限制了高效的數(shù)據(jù)庫開發(fā)。在編程層次上屬于高級(jí)編程。
應(yīng)用實(shí)例:
1.打開數(shù)據(jù)庫
;
.( _T( "DSN=" ),::);//為數(shù)據(jù)源名稱
2.關(guān)聯(lián)記錄集
(&);
3.查詢記錄
sSql1="";
sSql1 = " * FROM " ;
.Open(::, sSql1, ::);
int ti=0;
var;//var可以轉(zhuǎn)換為其他類型的值
while (!.IsEOF())
{
//讀取Excel內(nèi)部數(shù)值
.("id",var);
[ti].id=var.;
.("name", [ti].name);
ti++;
.();
}
.Close();//關(guān)閉記錄集
4.執(zhí)行sql語句
sSql="";
sSql+=" * from 院系審核";//清空表
.(sSql);
sSql也可以為 ,等語句
5.讀取字段名
sSql = " * FROM " ; //讀取的文件有表的定義,或?yàn)楸境绦蛏傻谋?
// 執(zhí)行查詢語句
.Open(::, sSql, ::);
int =.();//列數(shù)
[30];
//得到記錄集的字段集合中的字段的總個(gè)數(shù)
for( i=0;i {
;
.(i,);
[i].name =.;//字段名
}
6.打開excel文件
= " EXCEL (*.XLS)"; // Excel安裝驅(qū)動(dòng)
sSql,; //為excel的文件路徑
TRY
{
// 創(chuàng)建進(jìn)行存取的字符串
sSql.("={%s};DSN='';=1;=FALSE;=/"%s/";DBQ=%s",, , );
// 創(chuàng)建數(shù)據(jù)庫 (既Excel表格文件)
if( .(sSql,::) )
{
//可以把excel作為一個(gè)數(shù)據(jù)庫操作
}
}
catch(e)
{
("Excel驅(qū)動(dòng)沒有安裝: %s",);
("讀取失敗,請(qǐng)檢查是否定義數(shù)據(jù)區(qū)");
}
3. DAO連接
DAO(Data )是一組 /Jet數(shù)據(jù)庫引擎的COM自動(dòng)化接口.DAO直接與/Jet數(shù)據(jù)庫通信.通過Jet數(shù)據(jù)庫引擎,DAO也可以同其他數(shù)據(jù)庫進(jìn)行通信。DAO還封裝了數(shù)據(jù)庫的結(jié)構(gòu)單元,通過DAO可以直接修改數(shù)據(jù)庫的結(jié)構(gòu),而不必使用SQL的數(shù)據(jù)定義語言(DDL)。
DAO的體系結(jié)構(gòu)如下:
DAO封裝的類:
(1):對(duì)DAO工作區(qū)(數(shù)據(jù)庫處理事務(wù)管理器)的封裝
(2):對(duì)DAO數(shù)據(jù)庫對(duì)象的封裝,負(fù)責(zé)數(shù)據(jù)庫連接.
(3):對(duì)DAO記錄集對(duì)象的封裝,代表所選的一組記錄.
(4):對(duì)表定義對(duì)象的封裝,代表基本表或附加表定義.
(5):對(duì)查詢對(duì)象的封裝,包含所有查詢的定義.
(6):DAO用于接收數(shù)據(jù)庫操作異常的類.
(7)
DAO提供了很好的數(shù)據(jù)庫編程的對(duì)象模型.但是,對(duì)數(shù)據(jù)庫的所有調(diào)用以及輸出的數(shù)據(jù)都必須通過/Jet數(shù)據(jù)庫引擎,這對(duì)于使用數(shù)據(jù)庫應(yīng)用程序,是嚴(yán)重的瓶頸。
DAO相對(duì)于ODBC來說,屬于高層的數(shù)據(jù)庫接口.
4. OLE DB連接
OLE DB對(duì)ODBC進(jìn)行了兩方面的擴(kuò)展:一是提供了數(shù)據(jù)庫編程的OLE接口即COM,二是提供了一個(gè)可用于關(guān)系型和非關(guān)系型數(shù)據(jù)源的接口。
OLE DB提供了COM接口,與傳統(tǒng)的數(shù)據(jù)庫接口相比,有更好的健壯性和靈活性,具有很強(qiáng)的錯(cuò)誤處理能力,能夠同非關(guān)系數(shù)據(jù)源進(jìn)行通信。
與ODBC API一樣,OLE DB也屬于底層的數(shù)據(jù)庫編程接口,OLE DB結(jié)合了ODBC對(duì)關(guān)系數(shù)據(jù)庫的操作功能,并進(jìn)行擴(kuò)展,可以訪問非關(guān)系數(shù)據(jù)庫。
OLE DB訪問數(shù)據(jù)庫的原理如下:
OLE DB程序結(jié)構(gòu):
OLE DB由客戶()和服務(wù)器()。客戶是使用數(shù)據(jù)的應(yīng)用程序,它通過OLE DB接口對(duì)數(shù)據(jù)提供者的數(shù)據(jù)進(jìn)行訪問和控制。OLE DB服務(wù)器是提供OLE DB接口的軟件組件。根據(jù)提供的內(nèi)容可以分為數(shù)據(jù)提供程序(Data )和服務(wù)提供程序( )。
程序結(jié)構(gòu)原理圖如下:
數(shù)據(jù)提供程序
數(shù)據(jù)提供程序擁有自己的數(shù)據(jù)并把數(shù)據(jù)以表格的形式呈現(xiàn)給使用者使用.
服務(wù)提供程序
服務(wù)提供程序是數(shù)據(jù)提供程序和使用者的結(jié)合。它是OLE DB體系結(jié)構(gòu)中的中間件,它是OLE DB數(shù)據(jù)源的使用者和數(shù)據(jù)使用程序的提供者
數(shù)據(jù)使用程序
數(shù)據(jù)使用程序?qū)Υ鎯?chǔ)在數(shù)據(jù)提供程序中的數(shù)據(jù)進(jìn)行使用和控制.
OLE DB開發(fā)程序的一般步驟:
初始化COM環(huán)境
連接數(shù)據(jù)源
打開對(duì)話
執(zhí)行命令
處理結(jié)果
清除對(duì)象
應(yīng)用實(shí)例:
使用OLEDB編寫數(shù)據(jù)庫應(yīng)用程序
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ù)庫的訪問協(xié)議。
OLE DB是一套通過COM接口訪問數(shù)據(jù)的接口。這個(gè)OLE DB接口相當(dāng)通用,足以提供一種訪問數(shù)據(jù)的統(tǒng)一手段,而不管存儲(chǔ)數(shù)據(jù)所使用的方法如何。同時(shí),OLE DB還允許開發(fā)人員繼續(xù)利用基礎(chǔ)數(shù)據(jù)庫技術(shù)的優(yōu)點(diǎn),而不必為了利用這些優(yōu)點(diǎn)而把數(shù)據(jù)移出來。
2使用ATL使用OLE DB數(shù)據(jù)使用程序
由于直接使用OLE DB的對(duì)象和接口設(shè)計(jì)數(shù)據(jù)庫應(yīng)用程序需要書寫大量的代碼。為了簡(jiǎn)化程序設(shè)計(jì), C++提供了ATL模板用于設(shè)計(jì)OLE DB數(shù)據(jù)應(yīng)用程序和數(shù)據(jù)提供程序。
利用ATL模板可以很容易地將OLE DB與MFC結(jié)合起來,使數(shù)據(jù)庫的參數(shù)查詢等復(fù)雜的編程得到簡(jiǎn)化。MFC提供的數(shù)據(jù)庫類使OLE DB的編程更具有面向?qū)ο蟮奶匦浴iual 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)數(shù)據(jù)庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數(shù)據(jù)使用程序。
模板的使用
OLE DB數(shù)據(jù)使用者模板是由一些模板組成的,包括如下一些模板,下面對(duì)一些常用類作一些介紹。
1)、 會(huì)話類
類
類與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ù)源的連接。
類
所創(chuàng)建的對(duì)象代表了一個(gè)單獨(dú)的數(shù)據(jù)庫訪問的會(huì)話。一個(gè)用類產(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ù)操作。
類
類是用來訪問枚舉器查詢后所產(chǎn)生的行集中可用數(shù)據(jù)提供程序的信息的訪問器,可提供當(dāng)前可用的數(shù)據(jù)提供程序和可見的訪問器。
2)、 訪問器類
類
類代表與訪問器的類型。當(dāng)用戶知道數(shù)據(jù)庫的類型和結(jié)構(gòu)時(shí),可以使用此類。它支持對(duì)一個(gè)行集采用多個(gè)訪問器,并且,存放數(shù)據(jù)的緩沖區(qū)是由用戶分配的。
類
類用來在程序運(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)建訪問器。
類
類中以在程序運(yùn)行時(shí)將列與變量綁定或者是將參數(shù)與變量捆定。
3)、 行集類
類
類封裝了行集對(duì)象和相應(yīng)的接口,并且提供了一些方法用于查詢、設(shè)置數(shù)據(jù)等。可以用Move()等函數(shù)進(jìn)行記錄移動(dòng),用()函數(shù)讀取數(shù)據(jù),用()、()、()來更新數(shù)據(jù)。
類
類用于在一次調(diào)用中取回多個(gè)行句柄或者對(duì)多個(gè)行進(jìn)行操作。
類
類提供用數(shù)組下標(biāo)進(jìn)行數(shù)據(jù)訪問。
4)、 命令類
類
類用于對(duì)數(shù)據(jù)庫的簡(jiǎn)單訪問,用數(shù)據(jù)源的名稱得到行集,從而得到數(shù)據(jù)。
類
類用于支持命令的數(shù)據(jù)源。可以用Open()函數(shù)來執(zhí)行SQL命令,也可以()函數(shù)先對(duì)命令進(jìn)行準(zhǔn)備主流數(shù)據(jù)庫有哪些,對(duì)于支持命令的數(shù)據(jù)源,可以提高程序的靈活性和健壯性。
在.h頭文件里,加入如下代碼。
#
;
#
#
# // if you are using
在.cpp文件里,加入如下代碼。
#
;
決定使用何種類型的存取程序和行集。
獲取數(shù)據(jù)
在打開數(shù)據(jù)源,會(huì)話,行集對(duì)象后就可以獲取數(shù)據(jù)了。所獲取的數(shù)據(jù)類型取決于所用的存取程序,可能需要綁定列。按以下步驟。
1、 用正確的命令打開行集對(duì)象。
2、 如果使用,在使用之前與相應(yīng)列進(jìn)行綁定。要綁定列,可以用函數(shù),如下所示:
// Get the
ULONG = 0;
* = NULL;
= NULL;
if (rs.(&, &, &) != S_OK)
on(rs., );
* pBind = new [];
rs.(, &pBind[0], ()*);
for (ULONG l=0; l