首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

MFC 獨立使用 CRecordset:不依賴 AppWizard 直接執行 SQL 查詢

     編輯:關於C語言

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;"));
}

執行 SELECT 查詢並讀取結果


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 多載對照

原型說明
`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 使用範例


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
    // ... 其他型別
}

關鍵提醒

  • `CDatabase` 物件必須在 `CRecordset` 存活期間保持開啟
  • `forwardOnly` + `readOnly` 效能最佳,不支援 `MovePrev`/`MoveLast`
  • 異常處理:`Open` 失敗拋 `CDBException*`,建議 `try/catch` 包裹
  • 參數化查詢:`CRecordset` 不直接支援參數綁定,需自行拼接 SQL 或使用 `CDatabase::ExecuteSQL` 配合 `?` 參數 (需 ODBC 驅動支援)
  • 交易控制:`m_db.BeginTrans()` / `CommitTrans()` / `Rollback()`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved