ODBC (Open Database Connectivity) 提供統一 C API 存取異構資料庫。VC MFC 封裝三大核心類:
CDatabase:管理資料源連線 (ODBC `SQLConnect`/`SQLDriverConnect`)CRecordset:封裝結果集,支援 Dynaset (動態) / Snapshot (快照) 兩種游標CRecordView:資料感知視圖,自動綁定控制項與欄位// 方式 A:m_strFilter / m_strSort (類 SQL WHERE/ORDER BY)
m_pSet->m_strFilter = _T("TYPE='電動機'");
m_pSet->m_strSort = _T("VOLTAGE");
m_pSet->Requery();
// 方式 B:參數化查詢 (防注入、效能佳)
m_pSet->m_strFilter = _T("TYPE=? AND VOLTAGE=?");
m_pSet->m_paramType = _T("電動機"); // RFX_Text 綁定
m_pSet->m_paramVolt = 60.0; // RFX_Single 綁定
m_pSet->Requery();
// 方式 C:直接 SQL
CString sql = _T("SELECT * FROM BasicData,MainSize WHERE TYPE='電動機' ORDER BY VOLTAGE");
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE, sql);
m_pSet->AddNew();
m_pSet->SetFieldNull(&m_pSet->m_type, FALSE);
m_pSet->m_type = _T("電動機");
// ... 設定其他欄位 ...
m_pSet->Update();
m_pSet->Requery();
m_pSet->Delete();
if (!m_pSet->IsEOF()) m_pSet->MoveNext();
else m_pSet->MoveLast();
m_pSet->Edit();
m_pSet->m_type = _T("發電機");
// ... 修改欄位 ...
m_pSet->Update();
m_pSet->Requery();
m_pSet->Move(AFX_MOVE_REFRESH); // 恢復編輯前狀態
CDatabase db; db.Open(_T("Super_ES"));
m_set1.m_pDatabase = &db;
m_set2.m_pDatabase = &db; // 多 Recordset 共用同一連線
BOOL ExecuteSQL(CDatabase* pDb, const CString& sql) {
try { pDb->ExecuteSQL(sql); return TRUE; }
catch (CDBException* e) { e->ReportError(); e->Delete(); return FALSE; }
}
// 用途:CREATE TABLE, DROP TABLE, BULK INSERT, 執行預存程序等
// 注意:失去 DBMS 獨立性,謹慎使用
void ChangeTable(int slot) {
if (m_pSet->IsOpen()) m_pSet->Close();
CString sql = (slot == 0) ? _T("SELECT * FROM SLOT0") : _T("SELECT * FROM SLOT1");
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE, sql);
}
void ChangeDSN(int idx) {
CDatabase* pDb = m_pSet->m_pDatabase;
pDb->Close();
CString dsn = (idx == 0) ? _T("Super_ES") : _T("Motor");
if (!pDb->Open(dsn)) AfxMessageBox(_T("連線失敗"));
}
| 游標類型 | 適用場景 | 功能限制 |
|---|---|---|
| adOpenForwardOnly (快照) | 唯讀、順向瀏覽、大量資料匯出 | 無 Bookmark、RecordCount、隨機存取 |
| adOpenStatic (靜態) | 報表列印、離線分析 | 看不到他人新增/刪除,可書籤 |
| adOpenKeyset (鍵集) | 多用戶編輯、需看他人更新 | 看不到他人新增/刪除 |
| adOpenDynamic (動態) | 即時協作、儀表板 | 完整同步,效能開銷最大 |
| 鎖定類型 | 適用場景 |
|---|---|
| adLockReadOnly | 純查詢 |
| adLockOptimistic | 一般編輯 (Update 時才鎖) |
| adLockPessimistic | 高併發衝突場景 (Edit 即鎖) |
| adLockBatchOptimistic | 批次更新 (UpdateBatch) |
MFC ODBC 類庫將繁瑣的 ODBC API 封裝為直觀的 C++ 類,配合 AppWizard 代碼生成,能快速構建穩健的資料庫應用。掌握 `CRecordset` 過濾/參數化查詢、游標/鎖定模式選擇、連線共用與直接 SQL 執行,即可應對絕多數企業級開發場景。現代專案建議逐步遷移至 ADO/OLE DB 或 Entity Framework Core 等更輕量、跨平台的資料存取技術。