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

MFC ODBC 開發核心:DDX 與 RFX 機制深度解析與 AppWizard 實戰

     編輯:關於C語言

MFC 為 ODBC 程式設計提供五大基礎類別,其中 CFieldExchange 實現的 RFX(Record Field Exchange) 機制,是記錄集與資料源雙向資料交換的核心。本文系統介紹五大類別職責、RFX 函式對照表,並以 AppWizard 逐步建立範例專案,示範 DDX(對話框資料交換)與 RFX 協作的完整流程。

MFC ODBC 五大基礎類別職責

類別核心職責
CDatabase代表資料源連接,封裝 SQLConnect/SQLDriverConnect,管理交易認可/回滾。
CRecordset封裝結果集,支援游標捲動、篩選、排序、編輯、新增/刪除。
CRecordView表單視圖直接綁定 CRecordset,提供資料感知控件自動 DDX。
CFieldExchange實現 RFX,負責記錄集成員變數與資料庫欄位的雙向繫結。
CDBException封裝 ODBC 錯誤碼與訊息,提供 m_nRetCode、m_strError 等診斷資訊。

RFX 函式完整對照表

在 CRecordset::DoFieldExchange() 覆寫中,針對每個成員變數呼叫對應 RFX 函式:

RFX 函式C++ 型別SQL 型別範例
RFX_BoolBOOLBIT, SMALLINT
RFX_ByteBYTETINYINT
RFX_Int / RFX_Longint / longINTEGER, SMALLINT, BIGINT
RFX_Single / RFX_Doublefloat / doubleREAL, FLOAT, DOUBLE
RFX_TextCStringCHAR, VARCHAR, TEXT
RFX_BinaryCByteArrayBINARY, VARBINARY, IMAGE
RFX_DateCTime / COleDateTimeDATE, TIMESTAMP
RFX_LongBinaryCLongBinaryBLOB, IMAGE (大物件)

AppWizard 建立 ODBC 專案完整步驟

  1. File → New → Projects → MFC AppWizard (exe),專案名 TestODBC。
  2. 選擇 Single Document,下一步。
  3. 資料庫支援選 Database view with file support,點擊 Data Source...。
  4. 選擇 ODBC → 下拉選單選 Visual FoxPro Tables(或 SQL Server、Access)。
  5. Recordset type 設 Snapshot(唯讀快照,效能最佳),確定。
  6. 選擇資料表檔案 test.dbf,連續點 Next 完成產生。

產生的類別結構

CTestODBCApp       // 應用程式類
CTestODBCDoc       // 文件類
CTestODBCSet       // 記錄集類 (繼承 CRecordset)
CTestODBCView      // 視圖類 (繼承 CRecordView)
CMainFrame         // 主視窗框架
CAboutDlg          // 關於對話框

記錄集類關鍵實作片段

// CTestODBCSet.h
class CTestODBCSet : public CRecordset
{
public:
    // 欄位成員變數(由 AppWizard 依資料表自動產生)
    long   m_ID;
    CString m_Name;
    double m_Score;
    CTime   m_Date;

    // 連接字串(DSN-less)
    virtual CString GetDefaultConnect() {
        return _T("Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=.;Exclusive=No;");
    }
    virtual CString GetDefaultSQL() { return _T("test"); }

    // RFX 綁定
    virtual void DoFieldExchange(CFieldExchange* pFX) {
        pFX->SetFieldType(CFieldExchange::outputColumn);
        RFX_Long(pFX, _T("[ID]"), m_ID);
        RFX_Text(pFX, _T("[Name]"), m_Name);
        RFX_Double(pFX, _T("[Score]"), m_Score);
        RFX_Date(pFX, _T("[Date]"), m_Date);
    }
};

視圖類自動 DDX 綁定

CRecordView 覆寫 DoDataExchange,呼叫 DDX_FieldText 等函式,將記錄集成員直接綁定至對話框控件:

void CTestODBCView::DoDataExchange(CDataExchange* pDX)
{
    CRecordView::DoDataExchange(pDX);
    DDX_FieldText(pDX, IDC_EDIT_ID, m_pSet->m_ID, m_pSet);
    DDX_FieldText(pDX, IDC_EDIT_NAME, m_pSet->m_Name, m_pSet);
    DDX_FieldText(pDX, IDC_EDIT_SCORE, m_pSet->m_Score, m_pSet);
    // 日期需自行處理格式化
}

RFX 與 DDX 協作流程圖解

sequenceDiagram
    participant User
    participant View as CRecordView
    participant RS as CRecordset
    participant RFX as CFieldExchange
    participant DB as ODBC Driver

    User->>View: 編輯控件內容
    View->>View: OnOK() -> UpdateData(TRUE)
    View->>RS: DDX_FieldText -> RFX_Text
    RFX->>RS: 更新成員變數 m_Name
    User->>View: 點擊「下一筆」
    View->>RS: MoveNext()
    RS->>DB: SQLFetch
    DB->>RFX: 傳回欄位資料
    RFX->>RS: RFX_Text 讀取至 m_Name
    RS->>View: DDX_FieldText 更新控件
    View->>User: 顯示新記錄

常見問題與最佳實務

  • 欄位名稱大小寫:RFX 宏字串參數需與資料庫完全一致(含括號),建議直接複製 SQL 結構。
  • CTime 範圍限制(1970-2038),跨世紀應用請改用 COleDateTime + RFX_Date。
  • 長字串/二進位:超過 255 字元請用 RFX_LongBinary + CLongBinary,並設定 CRecordset::useMultiRowFetch。
  • 效能:唯讀報表請用 CRecordset::snapshot + forwardOnly 游標;需更新才用 dynaset。
  • 例外處理:所有資料庫操作包裹 TRY/CATCH(CDBException, e),記錄 e->m_strError。

總結

MFC ODBC 架構以 CDatabase 管理連接,CRecordset 封裝結果集,CFieldExchange 實現 RFX 雙向繫結,CRecordView 提供表單級 DDX。掌握 RFX 函式對照表與 DoFieldExchange 覆寫模式,配合 AppWizard 快速產生樣板碼,即可高效開發穩健的資料庫應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved