av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

C內(nèi)置數(shù)據(jù)庫(kù),讓數(shù)據(jù)處理更加高效(c內(nèi)置數(shù)據(jù)庫(kù))

隨著數(shù)據(jù)處理和管理的需求日益增加,數(shù)據(jù)庫(kù)的應(yīng)用也變得越來(lái)越普遍。數(shù)據(jù)庫(kù)的出現(xiàn)使得人們可以更加方便地對(duì)數(shù)據(jù)進(jìn)行管理、存儲(chǔ)和查詢。同時(shí),隨著計(jì)算機(jī)程序的不斷發(fā)展,C語(yǔ)言作為一門重要的編程語(yǔ)言,也為數(shù)據(jù)庫(kù)的應(yīng)用提供了更加便捷有效的解決方案。本文將介紹C內(nèi)置數(shù)據(jù)庫(kù)的使用方法,探尋其對(duì)數(shù)據(jù)處理的高效性。

成都創(chuàng)新互聯(lián)專注于企業(yè)營(yíng)銷型網(wǎng)站、網(wǎng)站重做改版、吉安網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為吉安等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

C內(nèi)置數(shù)據(jù)庫(kù)是一種輕量級(jí)的數(shù)據(jù)庫(kù),當(dāng)程序需要處理一些數(shù)據(jù)時(shí),可以直接在程序中使用這種數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)管理,將數(shù)據(jù)寫入到C內(nèi)置數(shù)據(jù)庫(kù)中,或是從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)并進(jìn)行操作。與傳統(tǒng)的數(shù)據(jù)庫(kù)相比,C內(nèi)置數(shù)據(jù)庫(kù)具有輕量、高效的特點(diǎn),可以快速實(shí)現(xiàn)數(shù)據(jù)的讀寫和查詢。

在使用C內(nèi)置數(shù)據(jù)庫(kù)之前,需要準(zhǔn)備好數(shù)據(jù)庫(kù)和相關(guān)的軟件工具。目前,C語(yǔ)言內(nèi)置數(shù)據(jù)庫(kù)的主要有兩種:SQLite和BerkeleyDB。下面,我們將以SQLite為例,介紹C內(nèi)置數(shù)據(jù)庫(kù)的使用方法。

需要在程序中引入相關(guān)的庫(kù)文件,通過(guò)#include語(yǔ)句引入SQLite頭文件,例如:

#include

之后,需要打開一個(gè)數(shù)據(jù)庫(kù),使用sqlite3_open函數(shù)可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接,例如:

sqlite3 *db;

char *errmsg = 0;

int ret = sqlite3_open(“test.db”, &db);

if(ret != SQLITE_OK){

  fprintf(stderr, “Can’t open database:%s\n”, sqlite3_errmsg(db));

  sqlite3_close(db);

  return -1;

}

在上述例子中,“test.db”是數(shù)據(jù)庫(kù)的名字,如果該數(shù)據(jù)庫(kù)不存在,則會(huì)自動(dòng)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)文件。如果打開數(shù)據(jù)庫(kù)成功,函數(shù)返回值為SQLITE_OK,否則函數(shù)返回錯(cuò)誤碼。可以通過(guò)sqlite3_errmsg()函數(shù)來(lái)獲取具體的錯(cuò)誤信息。

接下來(lái),我們可以使用SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,如增加、刪除和查詢數(shù)據(jù)等。例如,通過(guò)以下語(yǔ)句創(chuàng)建一張學(xué)生表:

char *sql = “create table student(id integer primary key, name text,age integer);”;

ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);

if(ret != SQLITE_OK){

  fprintf(stderr,”create fled:%s\n”,errmsg);

  sqlite3_free(errmsg);

}

在上述例子中,sqlite3_exec函數(shù)表示執(zhí)行一條SQL語(yǔ)句,如果操作成功則返回SQLITE_OK,否則返回錯(cuò)誤碼。同時(shí),為了防止SQL注入攻擊,建議使用預(yù)編譯SQL語(yǔ)句。

除了創(chuàng)建表之外,還可以插入數(shù)據(jù),如:

char *sql = “insert into student (id,name,age) values ( 1 ,’ Tom ‘, 20)”;

ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);

if(ret != SQLITE_OK){

  fprintf(stderr,”insert fled:%s\n”,errmsg);

  sqlite3_free(errmsg);

}

