VC++學習筆記(6)——在Visual C++中使用ADO

在Visual C++中,要使用ADO對象,必須先在類的頭文件中導入ADO的庫文件,幷包含頭文件icrsint.h。
ADO數據綁定對話框嚮導可自動導入ADO對象庫,幷包含icrsint.h。在對象Visual C++中,CADORecordBinding類實現瞭如何在Visual C++中使用ADO對象。ADO數據綁定對話框嚮導建立了一個CADORecordBinding類的派生類CCustomRs。CCustomRs類定義了與制定數據庫表字段對應的數據成員,並將數據成員綁定到字段。
在CCustomRs類頭文件RsCgDlg.h的頭部,導入了ADO庫:

#import "C:/Program Files/Common Files/system/ado/msado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")
using namespace ADOCG;
#include "icrsint.h"

然後,嚮導定義了一個CRsCgDlg類,該類繼承了CDialog(對話框類)和CCustomRs。CRsCgDlg類定義了一個記錄集對象指針m_pRs,如下:

_RecordsetPtr m_pRs;

_RecordsetPtr在CADORecordBinding類中被定義爲ADO的Recordset對象指針。通過m_pRs即可在對話框中使用ADO的Recordset對象訪問數據庫。
1.打開記錄集
首先要創建一個Connection對象實例,然後執行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");//定義命令文本內容
m_pRs.CreateInstance(__uuidof(Recordset)); //創建Connection對象實例
m_pRs->CursorLocation = adUseClient;         //設置遊標位置
m_pRs->Open((LPCTSTR)m_strCmdText,      //命令文本內容
(LPCTSTR)m_strConnection,                         //連接字符串
adOpenKeyset,                                            //設置遊標類型
adLockReadOnly,                                         //設置鎖定類型
adCmdTableDirect);                                     //設置命令類型

2.遊標位置
Connection對象的CursorLocation屬性用於設置或返回遊標位置,常數adUseClient表示使用本地遊標庫提供的客戶端遊標。adUseServer表示使用數據提供者或驅動程序提供的遊標,爲默認值。

3.遊標類型
遊標類型決定了記錄集是否可讀寫以及記錄滾動方式。遊標類型常量有:
adOpenForwardOnly 僅向前遊標,默認值。只能在記錄中向前滾動
adOpenKeyset    鍵集遊標。記錄集不能訪問其他用戶刪除的記錄,無法查看其他用戶添加 

                        的記錄,可看見其他用戶更改的數據

adOpenDynamic  動態遊標。可看見其他用戶所作的添加、更改和刪除。允許在記錄集中進

                        行所有類型的移動。
adOpenStatic     靜態遊標。記錄集用於查找數據或生成報告。對其他用戶所作的添加、更改

                        或刪除不可見。

4.鎖定類型
鎖定類型決定記錄集如何對記錄加鎖。鎖定類型常量有:
adLockReadOnly    默認值,只讀。無法更改數據。
adLockPessimistic  保守式逐條記錄鎖定。爲確保成功編輯記錄,採用編輯時立即鎖定數據源

                           的記錄。
adLockOptimistic   開放式逐條記錄鎖定。只有在調用Update方法時鎖定記錄。
adLockBatchOptimistic  開放式批更新,只在調用UpdateBatch方法時鎖定記錄。

5.命令類型
命令類型用於決定提供者如何解釋CommandText屬性設置的命令文本,命令類型常量有:
AdCmdText                 將CommandText解釋爲命令或存儲過程調用
AdCmdTable                將CommandText解釋爲數據庫查詢的名稱
AdCmdTableDirect        將CommandText解釋爲數據庫表的名稱
AdCmdStoredProc        將CommandText解釋爲存儲過程名稱
AdCmdUnknown           默認值。將CommandText解釋爲未知的命令類型
AdCommandFile            將CommandText解釋爲持久Recordset文件名
AdExecuteNoRecords    將CommandText解釋爲不返回行的命令或存儲過程

6.連接字符串
連接字符串用於指定數據提供者、數據庫服務器、數據庫、用戶名好口令等連接信息。常用的數據提供者有:
MSDASQL          訪問ODBC數據源的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數據庫)的OLE DB提供者
SQLOLEDB         訪問Microsoft SQL Server數據庫的OLE DB提供者
MSDAORA          訪問Oracle的OLE DB提供者

使用Recordset對象

