ODBC 程式透過 ODBC 管理器與驅動程式溝通,連接資料源需經歷:環境控制代碼分配、設定 ODBC 版本、連接控制代碼分配、建立連線、斷線與釋放資源五大階段。
include windows.inc
include odbc32.inc
includelib odbc32.lib
.data?
hEnv dd ?
.code
invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_HANDLE_NULL, addr hEnv
.if ax == SQL_SUCCESS || ax == SQL_SUCCESS_WITH_INFO
; 成功
.endif
SQL_HANDLE_NULL 需從 windows.inc 移除尾隨的 "L" 才能通過 MASM 編譯。
invoke SQLSetEnvAttr, hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, NULL
.if ax == SQL_SUCCESS || ax == SQL_SUCCESS_WITH_INFO
; 成功
.endif
SQL_OV_ODBC3:使用 ODBC 3.x 語法(建議)。SQL_OV_ODBC2:相容 2.x。.data?
hConn dd ?
.code
invoke SQLAllocHandle, SQL_HANDLE_DBC, hEnv, addr hConn
| API | 特點 | 適用情境 |
|---|---|---|
SQLConnect | 僅需 DSN、使用者、密碼;無 GUI | 已知 DSN,自動化腳本 |
SQLDriverConnect | 支援無 DSN 連線字串、可選擇性彈出對話框 | 一般應用程式,需使用者互動選擇資料庫 |
SQLBrowseConnect | 多次呼叫逐步建構連線資訊,最靈活 | 複雜部署、需動態探索資料源屬性 |
.data
DSN db "Sales",0
.code
invoke SQLConnect, hConn, addr DSN, sizeof DSN, 0, 0, 0, 0
.data
strConnect db "DBQ=c:\data\test.mdb;DRIVER={Microsoft Access Driver (*.mdb)};",0
.data?
buffer db 1024 dup(?)
OutStringLength dd ?
.code
invoke SQLDriverConnect, hConn, hWnd, addr strConnect, sizeof strConnect, \
addr buffer, sizeof buffer, addr OutStringLength, SQL_DRIVER_COMPLETE
hWnd:父視窗控制代碼,NULL 則不顯示對話框。DriverCompletion:SQL_DRIVER_PROMPT(必詢)、SQL_DRIVER_COMPLETE(缺資訊才詢)、SQL_DRIVER_NOPROMPT(不詢)。invoke SQLDisconnect, hConn
invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
SQLFreeHandle 取代舊版 SQLFreeConnect/SQLFreeEnv。
所有 ODBC 函數失敗時,可呼叫 SQLGetDiagRec 或 SQLGetDiagField 取得詳細錯誤資訊(類似 GetLastError)。