同樣地,可以通過(guò)執(zhí)行SQL語(yǔ)句來(lái)刪除和更新數(shù)據(jù),如:

char *sql = “delete from student where id=1”;

char *sql = “update student set age=21 where id=1”;

接下來(lái),我們可以查詢數(shù)據(jù)。例如,查詢學(xué)生表的所有數(shù)據(jù),可以使用以下語(yǔ)句:

char *sql = “select * from student;”;

ret = sqlite3_exec(db,sql,callback,0,&errmsg);

其中callback是一個(gè)回調(diào)函數(shù),它用于處理查詢結(jié)果。通過(guò)查詢結(jié)果,程序可以對(duì)數(shù)據(jù)進(jìn)行一系列的操作。

記得關(guān)閉數(shù)據(jù)庫(kù)連接,使用sqlite3_close函數(shù)。例如:

sqlite3_close(db);

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!

用Visual C++開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序(2)

3、 使用MFC訪問ODBC數(shù)據(jù)源

3.1 概述

VisualC++的MFC類庫(kù)定義了幾個(gè)數(shù)據(jù)庫(kù)類。在利用ODBC編程時(shí),經(jīng)常要使用到CDatabase(數(shù)據(jù)庫(kù)類),CRecordSet(記錄集類)和CRecordView(可視記錄集類)。 其中:

CDatabase類對(duì)象提供了對(duì)數(shù)據(jù)源的連接,通過(guò)它你可以對(duì)數(shù)據(jù)源進(jìn)行操作。

CRecordView類對(duì)象能以控制的形式 顯示數(shù)據(jù)庫(kù)記錄。這個(gè)視圖是直接連到一個(gè)CRecordSet對(duì)象的表視圖。

CRecordSet類對(duì)象提供了從數(shù)據(jù)源 中提取出的記錄集。CRecordSet對(duì)象通常用于兩種形式: 動(dòng)態(tài)行集(dynasets)和快照集(snapshots)。動(dòng)態(tài)行集能保 持與其他用戶所做的更改保持同步??煺占瘎t是數(shù)據(jù)的一個(gè)靜態(tài)視圖。每一種形式在記錄集被打開時(shí)都提供一組記錄,所不同的是,當(dāng)你在一個(gè)動(dòng)態(tài)行集里滾 動(dòng)到一條記錄時(shí),由其他用戶或是你應(yīng)用程序中的其他記錄集對(duì)該記錄所做的更改會(huì)相應(yīng)地顯示出來(lái)。腔吵

Visual C++提供了幾種記錄集,可以用來(lái)定制應(yīng)用程序的工作方式。查看這些不同選項(xiàng)的最快方式要兼顧速度和特征。你會(huì)發(fā)現(xiàn),在很多情況下,如果想添加特征,就必須付出程序執(zhí)行速度降低的代價(jià)。下面告訴你一些可以自由支配的記錄集選項(xiàng)。更重要的是,要告訴你從這個(gè)選項(xiàng)可以獲得更快的速度還是更多的特征。

1、Snapshot(快照) 這個(gè)選項(xiàng)要Visual C++在一次快照中下載整個(gè)查詢。換言之,及時(shí)快速地給數(shù)據(jù)庫(kù)內(nèi)容拍照,并把它作為未來(lái)工作的基礎(chǔ)。這種方法有三個(gè)缺點(diǎn)。之一,你看不到別人在網(wǎng)絡(luò)上做的更新,這可能意味著你的決定是建立在老信息的基礎(chǔ)上。第二,一次就下載所有這些記錄,這意味著在下載期間給網(wǎng)絡(luò)增加了沉重的負(fù)擔(dān)。第三,記錄下載時(shí)用戶會(huì)結(jié)束等待,這意味著網(wǎng)絡(luò)的呼叫性能變得更低。然而這種方法也有兩個(gè)優(yōu)點(diǎn)。之一,記錄一旦被下載,該工作站所需的網(wǎng)絡(luò)活動(dòng)幾乎就沒有了棗這為其它請(qǐng)求釋放了帶寬??傊?,你會(huì)看到網(wǎng)絡(luò)的吞吐量增大了。第二,因?yàn)樗斜簧暾?qǐng)的記錄都在用戶的機(jī)器上,所以用戶實(shí)際上會(huì)得到應(yīng)用程序更佳的總體性能。你可能想把快照的方法限制在較小的數(shù)據(jù)庫(kù)上使用,原因在于快照適用于用戶請(qǐng)求信息而不適用于數(shù)據(jù)編輯會(huì)話。

