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

Visual C++ ODBC 編程完整實戰指南:從 AppWizard 到進階操作

     編輯:VC 教學

ODBC 架構回顧

ODBC (Open Database Connectivity) 提供統一 C API 存取異構資料庫。VC MFC 封裝三大核心類:

  • CDatabase:管理資料源連線 (ODBC `SQLConnect`/`SQLDriverConnect`)
  • CRecordset:封裝結果集,支援 Dynaset (動態) / Snapshot (快照) 兩種游標
  • CRecordView:資料感知視圖,自動綁定控制項與欄位

一、AppWizard 快速生成 ODBC 應用骨架

  1. File → New → MFC AppWizard (exe) → 專案名
  2. 2. Step 1:選 **Single Document**,勾選 **Database view** → **With file support** (可寫入) 或 **Without file support** (唯讀) 3. Step 2:按 **Data Source...** 選擇已配置的系統/使用者 DSN (如 `Super_ES`) 4. Step 3:選擇資料表 (如 `BasicData`, `MainSize`),AppWizard 自動生成 `CRecordset` 衍生類 (`CSuper_ESSet`)、`CRecordView` 衍生類與 `DoFieldExchange` (RFX) 綁定代碼 5. 完成 → 編譯即得可運作的資料庫瀏覽/編輯程式

二、核心操作代碼模式

1. 查詢與過濾

// 方式 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);

2. 新增記錄

m_pSet->AddNew();
m_pSet->SetFieldNull(&m_pSet->m_type, FALSE);
m_pSet->m_type = _T("電動機");
// ... 設定其他欄位 ...
m_pSet->Update();
m_pSet->Requery();

3. 刪除記錄

m_pSet->Delete();
if (!m_pSet->IsEOF()) m_pSet->MoveNext();
else m_pSet->MoveLast();

4. 修改記錄

m_pSet->Edit();
m_pSet->m_type = _T("發電機");
// ... 修改欄位 ...
m_pSet->Update();
m_pSet->Requery();

5. 取消編輯/新增

m_pSet->Move(AFX_MOVE_REFRESH);  // 恢復編輯前狀態

三、進階技巧

資料庫連線共用 (節省連線池)

CDatabase db; db.Open(_T("Super_ES"));
m_set1.m_pDatabase = &db;
m_set2.m_pDatabase = &db;  // 多 Recordset 共用同一連線

直接執行 SQL (DDL/DML 批次)

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("連線失敗"));
}

四、Recordset 類型與鎖定模式選擇指南

游標類型適用場景功能限制
adOpenForwardOnly (快照)唯讀、順向瀏覽、大量資料匯出無 Bookmark、RecordCount、隨機存取
adOpenStatic (靜態)報表列印、離線分析看不到他人新增/刪除,可書籤
adOpenKeyset (鍵集)多用戶編輯、需看他人更新看不到他人新增/刪除
adOpenDynamic (動態)即時協作、儀表板完整同步,效能開銷最大
鎖定類型適用場景
adLockReadOnly純查詢
adLockOptimistic一般編輯 (Update 時才鎖)
adLockPessimistic高併發衝突場景 (Edit 即鎖)
adLockBatchOptimistic批次更新 (UpdateBatch)

五、常見錯誤與調試技巧

  • RFX 類型不匹配:資料庫 `DECIMAL(10,2)` 對應 `RFX_Single`/`RFX_Double`,不可用 `RFX_Long`
  • 記錄集未關閉就切換 SQL:必須先 `Close()` 再 `Open()` 新 SQL
  • 游標庫錯誤:ODBC 驅動不支援動態游標 → 改用 `adOpenStatic` 或升級驅動
  • 中文亂碼:確認資料庫、ODBC DSN、VC 專案字元集一致 (建議全 Unicode)
  • 效能調優:大量資料用 `CRecordset::SetCacheSize(100)`、僅選取所需欄位、避免 `SELECT *`

結語

MFC ODBC 類庫將繁瑣的 ODBC API 封裝為直觀的 C++ 類,配合 AppWizard 代碼生成,能快速構建穩健的資料庫應用。掌握 `CRecordset` 過濾/參數化查詢、游標/鎖定模式選擇、連線共用與直接 SQL 執行,即可應對絕多數企業級開發場景。現代專案建議逐步遷移至 ADO/OLE DB 或 Entity Framework Core 等更輕量、跨平台的資料存取技術。

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