建立資料庫連線後,需透過「陳述句」向資料源發送 SQL 命令。本章涵蓋陳述句控制代碼分配、直接執行與預備執行兩種模式、參數綁定技術,以及陳述句釋放流程。
SQLAllocHandle)SQLFreeHandle).data?
hStmt dd ?
.code
invoke SQLAllocHandle, SQL_HANDLE_STMT, hConn, addr hStmt
.if ax == SQL_SUCCESS || ax == SQL_SUCCESS_WITH_INFO
; 成功
.endif
注意:ODBC 3.x 回傳值在 AX(16-bit),非 EAX。
適合一次性查詢,SQL 在執行時編譯。
.data
SQLStmt db "select * from Sales",0
.code
invoke SQLExecDirect, hStmt, addr SQLStmt, sizeof SQLStmt
回傳值:SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_INVALID_HANDLE、SQL_NEED_DATA、SQL_NO_DATA、SQL_STILL_EXECUTING(非同步)。
同一 SQL 重複執行時效能較佳:先 SQLPrepare 編譯,再多次 SQLExecute。
invoke SQLPrepare, hStmt, addr SQLStmt, sizeof SQLStmt
invoke SQLExecute, hStmt
以 ? 作為參數標記,配合 SQLBindParameter 將程式變數綁定至參數。
.data
SQLString db "select telephoneNo from employee where name=?",0
Sample1 db "Bob",0
Sample2 db "Mary",0
.data?
buffer db 21 dup(?)
StrLen dd ?
.code
invoke SQLPrepare, hStmt, addr SQLString, sizeof SQLString
invoke SQLBindParameter, hStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 20, 0, addr buffer, sizeof buffer, addr StrLen
; 第一次查詢
invoke lstrcpy, addr buffer, addr Sample1
mov StrLen, sizeof Sample1
invoke SQLExecute, hStmt
; 第二次查詢
invoke lstrcpy, addr buffer, addr Sample2
mov StrLen, sizeof Sample2
invoke SQLExecute, hStmt
| 參數 | 說明 |
|---|---|
| ParameterNumber | 參數序號(從 1 起,最左為 1) |
| InputOutputType | SQL_PARAM_INPUT/OUTPUT/INPUT_OUTPUT |
| ValueType | C 語言資料型別(SQL_C_*) |
| ParameterType | SQL 資料型別(SQL_CHAR 等) |
| ColumnSize | 欄位長度 |
| DecimalDigits | 小數位數 |
| ParameterValuePtr | 資料緩衝區位址 |
| BufferLength | 緩衝區長度 |
| StrLen_or_IndPtr | 實際資料長度指標,或 SQL_NTS(以 0 結尾)、SQL_NULL_DATA |
; 解除綁定並重置參數
invoke SQLFreeStmt, hStmt, SQL_UNBIND
invoke SQLFreeStmt, hStmt, SQL_RESET_PARAMS
; 釋放陳述句控制代碼
invoke SQLFreeHandle, SQL_HANDLE_STMT, hStmt
下一章將介紹如何存取與處理查詢傳回的結果集。