2、Dynaset(動(dòng)態(tài)集) 使用這個(gè)選項(xiàng)時(shí),Visual C++創(chuàng)建指向所請(qǐng)求的每個(gè)記錄的實(shí)際指針。另外,只有填充屏幕時(shí)實(shí)際需要的記錄是從服務(wù)器上下載來(lái)的。這種方法的好處很明顯。幾乎馬上就能在屏幕上看到記錄。而且還會(huì)看到其它用戶對(duì)數(shù)據(jù)庫(kù)所做的更改。最后,其它用戶也會(huì)看到你做的更改,因?yàn)閯?dòng)態(tài)集在你更改記錄時(shí)被上載到服務(wù)器上。很明顯,這種方法要求對(duì)服務(wù)器的實(shí)時(shí)訪問,它槐脊減小了網(wǎng)絡(luò)總吞吐量并降低了應(yīng)用程序的性能。這個(gè)選項(xiàng)適合于創(chuàng)建用戶要花費(fèi)很多時(shí)間來(lái)編輯數(shù)據(jù)的應(yīng)用程序。同時(shí),它也是大型數(shù)據(jù)庫(kù)的更佳選擇,原因在于只需下載用戶實(shí)際需要的信息。

3.2 應(yīng)用ODBC編程

可以應(yīng)用AppWizard來(lái)建立一個(gè)ODBC的應(yīng)用程序框架,也可以直接使用ODBC來(lái)進(jìn)行數(shù)據(jù)庫(kù)編程,這時(shí),應(yīng)包括頭文鉛圓滲件afxdb.h。

應(yīng)用ODBC編程兩個(gè)最重要的類是CDatabase和CRecordSet,但在應(yīng)用程序中,不應(yīng)直接使用CRecordSet類,而必須從CRecordSet類產(chǎn)生一個(gè)導(dǎo)出類,并添加相應(yīng)于數(shù)據(jù)庫(kù)表中字段的成員變量。隨后,重載CRecordset類的成員函數(shù)DoFieldExchange,該函數(shù)通過(guò)使用RFX函數(shù)完成數(shù)據(jù)庫(kù)字段與記錄集域數(shù)據(jù)成員變量的數(shù)據(jù)交換,RFX函數(shù)同對(duì)話框數(shù)據(jù)交換(DDX)機(jī)制相類似,負(fù)責(zé)完成數(shù)據(jù)庫(kù)與成員變量間的數(shù)據(jù)交換。

下面舉例說(shuō)明在VisualC++環(huán)境中ODBC 的編程技巧:

3.21 數(shù)據(jù)庫(kù)連接

在CRecordSet類中定義了一個(gè)成員變 量m_pDatabase:

CDatabase *m_pDatabase;

它是指向?qū)ο髷?shù)據(jù)庫(kù)類的指針。如果在CRecordSet類對(duì)象調(diào)用Open()函數(shù)之前,將一個(gè)已經(jīng)打開的CDatabase類對(duì)象指針傳給m_pDatabase,就能共享相同 的CDatabase類對(duì)象。如:

CDatabase m_db;

CRecordSet m_set1,m_set2;

m_db.Open(_T(“Super_ES”)); // 建 立ODBC 連 接

m_set1.m_pDatabase=m_db; //m_set1 復(fù) 用m_db 對(duì) 象

m_set2.m_pDatabse=m_db; // m_set2 復(fù) 用m_db 對(duì) 象

或如下:

Cdatabase db;

db.Open(“Database”); //建立ODBC連接

CrecordSet m_set(db); //構(gòu)造記錄集對(duì)象,使數(shù)據(jù)庫(kù)指向db

3.22 查詢記錄

