在日常學(xué)習(xí)、工作或生活中,大家總少不了接觸作文或者范文吧,通過文章可以把我們那些零零散散的思想,聚集在一塊。寫范文的時(shí)候需要注意什么呢?有哪些格式需要注意呢?下面我給大家整理了一些優(yōu)秀范文,希望能夠幫助到大家,我們一起來看一看吧。
數(shù)據(jù)庫(kù)編程的求職信息篇一
當(dāng)前各種主流數(shù)據(jù)庫(kù)有很多,包括oracle, ms sql server, sybase, informix, mysql, db2, interbase / firebird, postgresql, sqlite, sap/db, timesten, ms access等等。數(shù)據(jù)庫(kù)編程是對(duì)數(shù)據(jù)庫(kù)的創(chuàng)建、讀寫等一列的操作。數(shù)據(jù)庫(kù)編程分為數(shù)據(jù)庫(kù)客戶端編程與數(shù)據(jù)庫(kù)服務(wù)器端編程。數(shù)據(jù)庫(kù)客戶端編程主要使用odbc api、ado、、oci、otl等方法;數(shù)據(jù)庫(kù)服務(wù)端編程主要使用ole db等方法。數(shù)據(jù)庫(kù)編程需要掌握一些訪問數(shù)據(jù)庫(kù)技術(shù)方法,還需要注意怎么設(shè)計(jì)高效的數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理與運(yùn)行的優(yōu)化、數(shù)據(jù)庫(kù)語(yǔ)句的優(yōu)化。
一、訪問數(shù)據(jù)庫(kù)技術(shù)方法
數(shù)據(jù)庫(kù)編程分為數(shù)據(jù)庫(kù)客戶端編程與數(shù)據(jù)庫(kù)服務(wù)器端編程。數(shù)據(jù)庫(kù)客戶端編程主要使用odbc api、ado、、oci、otl等方法;數(shù)據(jù)庫(kù)服務(wù)端編程主要使用ole db等方法。
1、幾種是數(shù)據(jù)庫(kù)訪問方法比較
odbc
api是一種適合數(shù)據(jù)庫(kù)底層開發(fā)的編程方法,odbc
api提供大量對(duì)數(shù)據(jù)源的操作,odbc
api能夠靈活地操作游標(biāo),支持各種幫定選項(xiàng),在所有odbc相關(guān)編程中,api編程具有最高的執(zhí)行速度。dao提供了很好的數(shù)據(jù)庫(kù)編程的對(duì)象模型.但是,對(duì)數(shù)據(jù)庫(kù)的所有調(diào)用以及輸出的數(shù)據(jù)都必須通過access/jet數(shù)據(jù)庫(kù)引擎,這對(duì)于使用數(shù)據(jù)庫(kù)應(yīng)用程序,是嚴(yán)重的瓶頸。
ole
db提供了com接口,與傳統(tǒng)的數(shù)據(jù)庫(kù)接口相比,有更好的健壯性和靈活性,具有很強(qiáng)的錯(cuò)誤處理能力,能夠同非關(guān)系數(shù)據(jù)源進(jìn)行通信。
ado最主要的優(yōu)點(diǎn)在于易于使用、速度快、內(nèi)存支出少和磁盤遺跡小。
是利用數(shù)據(jù)集的概念將數(shù)據(jù)庫(kù)數(shù)據(jù)讀入內(nèi)存中,然后在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行操作,最后將數(shù)據(jù)集數(shù)據(jù)回寫到源數(shù)據(jù)庫(kù)中。
otl 是 oracle, odbc and db2-cli template library 的縮寫,是一個(gè)c++編譯中操控關(guān)系數(shù)據(jù)庫(kù)的模板庫(kù),otl中直接操作oracle主要是通過oracle提供的oci接口進(jìn)行,進(jìn)行操作db2數(shù)據(jù)庫(kù)則是通過cli接口來進(jìn)行,至于ms的數(shù)據(jù)庫(kù)和其它一些數(shù)據(jù)庫(kù),則otl只提供了odbc來操作的方式。當(dāng)然oracle和db2也可以由otl間接使用odbc的方式來進(jìn)行操縱。具有以下優(yōu)點(diǎn):跨平臺(tái);運(yùn)行效率高,與c語(yǔ)言直接調(diào)用api相當(dāng);開發(fā)效率高,使用起來更簡(jiǎn)單,更簡(jiǎn)潔;部署容易,不需要ado組件, framework 等。
2、vc數(shù)據(jù)庫(kù)編程幾種方法
vc數(shù)據(jù)庫(kù)編程幾種方法,包括odbc連接、mfc
odbc連接、dao連接、ole
db、ole
db
templates連接、ado、oracle專用方法(oci(oracle
call
interface)訪問、oracle
object
ole
c++
class
library)。
<1.>通用方法
連接
odbc(open
database
connectivity)是msoa的一部分,是一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)接口。它提供對(duì)關(guān)系數(shù)據(jù)庫(kù)訪問的統(tǒng)一接口,實(shí)現(xiàn)對(duì)異構(gòu)數(shù)據(jù)源的一致訪問。odbc數(shù)據(jù)訪問由以下部分組成:
<1>句柄(handles):odbc使用句柄來標(biāo)識(shí)odbc環(huán)境、連接、語(yǔ)句和描述器.<2>緩存區(qū)(buffers):
<3>數(shù)據(jù)類型(data
types)
<4>一致性級(jí)別(conformance
levels)
用odbc設(shè)計(jì)客戶端的一般步驟:
<1>分配odbc環(huán)境
<2>分配連接句柄
<3>連接數(shù)據(jù)源
<4>構(gòu)造和執(zhí)行sql語(yǔ)句
<5>獲得查詢結(jié)果
<6>斷開數(shù)據(jù)源的連接
<7>釋放odbc環(huán)境
odbc
api是一種適合數(shù)據(jù)庫(kù)底層開發(fā)的編程方法,odbc
api提供大量對(duì)數(shù)據(jù)源的操作,odbc
api能夠靈活地操作游標(biāo),支持各種幫定選項(xiàng),在所有odbc相關(guān)編程中,api編程具有最高的執(zhí)行速度.因此,odbc
api編程屬于底層編程。
odbc連接
mfc
odbc是mfc對(duì)odbc進(jìn)行的封裝,以簡(jiǎn)化對(duì)odbc
api的 調(diào)用,
odbc的封裝主要開發(fā)了cdatabase類和crecordset類
(1)cdatabase類
cdatabase類用于應(yīng)用程序建立同數(shù)據(jù)源的連接。cdatabase類中包含一個(gè)m_hdbc變量,它代表了數(shù)據(jù)源的連接句柄。如果要建立cdatabase類的實(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ù)源。
cdatabase類提供了對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的函數(shù)及事務(wù)操作。
(2)crecordset類
crecordset類定義了從數(shù)據(jù)庫(kù)接收或者發(fā)送數(shù)據(jù)到數(shù)據(jù)庫(kù)的成員變量,以實(shí)現(xiàn)對(duì)數(shù)據(jù)集的數(shù)據(jù)操作。
crecordset類的成員變量m_hstmt代表了定義該記錄集的sql語(yǔ)句句柄,m_nfields為記錄集中字段的個(gè)數(shù),m_nparams為記錄集所使用的參數(shù)個(gè)數(shù)。
crecordset的記錄集通過cdatabase實(shí)例的指針實(shí)現(xiàn)同數(shù)據(jù)源的連接,
odbc編程更適合于界面型數(shù)據(jù)庫(kù)應(yīng)用程序的開發(fā),但由于cdatabase類和crecordset類提供的數(shù)據(jù)庫(kù)操作函數(shù)有限,支持的游標(biāo)類型也有限,限制了高效的數(shù)據(jù)庫(kù)開發(fā)。在編程層次上屬于高級(jí)編程。
應(yīng)用實(shí)例: 1.打開數(shù)據(jù)庫(kù)
cdatabase database;
(_t(“dsn=zhuxue”),cdatabase::noodbcdialog);//zhuxue為數(shù)據(jù)源名稱
2.關(guān)聯(lián)記錄集
crecordset recset(&database);
3.查詢記錄
cstring ssql1=“";
ssql1 = ”select * from tablename“;
(crecordset::forwardonly, ssql1, crecordset::readonly);
int ti=0;
cdbvariant var;//var可以轉(zhuǎn)換為其他類型的值
while(!())
{
//讀取excel內(nèi)部數(shù)值
ldvalue(”id“,var);
jiangxiang[ti].id=var.m_ival;
ldvalue(”name“, jiangxiang[ti].name);
ti++;
xt();
}
();//關(guān)閉記錄集
4.執(zhí)行sql語(yǔ)句
cstring ssql=”“;
ssql+=”delete * from 院系審核“;//清空表
esql(ssql);
ssql也可以為insert ,update等語(yǔ)句
5.讀取字段名
ssql = ”select * from sheet1“;
//讀取的文件有sheet1表的定義,或?yàn)楸境绦蛏傻谋?// 執(zhí)行查詢語(yǔ)句
(crecordset::forwardonly, ssql, crecordset::readonly);
int excelcolcount=cfieldcount();//列數(shù)
cstring excelfield[30];
//得到記錄集的字段集合中的字段的總個(gè)數(shù)
for(i=0;i
{
codbcfieldinfo fieldinfo;
cfieldinfo(i,fieldinfo);
excelfield[i].name =fieldinfo.m_strname;//字段名
}
6.打開excel文件
cstring sdriver = ”microsoft excel driver(*.xls)“;// excel安裝驅(qū)動(dòng)
cstring ssql,sexcelfile;//sexcelfile為excel的文件路徑
try
{
// 創(chuàng)建進(jìn)行存取的字符串
(”driver={%s};dsn='';firstrowhasnames=1;readonly=false;create_db=/“%s/”;dbq=%s“,sdriver, sexcelfile, sexcelfile);
// 創(chuàng)建數(shù)據(jù)庫(kù)(既excel表格文件)
if((ssql,cdatabase::noodbcdialog))
{
//可以把excel作為一個(gè)數(shù)據(jù)庫(kù)操作
}
}
catch(e)
{
trace1(”excel驅(qū)動(dòng)沒有安裝: %s“,sdriver);
afxmessagebox(”讀取失敗,請(qǐng)檢查是否定義數(shù)據(jù)區(qū)sheet1“);
}
連接
dao(data
access
object)是一組microsoft
access/直接與access/jet數(shù)據(jù)庫(kù)通信.通過jet數(shù)據(jù)庫(kù)引擎,dao也可以同其他數(shù)據(jù)庫(kù)進(jìn)行通信。dao還封裝了access數(shù)據(jù)庫(kù)的結(jié)構(gòu)單元,通過dao可以直接修改access數(shù)據(jù)庫(kù)的結(jié)構(gòu),而不必使用sql的數(shù)據(jù)定義語(yǔ)言(ddl)。
dao的體系結(jié)構(gòu)如下:
dao封裝的類:
(1)cdaoworkspace:對(duì)dao工作區(qū)(數(shù)據(jù)庫(kù)處理事務(wù)管理器)的封裝
(2)cdaodatabase:對(duì)dao數(shù)據(jù)庫(kù)對(duì)象的封裝,負(fù)責(zé)數(shù)據(jù)庫(kù)連接.(3)cdaorecordset:對(duì)dao記錄集對(duì)象的封裝,代表所選的一組記錄.(4)cdaotabledef:對(duì)表定義對(duì)象的封裝,代表基本表或附加表定義.(5)cdaoquerydef:對(duì)查詢對(duì)象的封裝,包含所有查詢的定義.(6)cdaoexception:dao用于接收數(shù)據(jù)庫(kù)操作異常的類.(7)cdaofieldexchange
dao提供了很好的數(shù)據(jù)庫(kù)編程的對(duì)象模型.但是,對(duì)數(shù)據(jù)庫(kù)的所有調(diào)用以及輸出的數(shù)據(jù)都必須通過access/jet數(shù)據(jù)庫(kù)引擎,這對(duì)于使用數(shù)據(jù)庫(kù)應(yīng)用程序,是嚴(yán)重的瓶頸。
dao相對(duì)于odbc來說,
db連接
ole
db對(duì)odbc進(jìn)行了兩方面的擴(kuò)展:一是提供了數(shù)據(jù)庫(kù)編程的ole接口即com,二是提供了一個(gè)可用于關(guān)系型和非關(guān)系型數(shù)據(jù)源的接口。
ole
db提供了com接口,與傳統(tǒng)的數(shù)據(jù)庫(kù)接口相比,有更好的健壯性和靈活性,具有很強(qiáng)的錯(cuò)誤處理能力,能夠同非關(guān)系數(shù)據(jù)源進(jìn)行通信。
與odbc
api一樣,ole
db也屬于底層的數(shù)據(jù)庫(kù)編程接口,ole
db結(jié)合了odbc對(duì)關(guān)系數(shù)據(jù)庫(kù)的操作功能,并進(jìn)行擴(kuò)展,可以訪問非關(guān)系數(shù)據(jù)庫(kù)。
ole
db訪問數(shù)據(jù)庫(kù)的原理如下:
ole
db程序結(jié)構(gòu):
ole
db由客戶(consumer)和服務(wù)器(provider)??蛻羰鞘褂脭?shù)據(jù)的應(yīng)用程序,它通過ole
db接口對(duì)數(shù)據(jù)提供者的數(shù)據(jù)進(jìn)行訪問和控制。ole
db服務(wù)器是提供ole
db接口的軟件組件。根據(jù)提供的內(nèi)容可以分為數(shù)據(jù)提供程序(data
provider)和服務(wù)提供程序(service
provider)。
程序結(jié)構(gòu)原理圖如下:
<1>數(shù)據(jù)提供程序
數(shù)據(jù)提供程序擁有自己的數(shù)據(jù)并把數(shù)據(jù)以表格的形式呈現(xiàn)給使用者使用.<2>服務(wù)提供程序
服務(wù)提供程序是數(shù)據(jù)提供程序和使用者的結(jié)合。它是ole
db體系結(jié)構(gòu)中的中間件,它是ole
db數(shù)據(jù)源的使用者和數(shù)據(jù)使用程序的提供者
<3>數(shù)據(jù)使用程序
db開發(fā)程序的一般步驟:
<1>初始化com環(huán)境
<2>連接數(shù)據(jù)源
<3>打開對(duì)話
<4>執(zhí)行命令
<5>處理結(jié)果
<6>清除對(duì)象
應(yīng)用實(shí)例:
使用oledb編寫數(shù)據(jù)庫(kù)應(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ù)庫(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ù)移出來。
使用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é)合起來,使數(shù)據(jù)庫(kù)的參數(shù)查詢等復(fù)雜的編程得到簡(jiǎn)化。mfc提供的數(shù)據(jù)庫(kù)類使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ù)庫(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ú)的數(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ì)數(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頭文件里,加入如下代碼。#include extern ccommodule _module;#include #include #include // if you are using schema templates 文件里,加入如下代碼。#include ccommodule _module;決定使用何種類型的存取程序和行集。獲取數(shù)據(jù)
在打開數(shù)據(jù)源,會(huì)話,行集對(duì)象后就可以獲取數(shù)據(jù)了。所獲取的數(shù)據(jù)類型取決于所用的存取程序,可能需要綁定列。按以下步驟。1、用正確的命令打開行集對(duì)象。
2、如果使用cmanualaccessor,在使用之前與相應(yīng)列進(jìn)行綁定。要綁定列,可以用函數(shù)getcolumninfo,如下所示: // get the column information ulong ulcolumns
= 0;dbcolumninfo* pcolumninfo = null;lpolestr pstrings
= null;if(umninfo(&ulcolumns, &pcolumninfo, &pstrings)!= s_ok)afxthrowoledbexception(rs.m_prowset, iid_icolumnsinfo);struct mybind* pbind = new mybind[ulcolumns];accessor(ulcolumns, &pbind[0], sizeof(mybind)*ulcolumns);for(ulong l=0;l
3、用while循環(huán)來取數(shù)據(jù)。在循環(huán)中,調(diào)用movenext來測(cè)試光標(biāo)的返回值是否為s_ok,如下所示: while(xt()== s_ok){
// add code to fetch data here
// if you are not using an auto accessor, call a()}
4、在while循環(huán)內(nèi),可以通過不同的存取程序獲取數(shù)據(jù)。1)如果使用的是caccessor類,可以通過使用它們的數(shù)據(jù)成員進(jìn)行直接訪問。如下所示:
2)如果使用的是cdynamicaccessor 或cdynamicparameteraccessor 類,可以通過getvalue或getcolumn函數(shù)來獲取數(shù)據(jù)??梢杂胓ettype來獲取所用數(shù)據(jù)類型。如下所示: while(xt()== s_ok){
// use the dynamic accessor functions to retrieve your
// data
ulong ulcolumns = umncount();
for(ulong i=0;i
{
ue(i);
} } 3)如果使用的是cmanualaccessor,可以指定自己的數(shù)據(jù)成員,綁定它們。就可以直接存取。如下所示: while(xt()== s_ok){
// use the data members you specified in the calls to
// tf(”%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)建數(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ù)的讀寫以及建立書簽。應(yīng)用案例:
visual c++中使用ole db讀寫sql server 在需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí),ole db總是被認(rèn)為是一種效率最高但最難的方法。但是以我最近使用ole db的經(jīng)驗(yàn)看來,ole db的效率高則高矣,但卻一點(diǎn)都不難。說它難恐怕主要是因?yàn)榭蓞⒖嫉闹形馁Y料太少,為了幫助以后需要接觸ole db的同行,我撰寫了這篇文章。本文包含如下內(nèi)容:
db寫數(shù)據(jù)庫(kù); db讀數(shù)據(jù)庫(kù);
db對(duì)二進(jìn)制數(shù)據(jù)(text、ntext、image等)的處理。
首先來看看對(duì)sql server進(jìn)行寫操作的代碼,有一定vc基礎(chǔ)的讀者應(yīng)該可以很順利地看懂。ole db寫數(shù)據(jù)庫(kù),就是這么簡(jiǎn)單!
注:
1.以下代碼中使用的模板類eautoreleaseptr
與atl中的ccomptr
類似,是一個(gè)在析構(gòu)時(shí)自動(dòng)調(diào)用release的類。ccomptr
的代碼在atlbase.h中定義。
2.以下代碼均在unicode環(huán)境下編譯,因?yàn)閳?zhí)行的sql語(yǔ)句必須是unicode的。設(shè)置工程為unicode的方法是:首先在project->settings->c/c++的屬性頁(yè)中的preprocessor中,刪除_mbcs寫入unicode,_unicode。然后在link屬性頁(yè)中category中選擇output,在entry-point symbol 中添加wwinmaincrtstartup。eautoreleaseptr
pidbinitialize;hresult hresult = connectdatabase(&pidbinitialize, _t(”127.0.0.1“), _t(“sa”), _t(”password“));if(failed(hresult)){
//失敗,可能是因?yàn)閿?shù)據(jù)庫(kù)沒有啟動(dòng)、用戶名密碼錯(cuò)等等return;}eautoreleaseptr
piopenrowset;hresult = createsession(pidbinitialize, &piopenrowset);if(failed(hresult)){
//出錯(cuò)return;}eautoreleaseptr
picommand;eautoreleaseptr
picommandtext;hresult = createcommand(piopenrowset, &picommand, &picommandtext);if(failed(hresult)){
//出錯(cuò)return;}hresult = executesql(picommand, picommandtext, _t(”use pbdata“));if(failed(hresult)){
//如果這里失敗,那就是sql語(yǔ)句執(zhí)行失敗。在此處,就是pbdata還未創(chuàng)建
return;}
// 創(chuàng)建表 executesql(picommand, picommandtext, _t(”create table 2005_1(volume real not null,id int not null identity)“));
// 添加記錄
executesql(picommand, picommandtext, _t(”insert into 2005_1 values(100.0)“));//...其中幾個(gè)函數(shù)的代碼如下:
hresult connectdatabase(idbinitialize** ppidbinitialize, lpctstr pszdatasource, lpctstr pszuserid, lpctstr pszpassword){
assert(ppidbinitialize!= null && pszdatasource!= null && pszuserid!= null && pszpassword!= null);
uint utimeout = 15u;// 連接數(shù)據(jù)庫(kù)超時(shí)(秒)
tchar szinitstr[1024];
verify(1023 >= wsprintf(szinitstr, _t(”provider=sqloledb;data source=%s;initial catalog=master;user id=%s;password=%s;connect timeout=%u“), pszdatasource, pszuserid, pszpassword, utimeout));
//initial catalog=master指明連接成功后,”use master“。
eautoreleaseptr
pidatainitialize;
hresult hresult = ::cocreateinstance(clsid_msdainitialize, null, clsctx_inproc_server,iid_idatainitialize,(void**)&pidatainitialize);if(failed(hresult))
{
return hresult;
}
eautoreleaseptr
pidbinitialize;
hresult = pidatainitialize->getdatasource(null, clsctx_inproc_server,(lpcolestr)szinitstr,iid_idbinitialize,(iunknown**)&pidbinitialize);if(failed(hresult))
{
return hresult;
}
hresult = pidbinitialize->initialize();
if(failed(hresult))
{
return hresult;
}
* ppidbinitialize = ();
return s_ok;}
hresult createsession(idbinitialize* pidbinitialize, iopenrowset** ppiopenrowset){
assert(pidbinitialize!= null && ppiopenrowset!= null);
eautoreleaseptr
psession;
hresult hresult = pidbinitialize->queryinterface(iid_idbcreatesession,(void**)&psession);if(failed(hresult))
{
return hresult;
}
eautoreleaseptr
piopenrowset;
hresult = psession->createsession(null, iid_iopenrowset,(iunknown**)&piopenrowset);if(failed(hresult))
{
return hresult;
}
* ppiopenrowset = ();
return s_ok;}
hresult createcommand(iopenrowset* piopenrowset, icommand** ppicommand, icommandtext** ppicommandtext){
assert(piopenrowset!= null && ppicommand!= null && ppicommandtext!= null);
hresult hresult;
eautoreleaseptr
picommand;
{eautoreleaseptr
picreatecommand;
hresult = piopenrowset->queryinterface(iid_idbcreatecommand,(void**)&picreatecommand);if(failed(hresult))
{
return hresult;
}
hresult = picreatecommand->createcommand(null, iid_icommand,(iunknown**)&picommand);
if(failed(hresult))
{
return hresult;
}
}
eautoreleaseptr
picommandtext;
hresult = picommand->queryinterface(&picommandtext);if(failed(hresult))
{
return hresult;
}
* ppicommand = ();
* ppicommandtext = ();
return s_ok;}
hresult executesql(icommand* picommand, icommandtext* picommandtext, lpctstr pszcommand, long* plrowsaffected){
assert(picommand!= null && picommandtext!= null && pszcommand!= null && pszcommand[0]!= 0);
hresult hresult = picommandtext->setcommandtext(dbguid_dbsql,(lpcolestr)pszcommand);
if(failed(hresult))
{
return hresult;
}
long laffected;
hresult = picommand->execute(null, iid_null, null, plrowsaffected == null ? &laffected : plrowsaffected,(iunknown**)null);
return hresult;}
以上就是寫數(shù)據(jù)庫(kù)的全部代碼了,是不是很簡(jiǎn)單呢?下面再來讀的。
// 先用與上面代碼中一樣的步驟獲取picommand,picommandtext。此處省略
hresult hresult = picommandtext->setcommandtext(dbguid_dbsql,(lpcolestr)_t(”select volume from 2005_1 where id = @@identity"));//取我們剛剛添加的那一條記錄
if(failed(hresult)){
return;}
long laffected;eautoreleaseptr
pirowset;hresult = picommand->execute(null, iid_irowset, null, &laffected,(iunknown**)&pirowset);if(failed(hresult)){
return;}eautoreleaseptr
piaccessor;hresult = pirowset->queryinterface(iid_iaccessor,(void**)&piaccessor);if(failed(hresult)){
return;}// 一個(gè)根據(jù)表中各字段的數(shù)值類型而定義的結(jié)構(gòu),用于存儲(chǔ)返回的各字段的值
struct cloadlastfromdb {
dbstatus dwdsvolume;
dword
dwlenvolume;
float
fvolume;};
// 此處我們只查詢了一個(gè)字段。如果要查詢多個(gè)字段,cloadlastfromdb中要添加相應(yīng)的字段定義,下面的dbbinding也要相應(yīng)擴(kuò)充。dbbinding[].iordinal要分別指向各個(gè)字段,dbbinding[].wtype要根據(jù)字段類型賦合適的值。
dbbinding dbbinding[1];dbbinding[0].iordinal
= 1;
// volume 字段的位置,從 1 開始
dbbinding[0].obvalue
= offsetof(cloadlastfromdb, fvolume);dbbinding[0].oblength
= offsetof(cloadlastfromdb, dwlenvolume);dbbinding[0].obstatus
= offsetof(cloadlastfromdb, dwdsvolume);dbbinding[0].ptypeinfo
= null;dbbinding[0].pobject
= null;dbbinding[0].pbindext
= null;dbbinding[0].dwpart
= dbpart_value | dbpart_status | dbpart_length;dbbinding[0].dwmemowner = dbmemowner_clientowned;dbbinding[0].eparamio
= dbparamio_notparam;dbbinding[0].cbmaxlen
= 0;dbbinding[0].dwflags
= 0;
數(shù)據(jù)庫(kù)編程的求職信息篇二
數(shù)據(jù)庫(kù)編程的自薦信例文,關(guān)鍵詞是自薦信,數(shù)據(jù)庫(kù)編程,
尊敬的人力資源部領(lǐng)導(dǎo):
您好!我叫劉欣,感謝您在百忙之中查看我的資料。我是新華學(xué)校的一名好范文,在校期間,我勤奮努力學(xué)習(xí),成績(jī)優(yōu)異,多次獲學(xué)校學(xué)金,掌握了windows、c語(yǔ)言、pasca、,數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫(kù)原理等專業(yè)基礎(chǔ)知識(shí)。同時(shí),通過大量的實(shí)際操作,我熟練掌握了dos,windows操作系統(tǒng),并對(duì)unix有一定的了解,能夠獨(dú)立word、excel、photoshop等應(yīng)用等軟件,有一定的語(yǔ)言編程基礎(chǔ),在經(jīng)濟(jì)信息及計(jì)算機(jī)應(yīng)用專業(yè)通過三年的學(xué)習(xí),我已具備了扎實(shí)的專業(yè)基礎(chǔ)知識(shí)功底。
作為一名的學(xué)生,我認(rèn)識(shí)到互聯(lián)網(wǎng)將在未來經(jīng)濟(jì)中發(fā)揮巨大的作用,所以,業(yè)余時(shí)間我刻苦自學(xué)了很多網(wǎng)絡(luò)知識(shí)。首先,在internet基礎(chǔ)應(yīng)用方面,比如瀏覽網(wǎng)頁(yè),搜索引擎的使用,網(wǎng)上查找,下載所需信息等都很熟練。而且,我還不滿足于此,進(jìn)一步學(xué)習(xí)了html語(yǔ)言,和,frontpage,dreamweaver等網(wǎng)頁(yè)編輯軟件,firework,flash等網(wǎng)頁(yè)圖形處理軟件,可以自如的進(jìn)行網(wǎng)頁(yè)編輯?,F(xiàn)在我在互聯(lián)網(wǎng)上,就已經(jīng)建立了自己的個(gè)人主頁(yè),并用文件傳輸協(xié)議(ftp)進(jìn)行維護(hù)和。不斷的努力使我的網(wǎng)站日趨成熟。
當(dāng)然一個(gè)高素質(zhì)除了掌握扎實(shí)的專業(yè)知識(shí),還應(yīng)該具有豐富的人文知識(shí)。我從小熱愛文學(xué),廣覽群書,為我的寫作能力奠定了堅(jiān)實(shí)的基礎(chǔ)。讀書以來,不斷參加校內(nèi)外征文活動(dòng),發(fā)表過作品數(shù)篇。特別在大學(xué)期間,被特邀為校報(bào)記者,參賽文章多次獲得校園文學(xué)獎(jiǎng)。.此外,在英語(yǔ)的學(xué)習(xí)方面,我已具備了一定的聽,說,寫和會(huì)話能力,可以用英語(yǔ)進(jìn)行日常的交流。
未來社會(huì)需要的是理論和實(shí)踐相結(jié)合的復(fù)合型。學(xué)習(xí)之余,我參加了大量的社會(huì)實(shí)踐活動(dòng),做家教,去商場(chǎng)做過促銷員,從而鍛煉了自己吃苦耐勞,一絲不茍的工作做風(fēng).未來是一個(gè)充滿挑戰(zhàn)的世界,鮮花和榮譽(yù)只能代表過去。年輕的我希望公司給我展示自我的機(jī)會(huì)。沒有您伯樂的眼光,對(duì)我來講那是一種遺憾。因此,我非常希望能夠成為貴公司的一員。我將以更大的熱情和勤奮上進(jìn)的工作態(tài)度投入到新的工作環(huán)境中去,為公司的發(fā)展添磚加瓦。
愿公司的明天更美好!
此致
敬禮
數(shù)據(jù)庫(kù)編程的求職信息篇三
尊敬的人力資源部領(lǐng)導(dǎo):
您好!我叫,感謝您在百忙之中查看我的資料。我是新華學(xué)校的一名應(yīng)屆畢業(yè)生,在校期間,我勤奮努力學(xué)習(xí),成績(jī)優(yōu)異,多次獲學(xué)校學(xué)金,掌握了windows、c語(yǔ)言、pasca、,數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫(kù)原理等專業(yè)基礎(chǔ)知識(shí)。同時(shí),通過大量的實(shí)際操作,我熟練掌握了dos,windows操作系統(tǒng),并對(duì)unix有一定的了解,能夠獨(dú)立word、excel、photoshop等應(yīng)用等軟件,有一定的語(yǔ)言編程基礎(chǔ),在經(jīng)濟(jì)信息及計(jì)算機(jī)應(yīng)用專業(yè)通過三年的學(xué)習(xí),我已具備了扎實(shí)的專業(yè)基礎(chǔ)知識(shí)功底。
作為一名的學(xué)生,我認(rèn)識(shí)到互聯(lián)網(wǎng)將在未來經(jīng)濟(jì)中發(fā)揮巨大的作用,所以,業(yè)余時(shí)間我刻苦自學(xué)了很多網(wǎng)絡(luò)知識(shí)。首先,在internet基礎(chǔ)應(yīng)用方面,比如瀏覽網(wǎng)頁(yè),搜索引擎的使用,網(wǎng)上查找,下載所需信息等都很熟練。而且,我還不滿足于此,進(jìn)一步學(xué)習(xí)了html語(yǔ)言,和,frontpage,dreamweaver等網(wǎng)頁(yè)編輯軟件,firework,flash等網(wǎng)頁(yè)圖形處理軟件,可以自如的進(jìn)行網(wǎng)頁(yè)編輯?,F(xiàn)在我在互聯(lián)網(wǎng)上,就已經(jīng)建立了自己的個(gè)人主頁(yè),并用文件傳輸協(xié)議(ftp)進(jìn)行維護(hù)和。不斷的努力使我的網(wǎng)站日趨成熟。
當(dāng)然一個(gè)高素質(zhì)除了掌握扎實(shí)的專業(yè)知識(shí),還應(yīng)該具有豐富的人文知識(shí)。我從小熱愛文學(xué),廣覽群書,為我的寫作能力奠定了堅(jiān)實(shí)的基礎(chǔ)。讀書以來,不斷參加校內(nèi)外征文活動(dòng),發(fā)表過作品數(shù)篇。特別在大學(xué)期間,被特邀為校報(bào)記者,參賽文章多次獲得校園文學(xué)獎(jiǎng)。.此外,在英語(yǔ)的學(xué)習(xí)方面,我已具備了一定的聽,說,寫和會(huì)話能力,可以用英語(yǔ)進(jìn)行日常的交流。
未來社會(huì)需要的是理論和實(shí)踐相結(jié)合的復(fù)合型。學(xué)習(xí)之余,我參加了大量的社會(huì)實(shí)踐活動(dòng),做家教,去商場(chǎng)做過促銷員,從而鍛煉了自己吃苦耐勞,一絲不茍的工作做風(fēng).未來是一個(gè)充滿挑戰(zhàn)的世界,鮮花和榮譽(yù)只能代表過去。年輕的我希望公司給我展示自我的機(jī)會(huì)。沒有您伯樂的眼光,對(duì)我來講那是一種遺憾。因此,我非常希望能夠成為貴公司的一員。我將以更大的熱情和勤奮上進(jìn)的工作態(tài)度投入到新的工作環(huán)境中去,為公司的發(fā)展添磚加瓦。
愿公司的明天更美好!
此致
敬禮
【本文地址:http://mlvmservice.com/zuowen/1084136.html】