Recordset對象用於保存執行查詢獲得的記錄,並可將修改後的記錄返回服務器。
1.Recordset對象常用屬性
*AbsolutePosition:返回當前記錄在記錄集中的序號
*ActiveConnection:設置或返回對象使用的活動連接
*Bof:記錄指針指向第一條記錄之前時返回值爲True,否則爲False
*CursorLocation:設置或返回指針(也稱光標或遊標)的位置,默認爲adUseServer
*CursorType:設置或返回指針類型,默認爲adOpenForward
*Eof(EndOfFile):記錄指針指向最後一條記錄之後時返回值爲True,否則爲False
*Filter:設置或返回記錄集的數據過濾條件
*LockType:設置或返回記錄加鎖類型,默認爲adLockReadOnly
*RecordCount:返回記錄集中的記錄數目
*State:返回記錄集的當前狀態
2.瀏覽記錄集
在一個記錄集中,只可能有一個記錄成爲當前記錄,絕大多數記錄集操作都是針對當前記錄。Recordset對象提供了多個屬性和方法來實現記錄瀏覽,即切換當前記錄。
Recordset對象與記錄瀏覽相關的屬性如下:
*PageSize:設置或返回記錄集中每個記錄頁中包含的記錄條數,默認值爲10
*PageCount:返回記錄頁個數
*AbsolutePage:返回當前記錄頁序號
*AbsolutePosition:返回當前記錄絕對位置的序號
*Bof:返回記錄指針是否指向第一個記錄之前
*Eof(EndOfFile):返回記錄是否指向最後一個記錄之後
*Bookmark:返回唯一標識當前記錄的書籤,或者將當前記錄設置爲書籤標識的記錄
Recordset對象與記錄瀏覽相關的方法如下:
*Move n:使當前記錄向前或向後的第n條記錄成爲當前記錄,n大於0向前(記錄集的末尾),n小於0向後(記錄集的開頭)。
*MoveFirst:使第一條記錄成爲當前記錄
*MoveLast:使最後一條記錄成爲當前記錄。
*MoveNext:使下(向記錄集的末尾)一條記錄成爲當前記錄
*MovePrevious:使上(向記錄集的開頭)一條記錄成爲當前記錄
3.記錄集排序
可利用記錄集的Sort屬性實現記錄排序,排序僅僅是按排序的順序訪問記錄,實際數據並沒有排序。設置Sort屬性時,需指定排序字段的名稱,多個字段使用逗號分隔。可用ASC或DESC關鍵字,前者表示按升序(從小到大)排序,後者表示按降序(從大到小)。默認爲ASC。例如:m_pRs->Sort="學號 ASC"
將Sort屬性設置爲空字符串可取消排序,恢復原始順序。
4.篩選記錄
可設置記錄集的Filter屬性來篩選記錄,只有使篩選條件爲True的記錄纔出現在記錄集中。設置Filter屬性會影響AbsolutePosition、AbsolutePage、RecordCount和PageCount屬性值。
一般使用包含邏輯表達式的字符串作爲Filter屬性值,例如:
m_pRs->Filter="出生日期>#1990-1-1#"
字符串中的字符串用單引號括起來,日前用#括起來。字符串中可以使用>、<、<=、>=、<>、=或LIKE關係運算符,AND和OR兩個邏輯運算符,且AND和OR沒有優先級之分。Like的模式字符串中可用*或%代表任意長度的任意字符構成的字符串,_代表一個任意的字符。
將Filter屬性設爲空字符串或adFilterNone常量可取消篩選。
5.查找記錄
記錄集的Find方法用於查找記錄,在條件字符串中可用>、<、=、或Like等關係運算構成關係表達式。條件字符串中的字符串用單引號括起來,日期使用#括起來。例如:
m_pRs->Find "出生日期=#1990-1-1#"
6.執行查詢
首先執行Close方法關閉記錄集,在命令文本中包含SQL Select查詢,再執行Open方法重新打開記錄集,從而獲得指定的查詢結果。例如:
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方法使用兩個保存字段名稱好字段值的安全數組作爲參數。例如:
long index[1];
VARIANT flds,vals;   //聲明兩個安全數組變量
flds.vt=VT_ARRAY|VT_VARIANT;  //定義安全數組類型
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUND bound;   //聲明安全數組邊界變量
bound.cElements=5;   //定義安全數組元素個數
bound.lLbound=0;   //定義安全數組最小下標
COleVariant fld[5],val[5];  //用於保存字段名稱和字段值
//設置字段名稱數組元素值
fld[0]="id";
fld[1]="name";
fld[2]="age";
fld[3]="sex";
fld[4]="email";
//設置字段值數組元素值
val[0]=m_strDlgid;
val[1]=m_strDlgname;
val[2]=m_strDlgage;
val[3]=m_strDlgsex;
val[4]=m_strDlgemail;
//創建安全數組
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]);//將字段名稱存入安全數組
 ::SafeArrayPutElement(vals.parray,index,&val[i]);//將字段值存入安全數組
}
m_pRs->Update(&flds,&vals);  //使用安全數組修改當前記錄
8.添加記錄
記錄集的AddNew方法用於添加記錄,添加記錄與修改記錄方法基本相同
long index[1];
VARIANT flds,vals;                       //聲明兩個安全數組變量
flds.vt=VT_ARRAY|VT_VARIANT;  //定義安全數組類型
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUND bound;          //聲明安全數組邊界變量
bound.cElements=5;                   //定義安全數組元素個數
bound.lLbound=0;                      //定義安全數組最小下標
COleVariant fld[5],val[5];             //用於保存字段名稱和字段值
//設置字段名稱數組元素值
fld[0]="id";
fld[1]="name";
fld[2]="age";
fld[3]="sex";
fld[4]="email";
//設置字段值數組元素值
val[0]=m_strDlgid;
val[1]=m_strDlgname;
val[2]=m_strDlgage;
val[3]=m_strDlgsex;
val[4]=m_strDlgemail;
//創建安全數組
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]);//將字段名稱存入安全數組
 ::SafeArrayPutElement(vals.parray,index,&val[i]);//將字段值存入安全數組
}
m_pRs->AddNew(&flds,&vals);                        //使用安全數組修改當前記錄
9.刪除記錄
記錄集的Delete方法用於刪除記錄,例如:
m_pRs->Delete(adAffectCurrent);  //刪除當前記錄
m_pRs->MoveNext();                   //使下一條記錄成爲當前記錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章