查詢記錄使用CRecordSet::Open()和 CRecordSet::Requery()成員函數(shù)。在使用CRecordSet類對(duì)象之前,必須使用 CRecordSet::Open()函數(shù)來(lái)獲得有效的記錄集。一旦已經(jīng)使用過(guò)CRecordSet::Open() 函數(shù),再次查詢時(shí)就可以應(yīng)用CRecordSet::Requery()函數(shù)。在調(diào) 用CRecordSet::Open()函數(shù)時(shí),如果已經(jīng)將一個(gè)已經(jīng)打開的CDatabase 對(duì)象指針傳給CRecordSet類對(duì)象的m_pDatabase成員變量,則使 用該數(shù)據(jù)庫(kù)對(duì)象建立ODBC連接;否則如果m_pDatabase為空指 針,就新建一個(gè)CDatabase類對(duì)象并使其與缺省的數(shù)據(jù)源 相連,然后進(jìn)行CRecordSet類對(duì)象的初始化。缺省數(shù)據(jù)源 由GetDefaultConnect()函數(shù)獲得。你也可以提供你所需要的SQL 語(yǔ)句,并以它來(lái)調(diào)用CRecordSet::Open()函數(shù),例如:

m_Set.Open(AFX_DATABASE_USE_DEFAULT,strSQL);

如果沒有指定參數(shù),程序則使 用缺省的SQL語(yǔ)句,即對(duì)在GetDefaultSQL()函數(shù)中指定的SQL語(yǔ) 句進(jìn)行操作:

CString CTestRecordSet::GetDefaultSQL()

{return _T(“,”);}

對(duì)于GetDefaultSQL()函數(shù)返回的表名, 對(duì)應(yīng)的缺省操作是SELECT語(yǔ)句,即:

SELECT * FROM BasicData,MainSize

查詢過(guò)程中也可以利用CRecordSet的 成員變量m_strFilter和m_strSort來(lái)執(zhí)行條件查詢和結(jié)果排序。m_strFilter 為過(guò)濾字符串,存放著SQL語(yǔ)句中WHERE后的條件串;m_strSort 為排序字符串,存放著SQL語(yǔ)句中ORDERBY后的字符串。 如:

m_Set.m_strFilter=”TYPE=’電動(dòng)機(jī)'”;

m_Set.m_strSort=”VOLTAGE”;

m_Set.Requery();

對(duì)應(yīng)的SQL語(yǔ)句為:

SELECT * FROM BasicData,MainSize

WHERE TYPE=’電動(dòng)機(jī)’

ORDER BY VOLTAGE

除了直接賦值給m_strFilter以外,還 可以使用參數(shù)化。利用參數(shù)化可以更直觀,更方便地 完成條件查詢?nèi)蝿?wù)。使用參數(shù)化的步驟如下:

(1).聲明參變量:

Cstring p1;

Float p2;

(2).在構(gòu)造函數(shù)中初始化參變量

p1=_T(“”);

p2=0.0f;

m_nParams=2;

(3).將參變量與對(duì)應(yīng)列綁定

pFX-SetFieldType(CFieldExchange::param)

RFX_Text(pFX,_T(“P1”),p1);

RFX_Single(pFX,_T(“P2”),p2);

完成以上步驟之后就可以利用參變量進(jìn)行條件查詢了:

m_pSet-m_strFilter=”TYPE=?ANDVOLTAGE=?”;

m_pSet-p1=”電動(dòng)機(jī)”;

m_pSet-p2=60.0;

m_pSet-Requery();

參變量的值按綁定的順序替換 查詢字串中的“?”適配符。

如果查詢的結(jié)果是多條記錄的 話,可以用CRecordSet類的函數(shù)Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()來(lái)移動(dòng)光標(biāo)。

3.23 增加記錄

增加記錄使用AddNew()函數(shù),要求數(shù)據(jù)庫(kù)必須是以允許增加的方式打開:

m_pSet-AddNew(); //在表的末尾增加新記錄

m_pSet-SetFieldNull((m_pSet-m_type),FALSE);

m_pSet-m_type=”電動(dòng)機(jī)”;

… //輸入新的字段值

m_pSet- Update(); //將新記錄存入數(shù)據(jù)庫(kù)

m_pSet-Requery(); //重建記錄集

3.24 刪除記錄

直接使用Delete()函數(shù),并且在調(diào)用Delete() 函數(shù)之后不需調(diào)用Update()函數(shù):

m_pSet-Delete();

if(!m_pSet-IsEOF())

m_pSet-MoveNext();

else

m_pSet-MoveLast();

3.25 修改記錄

修改記錄使用Edit()函數(shù):

m_pSet-Edit(); //修改當(dāng)前記錄

m_pSet-m_type=”發(fā)電機(jī)”; //修改當(dāng)前記錄字段值

m_pSet-Update(); //將修改結(jié)果存入數(shù)據(jù)庫(kù)

