AppWizard 產生的 `CRecordset` 衍生類綁定特定資料表,缺乏彈性。直接使用 `CRecordset` 基類搭配 `CDatabase`,可動態執行任意 SQL、讀取結果集,適合臨時查詢、多資料庫切換等場景。本文示範連線、開啟 `forwardOnly` 唯讀資料集、捲動游標讀取欄位值的完整流程。
#include // 在 stdafx.h 中包含
class CMyClass {
CDatabase m_db; // 管理連線
// ...
};
BOOL CMyClass::Connect() {
// DSN 名稱需在 ODBC 管理員預先建立
return m_db.Open(_T("MyDSN"), FALSE, FALSE, _T("ODBC;"));
}
void CMyClass::SelectSample() {
CRecordset rs(&m_db);
// 唯讀、前向、無游標捲動開銷
if (!rs.Open(CRecordset::forwardOnly,
_T("SELECT loc_id FROM table1 ORDER BY loc_id"),
CRecordset::readOnly)) {
TRACE(_T("Open failed\n")); return;
}
TRACE(_T("Columns: %d\n"), rs.GetODBCFieldCount());
CString strVal;
while (!rs.IsEOF()) {
rs.GetFieldValue((short)0, strVal); // 依欄位索引 (0-based)
TRACE(_T("loc_id = %s\n"), strVal);
rs.MoveNext();
}
rs.Close();
}
| 原型 | 說明 |
|---|---|
| `GetFieldValue(LPCTSTR name, CString& val)` | 依欄位名稱取得字串 |
| `GetFieldValue(short index, CString& val)` | 依欄位索引取得字串 |
| `GetFieldValue(LPCTSTR name, CDBVariant& var, short type = DEFAULT)` | 依名稱取得任意型別 (var.m_dwType 指示實際型別) |
| `GetFieldValue(short index, CDBVariant& var, short type = DEFAULT)` | 依索引取得任意型別 |
CDBVariant var;
rs.GetFieldValue(_T("salary"), var);
switch (var.m_dwType) {
case DBVT_LONG: TRACE(_T("Long: %ld\n"), var.m_lVal); break;
case DBVT_DOUBLE: TRACE(_T("Double: %f\n"), var.m_dblVal); break;
case DBVT_STRING: TRACE(_T("String: %s\n"), (LPCTSTR)*var.m_pstring); break;
case DBVT_DATE: // var.m_pdate -> TIMESTAMP_STRUCT
// ... 其他型別
}