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

VC++ 資料庫開發實戰(二):ODBC API 核心流程與三種連線模式深度解析

     編輯:VC 教學

前言

上集介紹 VC++ 多元資料庫技術全景,本集聚焦 ODBC API 底層編程。雖然代碼量較大,但掌握它能讓你觸達資料庫引擎最原始的能力——異步操作、事務控制、遊標精細管理,皆在掌握。

ODBC API 程式設計七步曲

  1. 分配環境控制代碼 (SQLAllocHandle(SQL_HANDLE_ENV))
  2. 設定 ODBC 版本屬性 (SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3))
  3. 分配連線控制代碼 (SQLAllocHandle(SQL_HANDLE_DBC))
  4. 設定連線屬性 (SQLSetConnectAttr,如登入逾時)
  5. 建立連線(三種模式擇一)
  6. 分配陳述句柄 (SQLAllocHandle(SQL_HANDLE_STMT)) → 執行 SQL → 取回結果
  7. 斷開連線 → 釋放句柄(逆序釋放:STMT → DBC → ENV)

三種連線函式詳細比較

1. SQLConnect:最輕量、最直接

SQLConnect(hdbc, (SQLCHAR*)"DSN_Name", SQL_NTS,
           (SQLCHAR*)"uid", SQL_NTS,
           (SQLCHAR*)"pwd", SQL_NTS);
  • 需預先在 ODBC 管理員建立系統/使用者 DSN
  • 適合嵌入式、無 UI 服務程式
  • 資訊最少,無法指定驅動專屬參數

2. SQLDriverConnect:連線字串全掌控,支援互動式提示

SQLDriverConnect(hdbc, hwnd,
    (SQLCHAR*)"DRIVER={SQL Server};SERVER=192.168.1.100;DATABASE=Test;UID=sa;PWD=123;",
    SQL_NTS, szOutConnStr, sizeof(szOutConnStr), &cbOut, SQL_DRIVER_NOPROMPT);
  • InConnectionString 可包含驅動專屬關鍵字(如 MARS_Connection=Yes)
  • DriverCompletion 四種模式:
    • SQL_DRIVER_NOPROMPT:純後台,失敗報錯
    • SQL_DRIVER_COMPLETE:資訊不足時彈出對話框補全
    • SQL_DRIVER_COMPLETE_REQUIRED:同上,但僅允許修改必要欄位
    • SQL_DRIVER_PROMPT:直接彈出驅動選擇對話框
  • 成功時 OutConnectionString 回傳完整連線字串,可持久化供下次直連

3. SQLBrowseConnect:迭代式發現伺服器/資料庫

  • 適用於「不知伺服器清單」的情境,逐步詢問伺服器→資料庫→認證
  • 回傳 SQL_NEED_DATA 時解析 OutConnectionString 中的關鍵字清單,構建 UI 讓用戶選擇,再遞迴呼叫直至 SQL_SUCCESS
  • 需驅動支援,本地資料庫(如 Access)通常不支援

完整範例:SQLConnect 連線 SQL Server

#include 
SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN ret;

ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0); // 5 秒逾時

ret = SQLConnect(hdbc, (SQLCHAR*)"Sales", SQL_NTS,
                 (SQLCHAR*)"JohnS", SQL_NTS,
                 (SQLCHAR*)"Sesame", SQL_NTS);

if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    // 執行 SQL、綁定欄位、逐列取數...
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);

錯誤處理:返回碼 + 診斷記錄雙管齊下

  • 返回碼:SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_INVALID_HANDLE、SQL_NO_DATA
  • 診斷記錄:呼叫 SQLGetDiagRec(handle, recNum, sqlState, &nativeErr, msg, sizeof(msg), &len) 可取得 SQLSTATE、原生錯誤碼、錯誤訊息。記錄 0 為頭記錄,後續為狀態記錄。

效能優化關鍵點

  1. 連線池:啟用 SQL_ATTR_CONNECTION_POOLING,避免頻繁建立/銷毀連線開銷。
  2. 參數化查詢 + 陣列繫結:SQLBindParameter + SQLParamOptions 批次插入/更新,減少網路往返。
  3. 非同步執行:SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE, SQL_ASYNC_ENABLE_ON),配合 SQLGetDiagField 輪詢完成狀態,UI 不阻塞。
  4. 遊標類型選擇:唯讀順向 SQL_CURSOR_FORWARD_ONLY 最快;需捲動再用 SQL_CURSOR_STATIC/KEYSET_DRIVEN/DYNAMIC。

結語

ODBC API 雖繁瑣,卻是所有上層封裝(MFC ODBC、ADO、OLE DB)的基石。熟練掌握句柄體系、連線模式、錯誤診斷與效能調優,能讓你在排查疑難雜癥、突破封裝限制時遊刃有餘。下集將實戰 MFC ODBC 類庫,體驗「寫更少代碼,辦更多事」的爽快。

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