m_pSet-Requery();

3.26 統(tǒng)計(jì)記錄

統(tǒng)計(jì)記錄用來(lái)統(tǒng)計(jì)記錄集的總數(shù)??梢韵嚷暶饕粋€(gè)CRecordset對(duì)象m_pSet。再綁定一個(gè)變量m_lCount,用來(lái)統(tǒng)計(jì)記錄總數(shù)。執(zhí)行如下語(yǔ)句:

m_pSet-Open(“Select Count(*) from 表名 where 限定條件”);

RecordCount=m_pSet-m_lCount;

m_pSet-Close();

RecordCount即為要統(tǒng)計(jì)的記錄數(shù)。

或如下:

CRecordset m_Set(db); //db 為CDatabase對(duì)象

CString strValue;

m_Set.Open(Select count(*) from 表名 where 限定條件”);

m_pSet.GetFieldValue((int)0,strValue);

long count=atol(strValue);

m_set.Close();

count為記錄總數(shù)。

3.27 執(zhí)行SQL語(yǔ)句

雖然通過(guò)CRecordSet類,我們可以完成 大多數(shù)的查詢操作,而且在CRecordSet::Open()函數(shù)中也可以 提供SQL語(yǔ)句,但是有的時(shí)候我們還想進(jìn)行一些其他操 作,例如建立新表,刪除表,建立新的字段等等,這 時(shí)就需要使用到CDatabase類的直接執(zhí)行SQL語(yǔ)句的機(jī)制。通 過(guò)調(diào)用CDatabase::ExecuteSQL()函數(shù)來(lái)完成SQL語(yǔ)句的直接執(zhí)行:

如下代碼所示

BOOL CDB::ExecuteSQLAndReportFailure(const CString strSQL)

{

TRY

{

m_pdb-ExecuteSQL(strSQL); //直接執(zhí)行SQL語(yǔ)句

}

CATCH (CDBException,e)

{

CString strMsg;

strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);

strMsg+=strSQL;

return FALSE;

}

END_CATCH

return TRUE;

}

應(yīng)當(dāng)指出的是,由于不同DBMS提 供的數(shù)據(jù)操作語(yǔ)句不盡相同,直接執(zhí)行SQL語(yǔ)句可能會(huì)破壞軟件的DBMS無(wú)關(guān)性,因此在應(yīng)用中應(yīng)當(dāng)慎用此類操作。

3.28 注意

從CRecordSet導(dǎo)出的類中如果包含DataTime類型的數(shù)據(jù),在VC中是用CTime類型來(lái)替代的,這時(shí),構(gòu)造函數(shù)沒有賦于缺省值。這時(shí),我們應(yīng)當(dāng)手工賦值。如下所示:

CTime m_time;

m_time=NULL;#p#副標(biāo)題#e#

3.3 總結(jié)

VisualC++中的ODBC類庫(kù)可以幫助程序員完成絕大多數(shù)的數(shù)據(jù)庫(kù)操作。利用ODBC技術(shù)使得程序員從具體的DBMS中解脫出來(lái),從而極大的減少了軟件開發(fā)的工作量,縮短開發(fā)周期,提高了效率和軟件的可靠性。

4、使用DAO

4.1 概述

Visual C++提供了對(duì)DAO的封裝,MFC DAO類封裝了DAO(數(shù)據(jù)庫(kù)訪問對(duì)象)的大部分功能,從面Visual C++程序就可以使用Visual C++提供的MFC DAO類方便的訪問Microsoft Jet 數(shù)據(jù)庫(kù),編制簡(jiǎn)潔、有Visaul C++特色的數(shù)據(jù)庫(kù)應(yīng)用程序。

數(shù)據(jù)庫(kù)訪問對(duì)象(DAO)提供了一種通過(guò)程序代碼創(chuàng)建和操縱數(shù)據(jù)庫(kù)的機(jī)制。多個(gè)DAO對(duì)象構(gòu)成一個(gè)體系結(jié)構(gòu),在這個(gè)結(jié)構(gòu)里,各個(gè)DAO對(duì)象協(xié)同工作。DAO支持以下四個(gè)數(shù)據(jù)庫(kù)選項(xiàng):

