上集介紹 VC++ 多元資料庫技術全景,本集聚焦 ODBC API 底層編程。雖然代碼量較大,但掌握它能讓你觸達資料庫引擎最原始的能力——異步操作、事務控制、遊標精細管理,皆在掌握。
SQLAllocHandle(SQL_HANDLE_ENV))SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3))SQLAllocHandle(SQL_HANDLE_DBC))SQLSetConnectAttr,如登入逾時)SQLAllocHandle(SQL_HANDLE_STMT)) → 執行 SQL → 取回結果SQLConnect(hdbc, (SQLCHAR*)"DSN_Name", SQL_NTS,
(SQLCHAR*)"uid", SQL_NTS,
(SQLCHAR*)"pwd", SQL_NTS);
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);
MARS_Connection=Yes)DriverCompletion 四種模式:
SQL_DRIVER_NOPROMPT:純後台,失敗報錯SQL_DRIVER_COMPLETE:資訊不足時彈出對話框補全SQL_DRIVER_COMPLETE_REQUIRED:同上,但僅允許修改必要欄位SQL_DRIVER_PROMPT:直接彈出驅動選擇對話框OutConnectionString 回傳完整連線字串,可持久化供下次直連SQL_NEED_DATA 時解析 OutConnectionString 中的關鍵字清單,構建 UI 讓用戶選擇,再遞迴呼叫直至 SQL_SUCCESS#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_DATASQLGetDiagRec(handle, recNum, sqlState, &nativeErr, msg, sizeof(msg), &len) 可取得 SQLSTATE、原生錯誤碼、錯誤訊息。記錄 0 為頭記錄,後續為狀態記錄。SQL_ATTR_CONNECTION_POOLING,避免頻繁建立/銷毀連線開銷。SQLBindParameter + SQLParamOptions 批次插入/更新,減少網路往返。SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE, SQL_ASYNC_ENABLE_ON),配合 SQLGetDiagField 輪詢完成狀態,UI 不阻塞。SQL_CURSOR_FORWARD_ONLY 最快;需捲動再用 SQL_CURSOR_STATIC/KEYSET_DRIVEN/DYNAMIC。ODBC API 雖繁瑣,卻是所有上層封裝(MFC ODBC、ADO、OLE DB)的基石。熟練掌握句柄體系、連線模式、錯誤診斷與效能調優,能讓你在排查疑難雜癥、突破封裝限制時遊刃有餘。下集將實戰 MFC ODBC 類庫,體驗「寫更少代碼,辦更多事」的爽快。