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

VC++ 資料庫通用模組開發:使用 DataGrid 6.0 顯示 Access 資料完整步驟

     編輯:VC 教學

前言

本文詳細記錄在 VC++ 6.0 MFC 對話框專案中,引入 Microsoft DataGrid Control 6.0 (OLEDB)、連接 Access 資料庫 (Jet OLEDB 4.0)、使用 ADO _RecordsetPtr 繫結資料並顯示的完整步驟與程式碼。

步驟 1:建立專案

  • MFC AppWizard (exe) → Dialog based → 專案名 Data_Disp2。

步驟 2:匯入 DataGrid ActiveX 控件

  1. 專案右鍵 → Add to Project → Components and Controls。
  2. 選 Registered ActiveX Controls → Microsoft DataGrid Control 6.0 (OLEDB) → Insert。
  3. 確認類別對話框勾選預設類別 → OK。工具箱出現 DataGrid 圖示。

步驟 3:放置控件並建立變數

  1. 拖曳 DataGrid 至對話框,設 ID 為 IDC_DATAGRID_TEST。
  2. ClassWizard 加入控件變數:CDataGrid m_dbTest; (類別 CDataGrid 為 Wizard 產生的包裝類)。

步驟 4:準備 Access 資料庫

  • 檔案:DataDisp2.mdb (放專案目錄或指定完整路徑)。
  • 資料表 BALANCE 結構:
欄位名型別說明
NameText姓名
IncomeCurrency收入
ExpenseCurrency支出
BalanceCurrency餘額
TimeDate/Time時間

步驟 5:標頭檔引用與匯入

// Data_Disp2Dlg.h
#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF", "adoEOF")

#include "Columns.h"
#include "Column.h"

class CData_Disp2Dlg : public CDialog
{
    // ...
    _ConnectionPtr m_pConnection;
    _RecordsetPtr  m_pRecordset;
    CDataGrid      m_dbTest;
};

步驟 6:OnInitDialog 完整實作

BOOL CData_Disp2Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // ... 系統選單、圖示初始化 (Wizard 產生) ...

    // 1. 建立 ADO 連線物件
    HRESULT hr = m_pConnection.CreateInstance(__uuidof(Connection));
    if (FAILED(hr)) { AfxMessageBox(_T("建立 Connection 失敗")); return FALSE; }

    try {
        m_pConnection->ConnectionTimeout = 8;
        m_pConnection->CursorLocation = adUseClient; // 客戶端游標,支援斷開式
        m_pConnection->Open(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataDisp2.mdb"), _T(""), _T(""), adModeUnknown);
    }
    catch (_com_error& e) {
        AfxMessageBox(_T("資料庫連接失敗: ") + CString(e.ErrorMessage()));
        return FALSE;
    }

    // 2. 開啟記錄集
    try {
        hr = m_pRecordset.CreateInstance(__uuidof(Recordset));
        if (FAILED(hr)) { AfxMessageBox(_T("建立 Recordset 失敗")); return FALSE; }

        m_pRecordset->Open(_T("SELECT * FROM BALANCE"),
            _variant_t((IDispatch*)m_pConnection, true),
            adOpenDynamic, adLockPessimistic, adCmdText);
    }
    catch (_com_error& e) {
        CString msg; msg.Format(_T("開啟記錄集失敗: %s"), e.ErrorMessage());
        AfxMessageBox(msg); return FALSE;
    }

    // 3. 繫結資料來源到 DataGrid
    m_dbTest.SetRefDataSource(NULL); // 先清除
    m_dbTest.SetRefDataSource((LPUNKNOWN)m_pRecordset);
    m_dbTest.SetColumnHeaders(2); // 顯示欄標題

    // 4. 設定欄寬與標題
    _variant_t vIndex;
    vIndex = (long)0; m_dbTest.GetColumns().GetItem(vIndex).SetWidth(50); m_dbTest.GetColumns().GetItem(vIndex).SetCaption(_T("姓名"));
    vIndex = (long)1; m_dbTest.GetColumns().GetItem(vIndex).SetWidth(50); m_dbTest.GetColumns().GetItem(vIndex).SetCaption(_T("收入"));
    vIndex = (long)2; m_dbTest.GetColumns().GetItem(vIndex).SetWidth(50); m_dbTest.GetColumns().GetItem(vIndex).SetCaption(_T("支出"));
    vIndex = (long)3; m_dbTest.GetColumns().GetItem(vIndex).SetWidth(30); m_dbTest.GetColumns().GetItem(vIndex).SetCaption(_T("餘額"));
    vIndex = (long)4; m_dbTest.GetColumns().GetItem(vIndex).SetWidth(30); m_dbTest.GetColumns().GetItem(vIndex).SetCaption(_T("時間"));

    // 5. 重新整理顯示
    m_dbTest.Refresh();

    return TRUE;
}

關鍵點解析

項目說明
#import ... rename("EOF", "adoEOF")避免 EOF 巨集與 MFC/STL 衝突。
CursorLocation = adUseClient客戶端游標,Recordset 可離線操作,DataGrid 繫結需求。
adOpenDynamic / adLockPessimistic動態游標/悲觀鎖定,支援即時更新與並發控制。
SetRefDataSourceDataGrid 專用繫結方法,傳入 IUnknown* (Recordset 支援)。
_variant_t 索引DataGrid Columns 集合索引為 VARIANT 型別,需明確轉型 long。

常見問題與解決

  • 找不到 msado15.dll:確認 MDAC 2.8+ 已安裝,路徑通常在 C:\Program Files\Common Files\System\ado\。
  • DataGrid 不顯示資料:檢查 SetRefDataSource 是否在 Open 之後呼叫;確認 ColumnHeaders 設為 2 (顯示標題)。
  • 中文欄位名亂碼:專案設定為 Unicode 或確保 Access 資料庫為 Unicode 格式 (Access 2000+ 預設)。
  • 無法編輯:DataGrid 6.0 僅支援基礎編輯;需進階編輯請改用 MSFlexGrid、FlexGrid 或第三方網格。

總結

透過 DataGrid 6.0 + ADO + Jet OLEDB,可在 VC6 MFC 專案快速實現資料庫表格顯示。核心流程:Connection.Open → Recordset.Open → DataGrid.SetRefDataSource → 設定 Columns → Refresh。此架構雖經典但穩定,適合維護舊專案或快速原型開發。

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