打開訪問數(shù)據(jù)庫(kù)(MDB文件)——MDB文件是一個(gè)自包含的數(shù)據(jù)庫(kù),它包括查詢定義、安全信息、索引、關(guān)系,當(dāng)然還有實(shí)際的數(shù)據(jù)表。用戶只須指定MDB文件的路徑名。

直接打開ODBC數(shù)據(jù)源——這里有一個(gè)很重要的限制。不能找開以Jet引擎作為驅(qū)動(dòng)程序的ODBC數(shù)據(jù)源;只可以使用具有自己的ODBC驅(qū)動(dòng)程序DLL的數(shù)據(jù)源。

用Jet引擎找開ISAM型(索引順序訪問方法)數(shù)據(jù)源(包括dBase,FoxPro,Paradox,Btrieve,Excel或文本文件)——即使已經(jīng)設(shè)置了ODBC數(shù)據(jù)源,要用Jet引擎來(lái)訪問這些文件類型中的一種,也必須以ISAM型數(shù)據(jù)源的方式來(lái)找開文件,而不是以O(shè)DBC數(shù)據(jù)源的方式。

給ACCESS數(shù)據(jù)庫(kù)附加外部表——這實(shí)際上是用DAO訪問ODBC數(shù)據(jù)源的首選方法。首先使用ACCESS把ODBC表添加到一個(gè)MDB文件上,然后依照之一選項(xiàng)中介紹的方法用DAO找開這個(gè)MDB文件就可以了。用戶也可以用ACCESS把IA文件附加到一個(gè)MDB文件上。

4.2 應(yīng)用DAO編程

4.21 打開數(shù)據(jù)庫(kù)

CDaoWorkspace對(duì)象代表一個(gè)DAO Workspace對(duì)象,在MFC DAO體系結(jié)構(gòu)中處于更高處,定義了一個(gè)用戶的同數(shù)據(jù)庫(kù)的會(huì)話,并包含打開的數(shù)據(jù)庫(kù),負(fù)責(zé)完成數(shù)據(jù)庫(kù)的事務(wù)處理。我們可以使用隱含的workspace對(duì)象。

CDaoDatabase對(duì)象代表了一個(gè)到數(shù)據(jù)庫(kù)的連接,在MFC中,是通過(guò)CDaoDatabase封裝的。

在構(gòu)造CDaoDatabase對(duì)象時(shí),有如下兩種方法:

創(chuàng)建一個(gè)CDaoDatabase對(duì)象,并向其傳遞一個(gè)指向一個(gè)已經(jīng)找開的CdaoWorkspace對(duì)象的指針。

創(chuàng)建一個(gè)CDaoDatabase對(duì)象,而不明確地指定使用的workspace,此時(shí),MFC將創(chuàng)建一個(gè)新的臨時(shí)的CDaoWorkspace對(duì)象。

如下代碼所示:

CDaoDatabase db;

db.Open(“test.mdb”,FALSE,FALSE,_T(“”);

其中參數(shù)一包括要打開的文件的全路徑名。

4.22 查詢記錄

一個(gè)DAO recordset對(duì)象,代表一個(gè)數(shù)據(jù)記錄的,該是一個(gè)庫(kù)表或者是一個(gè)查詢的運(yùn)行結(jié)果中的全部記錄。CDaoRecorset對(duì)象有三種類型:表、動(dòng)態(tài)集、快照。

通常情況下,我們?cè)趹?yīng)用程序中可以使用CDaoRecordset的導(dǎo)出類,這一般是通過(guò)ClassWizard或AppWizard來(lái)生成的。但我們也可以直接使用CDaoRecordset類生成的對(duì)象。此時(shí),我們可以動(dòng)態(tài)地綁定recordset對(duì)象的數(shù)據(jù)成員。

如下代碼所示:

COleVariant var;

long id;

CString str;

CDaoRecordset m_Set(db);

m_Set.Open(“查詢的SQL語(yǔ)句”);

while(!m_Set.IsEOF())

{

/*

處理

m_Set.GetFieldValue(“ID”,var);

id=V_I4(var);

m_Set.GetFieldValue(“Name”,var);

str=var.pbVal;

*/

m_Set.MoveNext();

}

m_Set.Close();

4.23 添加記錄

添加記錄用AddNew函數(shù),此時(shí)用SetFieldValue來(lái)進(jìn)行賦值。

如下代碼所示:

m_pDaoRecordset-AddNew ();

sprintf(strValue,”%s”,m_UserName );

