在Visual
C++中,要使用ADO對(duì)象,必須先在類的頭文件中導(dǎo)入ADO的庫(kù)文件,并包含頭文件icrsint.h。
ADO數(shù)據(jù)綁定對(duì)話框向?qū)Э勺詣?dòng)導(dǎo)入ADO對(duì)象庫(kù),并包含icrsint.h。在對(duì)象Visual
C++中,CADORecordBinding類實(shí)現(xiàn)了如何在Visual
C++中使用ADO對(duì)象。ADO數(shù)據(jù)綁定對(duì)話框向?qū)Ы⒘艘粋€(gè)CADORecordBinding類的派生類CCustomRs。CCustomRs類定
義了與制定數(shù)據(jù)庫(kù)表字段對(duì)應(yīng)的數(shù)據(jù)成員,并將數(shù)據(jù)成員綁定到字段。
在CCustomRs類頭文件RsCgDlg.h的頭部,導(dǎo)入了ADO庫(kù):
#import "C:/Program Files/Common
Files/system/ado/msado15.dll" rename_namespace("ADOCG")
rename("EOF", "EndOfFile")
using namespace ADOCG;
#include "icrsint.h"
然后,向?qū)Фx了一個(gè)CRsCgDlg類,該類繼承了CDialog(對(duì)話框類)和CCustomRs。CRsCgDlg類定義了一個(gè)記錄集對(duì)象指針m_pRs,如下:
_RecordsetPtr m_pRs;
_RecordsetPtr在CADORecordBinding類中被定義為ADO的Recordset對(duì)象指針。通過m_pRs即可在對(duì)話框中使用ADO的Recordset對(duì)象訪問數(shù)據(jù)庫(kù)。
1.打開記錄集
首先要?jiǎng)?chuàng)建一個(gè)Connection對(duì)象實(shí)例,然后執(zhí)行Open方法打開記錄集。例如:
m_strConnection =
_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C://Documents and
Settings//Administrator//桌面 //File.mdb;Persist
Security
Info=False");
//定義連接字符串
m_strCmdText = _T("F1");//定義命令文本內(nèi)容
m_pRs.CreateInstance(__uuidof(Recordset)); //創(chuàng)建Connection對(duì)象實(shí)例
m_pRs->CursorLocation =
adUseClient;
//設(shè)置游標(biāo)位置
m_pRs->Open((LPCTSTR)m_strCmdText,
//命令文本內(nèi)容
(LPCTSTR)m_strConnection,
//連接字符串
adOpenKeyset,
//設(shè)置游標(biāo)類型
adLockReadOnly, //設(shè)置鎖定類型
adCmdTableDirect);
//設(shè)置命令類型
2.游標(biāo)位置
Connection對(duì)象的CursorLocation屬性用于設(shè)置或返回游標(biāo)位置,常數(shù)adUseClient表示使用本地游標(biāo)庫(kù)提供的客戶端游標(biāo)。adUseServer表示使用數(shù)據(jù)提供者或驅(qū)動(dòng)程序提供的游標(biāo),為默認(rèn)值。
3.游標(biāo)類型
游標(biāo)類型決定了記錄集是否可讀寫以及記錄滾動(dòng)方式。游標(biāo)類型常量有:
adOpenForwardOnly 僅向前游標(biāo),默認(rèn)值。只能在記錄中向前滾動(dòng)
adOpenKeyset
鍵集游標(biāo)。記錄集不能訪問其他用戶刪除的記錄,無法查看其他用戶添加
的記錄,可看見其他用戶更改的數(shù)據(jù)
adOpenDynamic 動(dòng)態(tài)游標(biāo)??煽匆娖渌脩羲鞯奶砑印⒏暮蛣h除。允許在記錄集中進(jìn)
行所有類型的移動(dòng)。
adOpenStatic
靜態(tài)游標(biāo)。記錄集用于查找數(shù)據(jù)或生成報(bào)告。對(duì)其他用戶所作的添加、更改
或刪除不可見。
4.鎖定類型
鎖定類型決定記錄集如何對(duì)記錄加鎖。鎖定類型常量有:
adLockReadOnly
默認(rèn)值,只讀。無法更改數(shù)據(jù)。
adLockPessimistic
保守式逐條記錄鎖定。為確保成功編輯記錄,采用編輯時(shí)立即鎖定數(shù)據(jù)源
的記錄。
adLockOptimistic 開放式逐條記錄鎖定。只有在調(diào)用Update方法時(shí)鎖定記錄。
adLockBatchOptimistic
開放式批更新,只在調(diào)用UpdateBatch方法時(shí)鎖定記錄。
5.命令類型
命令類型用于決定提供者如何解釋CommandText屬性設(shè)置的命令文本,命令類型常量有:
AdCmdText
將CommandText解釋為命令或存儲(chǔ)過程調(diào)用
AdCmdTable
將CommandText解釋為數(shù)據(jù)庫(kù)查詢的名稱
AdCmdTableDirect
將CommandText解釋為數(shù)據(jù)庫(kù)表的名稱
AdCmdStoredProc
將CommandText解釋為存儲(chǔ)過程名稱
AdCmdUnknown
默認(rèn)值。將CommandText解釋為未知的命令類型
AdCommandFile
將CommandText解釋為持久Recordset文件名
AdExecuteNoRecords 將CommandText解釋為不返回行的命令或存儲(chǔ)過程
6.連接字符串
連接字符串用于指定數(shù)據(jù)提供者、數(shù)據(jù)庫(kù)服務(wù)器、數(shù)據(jù)庫(kù)、用戶名好口令等連接信息。常用的數(shù)據(jù)提供者有:
MSDASQL
訪問ODBC數(shù)據(jù)源的OLE DB提供者
MSIDXS
訪問Microsoft Index Server的OLE DB提供者
ADSDSOObject 訪問Microsoft Active
Directory Service的OLE DB提供者
Microsoft.Jet.OLEDB.3.51或4.0
訪問Microsoft Jet(Access數(shù)據(jù)庫(kù))的OLE DB提供者
SQLOLEDB
訪問Microsoft SQL Server數(shù)據(jù)庫(kù)的OLE DB提供者
MSDAORA
訪問Oracle的OLE DB提供者
使用Recordset對(duì)象
Recordset對(duì)象用于保存執(zhí)行查詢獲得的記錄,并可將修改后的記錄返回服務(wù)器。
1.Recordset對(duì)象常用屬性
*AbsolutePosition:返回當(dāng)前記錄在記錄集中的序號(hào)
*ActiveConnection:設(shè)置或返回對(duì)象使用的活動(dòng)連接
*Bof:記錄指針指向第一條記錄之前時(shí)返回值為True,否則為False
*CursorLocation:設(shè)置或返回指針(也稱光標(biāo)或游標(biāo))的位置,默認(rèn)為adUseServer
*CursorType:設(shè)置或返回指針類型,默認(rèn)為adOpenForward
*Eof(EndOfFile):記錄指針指向最后一條記錄之后時(shí)返回值為True,否則為False
*Filter:設(shè)置或返回記錄集的數(shù)據(jù)過濾條件
*LockType:設(shè)置或返回記錄加鎖類型,默認(rèn)為adLockReadOnly
*RecordCount:返回記錄集中的記錄數(shù)目
*State:返回記錄集的當(dāng)前狀態(tài)
2.瀏覽記錄集
在一個(gè)記錄集中,只可能有一個(gè)記錄成為當(dāng)前記錄,絕大多數(shù)記錄集操作都是針對(duì)當(dāng)前記錄。Recordset對(duì)象提供了多個(gè)屬性和方法來實(shí)現(xiàn)記錄瀏覽,即切換當(dāng)前記錄。
Recordset對(duì)象與記錄瀏覽相關(guān)的屬性如下:
*PageSize:設(shè)置或返回記錄集中每個(gè)記錄頁中包含的記錄條數(shù),默認(rèn)值為10
*PageCount:返回記錄頁個(gè)數(shù)
*AbsolutePage:返回當(dāng)前記錄頁序號(hào)
*AbsolutePosition:返回當(dāng)前記錄絕對(duì)位置的序號(hào)
*Bof:返回記錄指針是否指向第一個(gè)記錄之前
*Eof(EndOfFile):返回記錄是否指向最后一個(gè)記錄之后
*Bookmark:返回唯一標(biāo)識(shí)當(dāng)前記錄的書簽,或者將當(dāng)前記錄設(shè)置為書簽標(biāo)識(shí)的記錄
Recordset對(duì)象與記錄瀏覽相關(guān)的方法如下:
*Move n:使當(dāng)前記錄向前或向后的第n條記錄成為當(dāng)前記錄,n大于0向前(記錄集的末尾),n小于0向后(記錄集的開頭)。
*MoveFirst:使第一條記錄成為當(dāng)前記錄
*MoveLast:使最后一條記錄成為當(dāng)前記錄。
*MoveNext:使下(向記錄集的末尾)一條記錄成為當(dāng)前記錄
*MovePrevious:使上(向記錄集的開頭)一條記錄成為當(dāng)前記錄
3.記錄集排序
可利用記錄集的Sort屬性實(shí)現(xiàn)記錄排序,排序僅僅是按排序的順序訪問記錄,實(shí)際數(shù)據(jù)并沒有排序。設(shè)置Sort屬性時(shí),需指定排序字段的名稱,多個(gè)字段使
用逗號(hào)分隔??捎肁SC或DESC關(guān)鍵字,前者表示按升序(從小到大)排序,后者表示按降序(從大到?。?。默認(rèn)為ASC。例
如:m_pRs->Sort="學(xué)號(hào) ASC"
將Sort屬性設(shè)置為空字符串可取消排序,恢復(fù)原始順序。
4.篩選記錄
可設(shè)置記錄集的Filter屬性來篩選記錄,只有使篩選條件為True的記錄才出現(xiàn)在記錄集中。設(shè)置Filter屬性會(huì)影響AbsolutePosition、AbsolutePage、RecordCount和PageCount屬性值。
一般使用包含邏輯表達(dá)式的字符串作為Filter屬性值,例如:
m_pRs->Filter="出生日期>#1990-1-1#"
字符串中的字符串用單引號(hào)括起來,日前用#括起來。字符串中可以使用>、<、<=、>=、<>、=或LIKE關(guān)系運(yùn)
算符,AND和OR兩個(gè)邏輯運(yùn)算符,且AND和OR沒有優(yōu)先級(jí)之分。Like的模式字符串中可用*或%代表任意長(zhǎng)度的任意字符構(gòu)成的字符串,_代表一個(gè)任
意的字符。
將Filter屬性設(shè)為空字符串或adFilterNone常量可取消篩選。
5.查找記錄
記錄集的Find方法用于查找記錄,在條件字符串中可用>、<、=、或Like等關(guān)系運(yùn)算構(gòu)成關(guān)系表達(dá)式。條件字符串中的字符串用單引號(hào)括起來,日期使用#括起來。例如:
m_pRs->Find "出生日期=#1990-1-1#"
6.執(zhí)行查詢
首先執(zhí)行Close方法關(guān)閉記錄集,在命令文本中包含SQL
Select查詢,再執(zhí)行Open方法重新打開記錄集,從而獲得指定的查詢結(jié)果。例如:
m_pRs->Close();
m_strCmdText="SELECT * FROM StudentInfo WHERE age>=35";
m_pRs->Open((LPCTSTR)m_strCmdText,(LPCTSTR)m_strConnection,adOpenStatic,adLockOptimistic,adCmdTableDirect);
7.修改記錄
在Visual
C++中,記錄集的Update方法用于修改記錄。Update方法使用兩個(gè)保存字段名稱好字段值的安全數(shù)組作為參數(shù)。例如:
long index[1];
VARIANT
flds,vals; //聲明兩個(gè)安全數(shù)組變量
flds.vt=VT_ARRAY|VT_VARIANT; //定義安全數(shù)組類型
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUND
bound; //聲明安全數(shù)組邊界變量
bound.cElements=5; //定義安全數(shù)組元素個(gè)數(shù)
bound.lLbound=0; //定義安全數(shù)組最小下標(biāo)
COleVariant
fld[5],val[5]; //用于保存字段名稱和字段值
//設(shè)置字段名稱數(shù)組元素值
fld[0]="id";
fld[1]="name";
fld[2]="age";
fld[3]="sex";
fld[4]="email";
//設(shè)置字段值數(shù)組元素值
val[0]=m_strDlgid;
val[1]=m_strDlgname;
val[2]=m_strDlgage;
val[3]=m_strDlgsex;
val[4]=m_strDlgemail;
//創(chuàng)建安全數(shù)組
flds.parray=::SafeArrayCreate(VT_VARIANT,1,&bound);
vals.parray=::SafeArrayCreate(VT_VARIANT,1,&bound);
for (int i=0;i<5;i++)
{
index[0]=i;
::SafeArrayPutElement(flds.parray,index,&fld[i]);//將字段名稱存入安全數(shù)組
::SafeArrayPutElement(vals.parray,index,&val[i]);//將字段值存入安全數(shù)組
}
m_pRs->Update(&flds,&vals); //使用安全數(shù)組修改當(dāng)前記錄
8.添加記錄
記錄集的AddNew方法用于添加記錄,添加記錄與修改記錄方法基本相同
long index[1];
VARIANT
flds,vals; //聲明兩個(gè)安全數(shù)組變量
flds.vt=VT_ARRAY|VT_VARIANT; //定義安全數(shù)組類型
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUND
bound;
//聲明安全數(shù)組邊界變量
bound.cElements=5;
//定義安全數(shù)組元素個(gè)數(shù)
bound.lLbound=0;
//定義安全數(shù)組最小下標(biāo)
COleVariant
fld[5],val[5];
//用于保存字段名稱和字段值
//設(shè)置字段名稱數(shù)組元素值
fld[0]="id";
fld[1]="name";
fld[2]="age";
fld[3]="sex";
fld[4]="email";
//設(shè)置字段值數(shù)組元素值
val[0]=m_strDlgid;
val[1]=m_strDlgname;
val[2]=m_strDlgage;
val[3]=m_strDlgsex;
val[4]=m_strDlgemail;
//創(chuàng)建安全數(shù)組
flds.parray=::SafeArrayCreate(VT_VARIANT,1,&bound);
vals.parray=::SafeArrayCreate(VT_VARIANT,1,&bound);
for (int i=0;i<5;i++)
{
index[0]=i;
::SafeArrayPutElement(flds.parray,index,&fld[i]);//將字段名稱存入安全數(shù)組
::SafeArrayPutElement(vals.parray,index,&val[i]);//將字段值存入安全數(shù)組
}
m_pRs->AddNew(&flds,&vals);
//使用安全數(shù)組修改當(dāng)前記錄
9.刪除記錄
記錄集的Delete方法用于刪除記錄,例如:
m_pRs->Delete(adAffectCurrent); //刪除當(dāng)前記錄
m_pRs->MoveNext();
//使下一條記錄成為當(dāng)前記錄
|