一般情況下AppWizard會在數據庫應用程序中自動產生CRecordset的派生類,並將派生類和某個數據源中的表聯系起來也可以和視圖上的子窗口聯系起來。但是有時這樣做會影響到程序的靈活性,這時候我們可以單獨使用CRecordSet類。利用CRecordSet類我們可以執行SQL語句,並可以讀出結果集中數據。
首先我們需要包含頭文件afxdb.h,可以將#include 添加到stdafx.h文件中。此外在使用CRecordset時必須有一個又一個CDatabase對象,該對象的作用是管理數據源連接。然後可以產生一個CRecordset對象,利用BOOL CRecordset::Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none )可以執行SQL語句。
但執行成功後,可以調用以下的函數滾動光標,讀取數據。 MoveFirst 移動光標到第一條記錄處 MoveNext 移動光標到後一條記錄處 MovePrev 移動光標到前一條記錄處 MoveLast 移動光標到最後一條記錄處 IsBOF 檢測光標是否在第一條記錄上 IsEOF 檢測光標是否在最後一條記錄上 GetFieldValue 得到結果中數據下面是具體代碼:
/* 假設CDatabase m_dbConn為成員變量 假設有一個表有如下SQL語句產生:CREATE TABLE table1(loc_id not null) */ void CYourClass::ConnectToDB() {//連接數據庫 BOOL fOK = m_dbConn.Open("test"); TRACE("connect fOK=%d ",m_dbConn); } void CYourClass::Select() {//執行SELECT語句 CRecordset rec(&m_dbConn); BOOL fOK = rec.Open(CRecordset::forwardOnly,"select loc_id from table1 order by loc_id"); TRACE("select fOK = %d ",fOK); TRACE("返回的列數為:%d ",rec.GetRowsetSize()); CString szResult; while(!rec.IsEOF()) { rec.GetFieldValue((int)0,szResult); rec.MoveNext(); TRACE("fetch : %s ",szResult); } }
此外CRecordset::GetFieldValue有很多種原型,你可以通過指定列位置或是字段名來獲取數據:
void GetFieldValue( LPCTSTR lpszName, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );
void GetFieldValue( short nIndex, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );
void GetFieldValue( LPCTSTR lpszName, CString& strValue );
void GetFieldValue( short nIndex, CString& strValue );
如果使用CDBVariant類型變量來獲取結果,你可以得到任何類型的結果。在CDBVariant::m_dwType成員變量中記錄了該變量所包含的數據類型,根據該變量的值你可以確定數據類型並引用CDBVariant對象中的相應成員變量。