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