汇编教程:使用语句
2008-10-14 09:35:13 来源:WEB开发网StatementHandle 语句句柄
ParameterNumber 参数个数,由1开始。这就是ODBC用来判断参数描述符的方法。如果有三个参数,则最左边是第一个参数,最右边是第三个参数。
InputOutputType 表明参数是用来输入还是输出的标志.这里的输入是指ODBC驱动程序将使用参数中获得的值,输出是指ODBC驱动程序将在操作结束时将结果放入参数中.大多数情况下,我们使用参数作为输入。而输出参数经常与存储过程有关.这个参数的两个可能值为: SQL_PARAM_INPUT、 SQL_PARAM_INPUT_OUTPUT和SQL_PARAM_OUTPUT(译者:似应为三个参数,但原文如此)
ValueType 指明用户程序将要绑定到参数的值或缓冲区的类型。可能的类型为一组常数,以SQL_C_开头。
ParameterType 参数的SQL类型。例如,如果SQL参数是文本字段,我们就在这里填入值SQL_CHAR.查看MSDN中的ODBC程序员指南来获得完整列表(ODBC Programmer's reference)。
ColumnSize 参数的长度。换句话说,可认为是与参数标志符相连接的列(字段)的长度.在我们的例子中, 我们的参数标志符对列"name"使用了标准值.如果该列被定义了20字节长,我们就该在ColumnSize中填入20.本文来自编程入门网
DecimalDigits 与参数描述符连接的列的小数位.
ParameterValuePtr 指向包含参数数据的缓冲区的指针.
BufferLength 由ParameterValuePtr指向的缓冲区的长度.
pStrLenOrIndPtr 指向一个双字的指针,包含以下之一:
由ParameterValuePtr指向的缓冲区中包含的参数长度. 除非参数的类型是字符串或二进制值,否则这个值被忽略.别把它与BufferLength混淆,看一下这个例子就会明白:假设该参数是一个字符串,该列有20字节宽.所以我们分配了一个21字节长的缓冲区,并将其地址传送到ParameterValuePtr。在调用函数SQLExecute前, 我们在缓冲区中放入了字符串"Bob".这个字符串有3字节长,因此我们需要在pStrLenOrIndPtr指向的双字中放入3这个值.
SQL_NTS. 这个参数是一个0结尾字符串(null-terminated string).
SQL_NULL_DATA. 参数值为NULL.
SQL_DEFAULT_PARAM. 存储过程将使用参数的默认值,而不是从用户程序中获得的值. 它仅适用于已定义了默认参数值的存储过程.
SQL_DATA_AT_EXEC. 参数的数据将由SQLPutData传送. 由于数据可能太大无法放入内存(比如整个文件的数据),我们可以告诉ODBC驱动程序我们将用SQLPutData替代.
可能你会说 pStrLenOrIndPtr的参数太多了,但通常情况下,我们只会用到第一或第三个选项。
例子:
.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
;===========================================
; First run
;===========================================
invoke lstrcpy, addr buffer, addr Sample1
mov StrLen, sizeof Sample1
invoke SQLExecute, hStmt
;===========================================
; Second run
;===========================================
invoke lstrcpy, addr buffer, addr Sample2
mov StrLen, sizeof Sample2
invoke SQLExecute, hStmt
注意我们仅将参数与缓冲区仅绑定了一次,当我们修改了缓冲区的内容并调用了SQLExecute 很多次.不必再调用SQLPrepare.ODBC驱动程序知道去那里找它需要的参数因为已通过SQLBindParameter函数告诉了它.
但现在我们还不能获得查询结果.访问和适用结果集是下一章的内容。
假设我们已完成了很多SQL语句,并要执行一个新的语句,那么没必要重新分配一个语句句柄.只要使用SQL_UNBIND与SQL_RESET_PARAMS参数调用SQLFreeStmt函数来解除与参数的绑定就可以了. 接下来就可以接着使用原来的语句句柄来执行SQL语句了.
释放语句
由调用SQLFreeHandle函数实现.
译注:原标题为Preparing and Using Statements,因为ODBC驱动程序繁多,有解释、编译执行之分,所以Preparing不仅是指准备,也有预编译的意思。
另:关于作者提到的MSDN,其ODBC部分可在Visual Studio及其部件中找到,如
C:\program Files\DevStudio\SharedIDE\Help\ODBC.hlp.
更多精彩
赞助商链接