本文詳細記錄在 VC++ 6.0 MFC 對話框專案中,引入 Microsoft DataGrid Control 6.0 (OLEDB)、連接 Access 資料庫 (Jet OLEDB 4.0)、使用 ADO _RecordsetPtr 繫結資料並顯示的完整步驟與程式碼。
Data_Disp2。IDC_DATAGRID_TEST。CDataGrid m_dbTest; (類別 CDataGrid 為 Wizard 產生的包裝類)。DataDisp2.mdb (放專案目錄或指定完整路徑)。BALANCE 結構:| 欄位名 | 型別 | 說明 |
|---|---|---|
| Name | Text | 姓名 |
| Income | Currency | 收入 |
| Expense | Currency | 支出 |
| Balance | Currency | 餘額 |
| Time | Date/Time | 時間 |
// 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;
};
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 | 動態游標/悲觀鎖定,支援即時更新與並發控制。 |
SetRefDataSource | DataGrid 專用繫結方法,傳入 IUnknown* (Recordset 支援)。 |
_variant_t 索引 | DataGrid Columns 集合索引為 VARIANT 型別,需明確轉型 long。 |
C:\Program Files\Common Files\System\ado\。SetRefDataSource 是否在 Open 之後呼叫;確認 ColumnHeaders 設為 2 (顯示標題)。MSFlexGrid、FlexGrid 或第三方網格。透過 DataGrid 6.0 + ADO + Jet OLEDB,可在 VC6 MFC 專案快速實現資料庫表格顯示。核心流程:Connection.Open → Recordset.Open → DataGrid.SetRefDataSource → 設定 Columns → Refresh。此架構雖經典但穩定,適合維護舊專案或快速原型開發。