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

成都創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、吉安網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、HTML5、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、成都外貿網(wǎng)站建設公司、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為吉安等各大城市提供網(wǎng)站開發(fā)制作服務。
C內置數(shù)據(jù)庫是一種輕量級的數(shù)據(jù)庫,當程序需要處理一些數(shù)據(jù)時,可以直接在程序中使用這種數(shù)據(jù)庫進行數(shù)據(jù)管理,將數(shù)據(jù)寫入到C內置數(shù)據(jù)庫中,或是從數(shù)據(jù)庫中讀取數(shù)據(jù)并進行操作。與傳統(tǒng)的數(shù)據(jù)庫相比,C內置數(shù)據(jù)庫具有輕量、高效的特點,可以快速實現(xiàn)數(shù)據(jù)的讀寫和查詢。
在使用C內置數(shù)據(jù)庫之前,需要準備好數(shù)據(jù)庫和相關的軟件工具。目前,C語言內置數(shù)據(jù)庫的主要有兩種:SQLite和BerkeleyDB。下面,我們將以SQLite為例,介紹C內置數(shù)據(jù)庫的使用方法。
需要在程序中引入相關的庫文件,通過#include語句引入SQLite頭文件,例如:
#include
之后,需要打開一個數(shù)據(jù)庫,使用sqlite3_open函數(shù)可以實現(xiàn)數(shù)據(jù)庫連接,例如:
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ù)庫的名字,如果該數(shù)據(jù)庫不存在,則會自動創(chuàng)建一個新的數(shù)據(jù)庫文件。如果打開數(shù)據(jù)庫成功,函數(shù)返回值為SQLITE_OK,否則函數(shù)返回錯誤碼??梢酝ㄟ^sqlite3_errmsg()函數(shù)來獲取具體的錯誤信息。
接下來,我們可以使用SQL語句對數(shù)據(jù)庫進行操作,如增加、刪除和查詢數(shù)據(jù)等。例如,通過以下語句創(chuàng)建一張學生表:
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語句,如果操作成功則返回SQLITE_OK,否則返回錯誤碼。同時,為了防止SQL注入攻擊,建議使用預編譯SQL語句。
除了創(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);
}
同樣地,可以通過執(zhí)行SQL語句來刪除和更新數(shù)據(jù),如:
char *sql = “delete from student where id=1”;
char *sql = “update student set age=21 where id=1”;
接下來,我們可以查詢數(shù)據(jù)。例如,查詢學生表的所有數(shù)據(jù),可以使用以下語句:
char *sql = “select * from student;”;
ret = sqlite3_exec(db,sql,callback,0,&errmsg);
其中callback是一個回調函數(shù),它用于處理查詢結果。通過查詢結果,程序可以對數(shù)據(jù)進行一系列的操作。
記得關閉數(shù)據(jù)庫連接,使用sqlite3_close函數(shù)。例如:
sqlite3_close(db);
成都網(wǎng)站建設公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設、網(wǎng)站制作、網(wǎng)頁設計及定制高端網(wǎng)站建設服務!
用Visual C++開發(fā)數(shù)據(jù)庫應用程序(2)
3、 使用MFC訪問ODBC數(shù)據(jù)源
3.1 概述
VisualC++的MFC類庫定義了幾個數(shù)據(jù)庫類。在利用ODBC編程時,經常要使用到CDatabase(數(shù)據(jù)庫類),CRecordSet(記錄集類)和CRecordView(可視記錄集類)。 其中:
CDatabase類對象提供了對數(shù)據(jù)源的連接,通過它你可以對數(shù)據(jù)源進行操作。
CRecordView類對象能以控制的形式 顯示數(shù)據(jù)庫記錄。這個視圖是直接連到一個CRecordSet對象的表視圖。
CRecordSet類對象提供了從數(shù)據(jù)源 中提取出的記錄集。CRecordSet對象通常用于兩種形式: 動態(tài)行集(dynasets)和快照集(snapshots)。動態(tài)行集能保 持與其他用戶所做的更改保持同步??煺占瘎t是數(shù)據(jù)的一個靜態(tài)視圖。每一種形式在記錄集被打開時都提供一組記錄,所不同的是,當你在一個動態(tài)行集里滾 動到一條記錄時,由其他用戶或是你應用程序中的其他記錄集對該記錄所做的更改會相應地顯示出來。腔吵
Visual C++提供了幾種記錄集,可以用來定制應用程序的工作方式。查看這些不同選項的最快方式要兼顧速度和特征。你會發(fā)現(xiàn),在很多情況下,如果想添加特征,就必須付出程序執(zhí)行速度降低的代價。下面告訴你一些可以自由支配的記錄集選項。更重要的是,要告訴你從這個選項可以獲得更快的速度還是更多的特征。
1、Snapshot(快照) 這個選項要Visual C++在一次快照中下載整個查詢。換言之,及時快速地給數(shù)據(jù)庫內容拍照,并把它作為未來工作的基礎。這種方法有三個缺點。之一,你看不到別人在網(wǎng)絡上做的更新,這可能意味著你的決定是建立在老信息的基礎上。第二,一次就下載所有這些記錄,這意味著在下載期間給網(wǎng)絡增加了沉重的負擔。第三,記錄下載時用戶會結束等待,這意味著網(wǎng)絡的呼叫性能變得更低。然而這種方法也有兩個優(yōu)點。之一,記錄一旦被下載,該工作站所需的網(wǎng)絡活動幾乎就沒有了棗這為其它請求釋放了帶寬??傊?,你會看到網(wǎng)絡的吞吐量增大了。第二,因為所有被申請的記錄都在用戶的機器上,所以用戶實際上會得到應用程序更佳的總體性能。你可能想把快照的方法限制在較小的數(shù)據(jù)庫上使用,原因在于快照適用于用戶請求信息而不適用于數(shù)據(jù)編輯會話。
2、Dynaset(動態(tài)集) 使用這個選項時,Visual C++創(chuàng)建指向所請求的每個記錄的實際指針。另外,只有填充屏幕時實際需要的記錄是從服務器上下載來的。這種方法的好處很明顯。幾乎馬上就能在屏幕上看到記錄。而且還會看到其它用戶對數(shù)據(jù)庫所做的更改。最后,其它用戶也會看到你做的更改,因為動態(tài)集在你更改記錄時被上載到服務器上。很明顯,這種方法要求對服務器的實時訪問,它槐脊減小了網(wǎng)絡總吞吐量并降低了應用程序的性能。這個選項適合于創(chuàng)建用戶要花費很多時間來編輯數(shù)據(jù)的應用程序。同時,它也是大型數(shù)據(jù)庫的更佳選擇,原因在于只需下載用戶實際需要的信息。
3.2 應用ODBC編程
可以應用AppWizard來建立一個ODBC的應用程序框架,也可以直接使用ODBC來進行數(shù)據(jù)庫編程,這時,應包括頭文鉛圓滲件afxdb.h。
應用ODBC編程兩個最重要的類是CDatabase和CRecordSet,但在應用程序中,不應直接使用CRecordSet類,而必須從CRecordSet類產生一個導出類,并添加相應于數(shù)據(jù)庫表中字段的成員變量。隨后,重載CRecordset類的成員函數(shù)DoFieldExchange,該函數(shù)通過使用RFX函數(shù)完成數(shù)據(jù)庫字段與記錄集域數(shù)據(jù)成員變量的數(shù)據(jù)交換,RFX函數(shù)同對話框數(shù)據(jù)交換(DDX)機制相類似,負責完成數(shù)據(jù)庫與成員變量間的數(shù)據(jù)交換。
下面舉例說明在VisualC++環(huán)境中ODBC 的編程技巧:
3.21 數(shù)據(jù)庫連接
在CRecordSet類中定義了一個成員變 量m_pDatabase:
CDatabase *m_pDatabase;
它是指向對象數(shù)據(jù)庫類的指針。如果在CRecordSet類對象調用Open()函數(shù)之前,將一個已經打開的CDatabase類對象指針傳給m_pDatabase,就能共享相同 的CDatabase類對象。如:
CDatabase m_db;
CRecordSet m_set1,m_set2;
m_db.Open(_T(“Super_ES”)); // 建 立ODBC 連 接
m_set1.m_pDatabase=m_db; //m_set1 復 用m_db 對 象
m_set2.m_pDatabse=m_db; // m_set2 復 用m_db 對 象
或如下:
Cdatabase db;
db.Open(“Database”); //建立ODBC連接
CrecordSet m_set(db); //構造記錄集對象,使數(shù)據(jù)庫指向db
3.22 查詢記錄
查詢記錄使用CRecordSet::Open()和 CRecordSet::Requery()成員函數(shù)。在使用CRecordSet類對象之前,必須使用 CRecordSet::Open()函數(shù)來獲得有效的記錄集。一旦已經使用過CRecordSet::Open() 函數(shù),再次查詢時就可以應用CRecordSet::Requery()函數(shù)。在調 用CRecordSet::Open()函數(shù)時,如果已經將一個已經打開的CDatabase 對象指針傳給CRecordSet類對象的m_pDatabase成員變量,則使 用該數(shù)據(jù)庫對象建立ODBC連接;否則如果m_pDatabase為空指 針,就新建一個CDatabase類對象并使其與缺省的數(shù)據(jù)源 相連,然后進行CRecordSet類對象的初始化。缺省數(shù)據(jù)源 由GetDefaultConnect()函數(shù)獲得。你也可以提供你所需要的SQL 語句,并以它來調用CRecordSet::Open()函數(shù),例如:
m_Set.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
如果沒有指定參數(shù),程序則使 用缺省的SQL語句,即對在GetDefaultSQL()函數(shù)中指定的SQL語 句進行操作:
CString CTestRecordSet::GetDefaultSQL()
{return _T(“,”);}
對于GetDefaultSQL()函數(shù)返回的表名, 對應的缺省操作是SELECT語句,即:
SELECT * FROM BasicData,MainSize
查詢過程中也可以利用CRecordSet的 成員變量m_strFilter和m_strSort來執(zhí)行條件查詢和結果排序。m_strFilter 為過濾字符串,存放著SQL語句中WHERE后的條件串;m_strSort 為排序字符串,存放著SQL語句中ORDERBY后的字符串。 如:
m_Set.m_strFilter=”TYPE=’電動機'”;
m_Set.m_strSort=”VOLTAGE”;
m_Set.Requery();
對應的SQL語句為:
SELECT * FROM BasicData,MainSize
WHERE TYPE=’電動機’
ORDER BY VOLTAGE
除了直接賦值給m_strFilter以外,還 可以使用參數(shù)化。利用參數(shù)化可以更直觀,更方便地 完成條件查詢任務。使用參數(shù)化的步驟如下:
(1).聲明參變量:
Cstring p1;
Float p2;
(2).在構造函數(shù)中初始化參變量
p1=_T(“”);
p2=0.0f;
m_nParams=2;
(3).將參變量與對應列綁定
pFX-SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T(“P1”),p1);
RFX_Single(pFX,_T(“P2”),p2);
完成以上步驟之后就可以利用參變量進行條件查詢了:
m_pSet-m_strFilter=”TYPE=?ANDVOLTAGE=?”;
m_pSet-p1=”電動機”;
m_pSet-p2=60.0;
m_pSet-Requery();
參變量的值按綁定的順序替換 查詢字串中的“?”適配符。
如果查詢的結果是多條記錄的 話,可以用CRecordSet類的函數(shù)Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()來移動光標。
3.23 增加記錄
增加記錄使用AddNew()函數(shù),要求數(shù)據(jù)庫必須是以允許增加的方式打開:
m_pSet-AddNew(); //在表的末尾增加新記錄
m_pSet-SetFieldNull((m_pSet-m_type),FALSE);
m_pSet-m_type=”電動機”;
… //輸入新的字段值
m_pSet- Update(); //將新記錄存入數(shù)據(jù)庫
m_pSet-Requery(); //重建記錄集
3.24 刪除記錄
直接使用Delete()函數(shù),并且在調用Delete() 函數(shù)之后不需調用Update()函數(shù):
m_pSet-Delete();
if(!m_pSet-IsEOF())
m_pSet-MoveNext();
else
m_pSet-MoveLast();
3.25 修改記錄
修改記錄使用Edit()函數(shù):
m_pSet-Edit(); //修改當前記錄
m_pSet-m_type=”發(fā)電機”; //修改當前記錄字段值
…
m_pSet-Update(); //將修改結果存入數(shù)據(jù)庫
m_pSet-Requery();
3.26 統(tǒng)計記錄
統(tǒng)計記錄用來統(tǒng)計記錄集的總數(shù)??梢韵嚷暶饕粋€CRecordset對象m_pSet。再綁定一個變量m_lCount,用來統(tǒng)計記錄總數(shù)。執(zhí)行如下語句:
m_pSet-Open(“Select Count(*) from 表名 where 限定條件”);
RecordCount=m_pSet-m_lCount;
m_pSet-Close();
RecordCount即為要統(tǒng)計的記錄數(shù)。
或如下:
CRecordset m_Set(db); //db 為CDatabase對象
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語句
雖然通過CRecordSet類,我們可以完成 大多數(shù)的查詢操作,而且在CRecordSet::Open()函數(shù)中也可以 提供SQL語句,但是有的時候我們還想進行一些其他操 作,例如建立新表,刪除表,建立新的字段等等,這 時就需要使用到CDatabase類的直接執(zhí)行SQL語句的機制。通 過調用CDatabase::ExecuteSQL()函數(shù)來完成SQL語句的直接執(zhí)行:
如下代碼所示
BOOL CDB::ExecuteSQLAndReportFailure(const CString strSQL)
{
TRY
{
m_pdb-ExecuteSQL(strSQL); //直接執(zhí)行SQL語句
}
CATCH (CDBException,e)
{
CString strMsg;
strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
strMsg+=strSQL;
return FALSE;
}
END_CATCH
return TRUE;
}
應當指出的是,由于不同DBMS提 供的數(shù)據(jù)操作語句不盡相同,直接執(zhí)行SQL語句可能會破壞軟件的DBMS無關性,因此在應用中應當慎用此類操作。
3.28 注意
從CRecordSet導出的類中如果包含DataTime類型的數(shù)據(jù),在VC中是用CTime類型來替代的,這時,構造函數(shù)沒有賦于缺省值。這時,我們應當手工賦值。如下所示:
CTime m_time;
m_time=NULL;#p#副標題#e#
3.3 總結
VisualC++中的ODBC類庫可以幫助程序員完成絕大多數(shù)的數(shù)據(jù)庫操作。利用ODBC技術使得程序員從具體的DBMS中解脫出來,從而極大的減少了軟件開發(fā)的工作量,縮短開發(fā)周期,提高了效率和軟件的可靠性。
4、使用DAO
4.1 概述
Visual C++提供了對DAO的封裝,MFC DAO類封裝了DAO(數(shù)據(jù)庫訪問對象)的大部分功能,從面Visual C++程序就可以使用Visual C++提供的MFC DAO類方便的訪問Microsoft Jet 數(shù)據(jù)庫,編制簡潔、有Visaul C++特色的數(shù)據(jù)庫應用程序。
數(shù)據(jù)庫訪問對象(DAO)提供了一種通過程序代碼創(chuàng)建和操縱數(shù)據(jù)庫的機制。多個DAO對象構成一個體系結構,在這個結構里,各個DAO對象協(xié)同工作。DAO支持以下四個數(shù)據(jù)庫選項:
打開訪問數(shù)據(jù)庫(MDB文件)——MDB文件是一個自包含的數(shù)據(jù)庫,它包括查詢定義、安全信息、索引、關系,當然還有實際的數(shù)據(jù)表。用戶只須指定MDB文件的路徑名。
直接打開ODBC數(shù)據(jù)源——這里有一個很重要的限制。不能找開以Jet引擎作為驅動程序的ODBC數(shù)據(jù)源;只可以使用具有自己的ODBC驅動程序DLL的數(shù)據(jù)源。
用Jet引擎找開ISAM型(索引順序訪問方法)數(shù)據(jù)源(包括dBase,FoxPro,Paradox,Btrieve,Excel或文本文件)——即使已經設置了ODBC數(shù)據(jù)源,要用Jet引擎來訪問這些文件類型中的一種,也必須以ISAM型數(shù)據(jù)源的方式來找開文件,而不是以ODBC數(shù)據(jù)源的方式。
給ACCESS數(shù)據(jù)庫附加外部表——這實際上是用DAO訪問ODBC數(shù)據(jù)源的首選方法。首先使用ACCESS把ODBC表添加到一個MDB文件上,然后依照之一選項中介紹的方法用DAO找開這個MDB文件就可以了。用戶也可以用ACCESS把IA文件附加到一個MDB文件上。
4.2 應用DAO編程
4.21 打開數(shù)據(jù)庫
CDaoWorkspace對象代表一個DAO Workspace對象,在MFC DAO體系結構中處于更高處,定義了一個用戶的同數(shù)據(jù)庫的會話,并包含打開的數(shù)據(jù)庫,負責完成數(shù)據(jù)庫的事務處理。我們可以使用隱含的workspace對象。
CDaoDatabase對象代表了一個到數(shù)據(jù)庫的連接,在MFC中,是通過CDaoDatabase封裝的。
在構造CDaoDatabase對象時,有如下兩種方法:
創(chuàng)建一個CDaoDatabase對象,并向其傳遞一個指向一個已經找開的CdaoWorkspace對象的指針。
創(chuàng)建一個CDaoDatabase對象,而不明確地指定使用的workspace,此時,MFC將創(chuàng)建一個新的臨時的CDaoWorkspace對象。
如下代碼所示:
CDaoDatabase db;
db.Open(“test.mdb”,FALSE,FALSE,_T(“”);
其中參數(shù)一包括要打開的文件的全路徑名。
4.22 查詢記錄
一個DAO recordset對象,代表一個數(shù)據(jù)記錄的,該是一個庫表或者是一個查詢的運行結果中的全部記錄。CDaoRecorset對象有三種類型:表、動態(tài)集、快照。
通常情況下,我們在應用程序中可以使用CDaoRecordset的導出類,這一般是通過ClassWizard或AppWizard來生成的。但我們也可以直接使用CDaoRecordset類生成的對象。此時,我們可以動態(tài)地綁定recordset對象的數(shù)據(jù)成員。
如下代碼所示:
COleVariant var;
long id;
CString str;
CDaoRecordset m_Set(db);
m_Set.Open(“查詢的SQL語句”);
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ù),此時用SetFieldValue來進行賦值。
如下代碼所示:
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ù)據(jù)要用SetDataTime函數(shù)來賦值,這里面要用到COleVariant類型數(shù)據(jù),具體用法可以參考有關幫助。
4.24 修改記錄
修改記錄用Edit()函數(shù),把記錄定位到要修改的位置,調用Edit函數(shù),修改完成后,調用Update函數(shù)。
如下代碼所示:
m_Set.Edit();
m_Set.SetFieldValue(“列名”,”字符串”);
m_Set.Update();
4.25 刪除記錄
刪除記錄用Delete()函數(shù),使用后不需調用Update()函數(shù)。
4.26 統(tǒng)計記錄
可以使用如下代碼來統(tǒng)計記錄數(shù):
COleVariant varValue;
CDaoRecordset m_Set(db);
m_Set.Open(dbOpenDynaset,”SQL語句”);
varValue=m_Set.GetFieldValue(0);
m_lMaxCount=V_I4(varValue);
m_Set.Close();
如果是統(tǒng)計一張表中總記錄,可以使用CDaoTableDef對象,如下代碼所示:
CDaoTableDef m_Set(gUseDB);
Count=m_Set.GetRecordCount();
m_Set.Close();
不能用CDaoRecordset對象的GetRecordCount()來取得記錄數(shù)。
4.3 總結
使用DAO技術可以便我們方便的訪問Microsoft Jet引擎數(shù)據(jù)庫,由于Microsoft Jet不支持多線程,因此,必須限制調用到應用程序主線程的所有DAO。
5 使用OLE DB
5.1 概述
OLE DB的存在為用戶提供了一種統(tǒng)一的方法來訪問所有不同種類的數(shù)據(jù)源。OLE DB可以在不同的數(shù)據(jù)源中進行轉換。利用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ù)庫技術的優(yōu)點,而不必為了利用這些優(yōu)點而把數(shù)據(jù)移出來。
5.2 使用ATL使用OLE DB數(shù)據(jù)使用程序
由于直接使用OLE DB的對象和接口設計數(shù)據(jù)庫應用程序需要書寫大量的代碼。為了簡化程序設計,Visual C++提供了ATL模板用于設計OLE DB數(shù)據(jù)應用程序和數(shù)據(jù)提供程序。
利用ATL模板可以很容易地將OLE DB與MFC結合起來,使數(shù)據(jù)庫的參數(shù)查詢等復雜的編程得到簡化。MFC提供的數(shù)據(jù)庫類使OLE DB的編程更具有面向對象的特性。Viual C++所提供用于OLE DB的ATL模板可分為數(shù)據(jù)提供程序的模板和數(shù)據(jù)使用程序的模板。
使用ATL模板創(chuàng)建數(shù)據(jù)應用程序一般有以下幾步驟:
創(chuàng)建應用框架
加入ATL產生的模板類
在應用中使用產生的數(shù)據(jù)訪問對象
不用ATL使用OLE DB數(shù)據(jù)使用程序
利用ATL模板產生數(shù)據(jù)使用程序較為簡單,但適用性不廣,不能動態(tài)適應數(shù)據(jù)庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數(shù)據(jù)使用程序。
模板的使用
OLE DB數(shù)據(jù)使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。
會話類
CDataSource類
CDataSource類與OLE DB的數(shù)據(jù)源對象相對應。這個類代表了OLE DB數(shù)據(jù)提供程序和數(shù)據(jù)源之間的連接。只有當數(shù)據(jù)源的連接被建立之后,才能產生會話對象,可以調用Open來打開數(shù)據(jù)源的連接。
CSession類
CSession所創(chuàng)建的對象代表了一個單獨的數(shù)據(jù)庫訪問的會話。一個用CDataSource類產生的數(shù)據(jù)源對象可以創(chuàng)建一個或者多個會話,要在數(shù)據(jù)源對象上產生一個會話對象,需要調用函數(shù)Open()來打開。同時,會話對象還可用于創(chuàng)建事務操作。
CEnumeratorAccessor類
CEnumeratorAccessor類是用來訪問枚舉器查詢后所產生的行集中可用數(shù)據(jù)提供程序的信息的訪問器,可提供當前可用的數(shù)據(jù)提供程序和可見的訪問器。
訪問器類
CAcessor類
CAccessor類代表與訪問器的類型。當用戶知道數(shù)據(jù)庫的類型和結構時,可以使用此類。它支持對一個行集采用多個訪問器,并且,存放數(shù)據(jù)的緩沖區(qū)是由用戶分配的。
CDynamicAccessor類
c 內置數(shù)據(jù)庫的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于c 內置數(shù)據(jù)庫,C內置數(shù)據(jù)庫,讓數(shù)據(jù)處理更加高效,用Visual C++開發(fā)數(shù)據(jù)庫應用程序(2)的信息別忘了在本站進行查找喔。
四川成都云服務器租用托管【創(chuàng)新互聯(lián)】提供各地服務器租用,電信服務器托管、移動服務器托管、聯(lián)通服務器托管,云服務器虛擬主機租用。成都機房托管咨詢:13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務器租用、服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經驗、開啟建站+互聯(lián)網(wǎng)銷售服務,與企業(yè)客戶共同成長,共創(chuàng)價值。
本文標題:C內置數(shù)據(jù)庫,讓數(shù)據(jù)處理更加高效(c內置數(shù)據(jù)庫)
本文路徑:http://www.5511xx.com/article/dpipjio.html


咨詢
建站咨詢
