ADO數(shù)據(jù)綁定對話框向?qū)Э勺詣訉?dǎo)入ADO對象庫,并包含icrsint.h。在對象VisualC++中,CADORecordBinding類實現(xiàn)了如何在VisualC++中使用ADO對象。ADO數(shù)據(jù)綁定對話框向?qū)Ы⒘艘粋€CADORecordBinding類的派生類CCustomRs。CCustomRs類定義了與制定數(shù)據(jù)庫表字段對應(yīng)的數(shù)據(jù)成員,并將數(shù)據(jù)成員綁定到字段。
在CCustomRs類頭文件RsCgDlg.h的頭部,導(dǎo)入了ADO庫:
#import "C:/Program Files/CommonFiles/system/ado/msado15.dll" rename_namespace("ADOCG")rename("EOF", "EndOfFile")
using namespace ADOCG;
#include "icrsint.h"
然后,向?qū)Фx了一個CRsCgDlg類,該類繼承了CDialog(對話框類)和CCustomRs。CRsCgDlg類定義了一個記錄集對象指針m_pRs,如下:
_RecordsetPtr m_pRs;
_RecordsetPtr在CADORecordBinding類中被定義為ADO的Recordset對象指針。通過m_pRs即可在對話框中使用ADO的Recordset對象訪問數(shù)據(jù)庫。
1.打開記錄集
首先要創(chuàng)建一個Connection對象實例,然后執(zhí)行Open方法打開記錄集。例如:
m_strConnection =_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C://Documents andSettings//Administrator//桌面
m_strCmdText = _T("F1");//定義命令文本內(nèi)容
m_pRs.CreateInstance(__uuidof(Recordset)); //創(chuàng)建Connection對象實例
m_pRs->CursorLocation =adUseClient;
m_pRs->Open((LPCTSTR)m_strCmdText,
(LPCTSTR)m_strConnection,
adOpenKeyset,
adLockReadOnly,
adCmdTableDirect);
2.游標(biāo)位置
Connection對象的CursorLocation屬性用于設(shè)置或返回游標(biāo)位置,常數(shù)adUseClient表示使用本地游標(biāo)庫提供的客戶端游標(biāo)。adUseServer表示使用數(shù)據(jù)提供者或驅(qū)動程序提供的游標(biāo),為默認(rèn)值。
3.游標(biāo)類型
游標(biāo)類型決定了記錄集是否可讀寫以及記錄滾動方式。游標(biāo)類型常量有:
adOpenForwardOnly
adOpenKeyset
adOpenDynamic
adOpenStatic
4.鎖定類型
鎖定類型決定記錄集如何對記錄加鎖。鎖定類型常量有:
adLockReadOnly
adLockPessimistic
adLockOptimistic
adLockBatchOptimistic
5.命令類型
命令類型用于決定提供者如何解釋CommandText屬性設(shè)置的命令文本,命令類型常量有:
AdCmdText
AdCmdTable
AdCmdTableDirect
AdCmdStoredProc
AdCmdUnknown
AdCommandFile
AdExecuteNoRecords
6.連接字符串
連接字符串用于指定數(shù)據(jù)提供者、數(shù)據(jù)庫服務(wù)器、數(shù)據(jù)庫、用戶名好口令等連接信息。常用的數(shù)據(jù)提供者有:
MSDASQL
MSIDXS
ADSDSOObject
Microsoft.Jet.OLEDB.3.51或4.0
SQLOLEDB
MSDAORA
使用Recordset對象
Recordset對象用于保存執(zhí)行查詢獲得的記錄,并可將修改后的記錄返回服務(wù)器。
1.Recordset對象常用屬性
*AbsolutePosition:返回當(dāng)前記錄在記錄集中的序號
*ActiveConnection:設(shè)置或返回對象使用的活動連接
*Bof:記錄指針指向第一條記錄之前時返回值為True,否則為False
*CursorLocation:設(shè)置或返回指針(也稱光標(biāo)或游標(biāo))的位置,默認(rèn)為adUseServer
*CursorType:設(shè)置或返回指針類型,默認(rèn)為adOpenForward
*Eof(EndOfFile):記錄指針指向最后一條記錄之后時返回值為True,否則為False
*Filter:設(shè)置或返回記錄集的數(shù)據(jù)過濾條件
*LockType:設(shè)置或返回記錄加鎖類型,默認(rèn)為adLockReadOnly
*RecordCount:返回記錄集中的記錄數(shù)目
*State:返回記錄集的當(dāng)前狀態(tài)
2.瀏覽記錄集
在一個記錄集中,只可能有一個記錄成為當(dāng)前記錄,絕大多數(shù)記錄集操作都是針對當(dāng)前記錄。Recordset對象提供了多個屬性和方法來實現(xiàn)記錄瀏覽,即切換當(dāng)前記錄。
Recordset對象與記錄瀏覽相關(guān)的屬性如下:
*PageSize:設(shè)置或返回記錄集中每個記錄頁中包含的記錄條數(shù),默認(rèn)值為10
*PageCount:返回記錄頁個數(shù)
*AbsolutePage:返回當(dāng)前記錄頁序號
*AbsolutePosition:返回當(dāng)前記錄絕對位置的序號
*Bof:返回記錄指針是否指向第一個記錄之前
*Eof(EndOfFile):返回記錄是否指向最后一個記錄之后
*Bookmark:返回唯一標(biāo)識當(dāng)前記錄的書簽,或者將當(dāng)前記錄設(shè)置為書簽標(biāo)識的記錄
Recordset對象與記錄瀏覽相關(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屬性實現(xiàn)記錄排序,排序僅僅是按排序的順序訪問記錄,實際數(shù)據(jù)并沒有排序。設(shè)置Sort屬性時,需指定排序字段的名稱,多個字段使用逗號分隔??捎肁SC或DESC關(guān)鍵字,前者表示按升序(從小到大)排序,后者表示按降序(從大到?。?。默認(rèn)為ASC。例如:m_pRs->Sort="學(xué)號 ASC"
將Sort屬性設(shè)置為空字符串可取消排序,恢復(fù)原始順序。
4.篩選記錄
可設(shè)置記錄集的Filter屬性來篩選記錄,只有使篩選條件為True的記錄才出現(xiàn)在記錄集中。設(shè)置Filter屬性會影響AbsolutePosition、AbsolutePage、RecordCount和PageCount屬性值。
一般使用包含邏輯表達式的字符串作為Filter屬性值,例如:
m_pRs->Filter="出生日期>#1990-1-1#"
字符串中的字符串用單引號括起來,日前用#括起來。字符串中可以使用>、<、<=、>=、<>、=或LIKE關(guān)系運算符,AND和OR兩個邏輯運算符,且AND和OR沒有優(yōu)先級之分。Like的模式字符串中可用*或%代表任意長度的任意字符構(gòu)成的字符串,_代表一個任意的字符。
將Filter屬性設(shè)為空字符串或adFilterNone常量可取消篩選。
5.查找記錄
記錄集的Find方法用于查找記錄,在條件字符串中可用>、<、=、或Like等關(guān)系運算構(gòu)成關(guān)系表達式。條件字符串中的字符串用單引號括起來,日期使用#括起來。例如:
m_pRs->Find "出生日期=#1990-1-1#"
6.執(zhí)行查詢
首先執(zhí)行Close方法關(guān)閉記錄集,在命令文本中包含SQLSelect查詢,再執(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.修改記錄
在VisualC++中,記錄集的Update方法用于修改記錄。Update方法使用兩個保存字段名稱好字段值的安全數(shù)組作為參數(shù)。例如:
long index[1];
VARIANTflds,vals;
flds.vt=VT_ARRAY|VT_VARIANT;
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUNDbound;
bound.cElements=5;
bound.lLbound=0;
COleVariantfld[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++)
{
}
m_pRs->Update(&flds,&vals);
8.添加記錄
記錄集的AddNew方法用于添加記錄,添加記錄與修改記錄方法基本相同
long index[1];
VARIANTflds,vals;
flds.vt=VT_ARRAY|VT_VARIANT;
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUNDbound;
bound.cElements=5;
bound.lLbound=0;
COleVariantfld[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++)
{
}
m_pRs->AddNew(&flds,&vals);
9.刪除記錄
記錄集的Delete方法用于刪除記錄,例如:
m_pRs->Delete(adAffectCurrent);
m_pRs->MoveNext();