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

VC++ 打造通用資料庫操作類:CDataBaseOperate 封裝 DAO 實現開箱即用

     編輯:VC 教學

MFC DAO 類別 (CDaoDatabase、CDaoRecordset 等) 功能強大但使用繁瑣。本文設計一個 CDataBaseOperate 封裝類,整合開啟資料庫、開啟資料表/查詢、條件篩選記錄集、資源自動管理 (RAII 風格) 等常用操作,支援對話框專案直接使用,無需文檔/視圖架構。

類別架構設計

成員變數 (對應 DAO 核心物件)

class CDataBaseOperate {
private:
    // 連接字串 (ODBC DSN=sql-database, UID=sa, PWD=pass)
    #define SQL_DATABASE _T("ODBC;DSN=sql-database;UID=sa;PWD=pass;")

    CDaoDatabase*  m_pDatabase;   // 資料庫連接
    CDaoTableDef*  m_pTableDef;   // 資料表定義
    CDaoRecordset  m_Recordset;   // 記錄集 (值語義,隨類生命週期)
    CDaoQueryDef*  m_pQueryDef;   // 查詢定義

    long m_nRecordCount;          // 記錄總數快取
public:
    CDataBaseOperate();           // 建構: new 指針物件
    ~CDataBaseOperate();          // 析構: delete 指針物件

    BOOL OpenDatabase();          // 開啟資料庫
    BOOL OpenTable(CString table, long difficulty=0); // 開啟表並查詢
    void CloseTable();            // 關閉表並釋放指針
    // ... 記錄導航、增刪改查封裝 ...
};

建構/析構:指針物件生命週期管理

CDataBaseOperate::CDataBaseOperate() {
    m_pDatabase = new CDaoDatabase;
    m_pTableDef = NULL; m_pQueryDef = NULL;
    m_nRecordCount = 0;
}
CDataBaseOperate::~CDataBaseOperate() {
    CloseTable(); // 確保釋放 Table/Query 指針
    if (m_pDatabase) {
        if (m_pDatabase->IsOpen()) m_pDatabase->Close();
        delete m_pDatabase; m_pDatabase = NULL;
    }
}

核心:OpenTable 含條件查詢

BOOL CDataBaseOperate::OpenTable(CString strTableName, long lDifficulty) {
    if (!OpenDatabase()) return FALSE;

    m_pTableDef = new CDaoTableDef(m_pDatabase);
    if (!m_pTableDef->Open(strTableName)) { delete m_pTableDef; return FALSE; }

    // 構建 SQL
    CString sql;
    if (lDifficulty == 0) {
        sql.Format(_T("SELECT * FROM [%s]"), strTableName);
    } else {
        sql.Format(_T("SELECT * FROM [%s] WHERE [難度係數] = %ld"), strTableName, lDifficulty);
    }

    m_pQueryDef = new CDaoQueryDef(m_pDatabase);
    m_pQueryDef->Create(NULL, sql); // 建立查詢
    m_Recordset.Open(m_pQueryDef);  // 開啟記錄集

    // 計算記錄數 (移動到末尾)
    m_nRecordCount = 0;
    while (!m_Recordset.IsEOF()) { m_nRecordCount++; m_Recordset.MoveNext(); }
    m_Recordset.MoveFirst();

    return TRUE;
}

資源釋放配對原則

void CDataBaseOperate::CloseTable() {
    if (m_pQueryDef) { delete m_pQueryDef; m_pQueryDef = NULL; }
    if (m_pTableDef) { delete m_pTableDef; m_pTableDef = NULL; }
    // m_Recordset 為值成員,隨類銷毀自動 Close
}

在對話框專案中使用

// 主對話框 .h
#include "DataBaseOperate.h"
class CMyDlg : public CDialog {
    CDataBaseOperate m_db; // 成員變數
    // ...
};

// 具體操作 .cpp
void CMyDlg::OnBtnQuery() {
    if (!m_db.OpenTable(_T("Questions"), 2)) { // 查難度=2
        AfxMessageBox(_T("開啟資料表失敗"));
        return;
    }
    // 遍歷顯示
    while (!m_db.m_Recordset.IsEOF()) {
        CString name = m_db.m_Recordset.GetFieldValue(_T("正題內容"));
        // ... 更新 UI ...
        m_db.m_Recordset.MoveNext();
    }
    m_db.CloseTable();
}

設計優勢

  • 支援對話框專案: 不需 CRecordView/CDaoRecordView 文檔視圖架構。
  • SQL 靈活構建: 參數化條件 (如難度係數) 直接拼接 SQL,比 MFC 向導生成的 m_strFilter 更直觀強大。
  • 資源安全: 指針物件在建構/析構、Open/Close 中嚴格配對 new/delete,避免洩漏。
  • 擴展性: 可依需求添加 InsertRecord、UpdateRecord、DeleteRecord、ExecuteSQL 等封裝方法。

此類已在多個 MFC + Access/SQL Server 專案中穩定運行,歡迎直接複用擴展。

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