Visual C++提供多元資料存取技術:ODBC API、MFC ODBC、DAO、OLE DB、ADO。各有特色:
| 技術 | 定位 | 特點 |
|---|---|---|
| ODBC | 底層介面 | 統一API存取所有關聯式資料庫,標準化程度高,但僅限關聯式DB |
| MFC ODBC | 封裝層 | 封裝ODBC API,簡化開發,適合快速建構應用 |
| DAO | Jet引擎專用 | 操作MDB檔案強大,MFC封裝後易用,但不支援多執行緒 |
| OLE DB | 底層COM介面 | 統一存取所有資料源(含非關聯式),程式碼量大,配合ATL模板簡化 |
| ADO | 高層介面 | 封裝OLE DB,物件模型簡潔,開發效率最高 |
ODBC使用SQL資料類型(資料源端)與C資料類型(應用端)。四種控制代碼管理上下文:
SQL_SUCCESS:成功SQL_SUCCESS_WITH_INFO:成功但有警告,需查診斷記錄SQL_ERROR:失敗SQL_INVALID_HANDLE:控制代碼無效SQL_NO_DATA:無資料(如Fetch結束)每個ODBC函數呼叫產生診斷記錄,存於相關控制代碼中,直到下一次使用同一控制代碼。包含標頭記錄(第0筆)與狀態記錄。使用SQLGetDiagRec或SQLGetDiagField取得詳細錯誤資訊(SQLSTATE、原生錯誤碼、訊息文字)。
SQLHENV hEnv;
SQLHDBC hDbc;
SQLRETURN ret;
// 1. 分配環境控制代碼
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// 2. 分配連接控制代碼
ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
// 3. 連接資料源 (假設DSN="MyDSN")
ret = SQLConnect(hDbc, (SQLCHAR*)"MyDSN", SQL_NTS,
(SQLCHAR*)"user", SQL_NTS, (SQLCHAR*)"pwd", SQL_NTS);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
// 連接成功,進行後續操作...
}
ODBC API雖屬底層介面,程式碼量較大,但提供最精細的控制權,適合需要高效能、特殊功能或跨資料庫平台的應用。掌握控制代碼管理、SQL執行流程與錯誤診斷機制,是熟練運用ODBC的關鍵。