m_pDaoRecordset-SetFieldValue (“UserName”,strValue);

sprintf(strValue,”%d”,m_PointId );

m_pDaoRecordset-SetFieldValue (“PointId”,strValue);

dataSrc.SetDateTime (m_UpdateTime .GetYear ),m_UpdateTime .GetMonth ),m_UpdateTime .GetDay (),

m_UpdateTime .GetHour (),m_UpdateTime .GetMinute (),m_UpdateTime .GetSecond ());

valValue=dataSrc;

m_pDaoRecordset-SetFieldValue (“UpdateTime”,valValue);

sprintf(strValue,”%f”,m_pRecordset-m_OldValue );

m_pDaoRecordset-SetFieldValue (“OldValue”,strValue);

sprintf(strValue,”%f”,m_pRecordset-m_NewValue );

m_pDaoRecordset-SetFieldValue (“NewValue”,strValue);

m_pDaoRecordset-Update ();

此時(shí),要注意,日期時(shí)間型數(shù)據(jù)要用SetDataTime函數(shù)來(lái)賦值,這里面要用到COleVariant類型數(shù)據(jù),具體用法可以參考有關(guān)幫助。

4.24 修改記錄

修改記錄用Edit()函數(shù),把記錄定位到要修改的位置,調(diào)用Edit函數(shù),修改完成后,調(diào)用Update函數(shù)。

如下代碼所示:

m_Set.Edit();

m_Set.SetFieldValue(“列名”,”字符串”);

m_Set.Update();

4.25 刪除記錄

刪除記錄用Delete()函數(shù),使用后不需調(diào)用Update()函數(shù)。

4.26 統(tǒng)計(jì)記錄

可以使用如下代碼來(lái)統(tǒng)計(jì)記錄數(shù):

COleVariant varValue;

CDaoRecordset m_Set(db);

m_Set.Open(dbOpenDynaset,”SQL語(yǔ)句”);

varValue=m_Set.GetFieldValue(0);

m_lMaxCount=V_I4(varValue);

m_Set.Close();

如果是統(tǒng)計(jì)一張表中總記錄,可以使用CDaoTableDef對(duì)象,如下代碼所示:

CDaoTableDef m_Set(gUseDB);

Count=m_Set.GetRecordCount();

m_Set.Close();

不能用CDaoRecordset對(duì)象的GetRecordCount()來(lái)取得記錄數(shù)。

4.3 總結(jié)

使用DAO技術(shù)可以便我們方便的訪問Microsoft Jet引擎數(shù)據(jù)庫(kù),由于Microsoft Jet不支持多線程,因此,必須限制調(diào)用到應(yīng)用程序主線程的所有DAO。

5 使用OLE DB

5.1 概述

OLE DB的存在為用戶提供了一種統(tǒng)一的方法來(lái)訪問所有不同種類的數(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是一套通過(guò)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ù)移出來(lái)。

5.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é)合起來(lái),使數(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)用程序一般有以下幾步驟:

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

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

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

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

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

模板的使用

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

會(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來(lái)打開數(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()來(lái)打開。同時(shí),會(huì)話對(duì)象還可用于創(chuàng)建事務(wù)操作。

CEnumeratorAccessor類

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

訪問器類

CAcessor類

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

CDynamicAccessor類

c 內(nèi)置數(shù)據(jù)庫(kù)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于c 內(nèi)置數(shù)據(jù)庫(kù),C內(nèi)置數(shù)據(jù)庫(kù),讓數(shù)據(jù)處理更加高效,用Visual C++開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序(2)的信息別忘了在本站進(jìn)行查找喔。

四川成都云服務(wù)器租用托管【創(chuàng)新互聯(lián)】提供各地服務(wù)器租用,電信服務(wù)器托管、移動(dòng)服務(wù)器托管、聯(lián)通服務(wù)器托管,云服務(wù)器虛擬主機(jī)租用。成都機(jī)房托管咨詢:13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)、開啟建站+互聯(lián)網(wǎng)銷售服務(wù),與企業(yè)客戶共同成長(zhǎng),共創(chuàng)價(jià)值。


網(wǎng)站名稱:C內(nèi)置數(shù)據(jù)庫(kù),讓數(shù)據(jù)處理更加高效(c內(nèi)置數(shù)據(jù)庫(kù))
分享地址:http://uogjgqi.cn/article/dpipjio.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流