SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLUINTEGER ColumnSize, SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr, SQLINTEGER BufferLength, SQLINTEGER * StrLen_or_IndPtr); StatementHandle:执行SQL语句STMT句柄。
ParameterNumber:指明要将变量与第几个参数绑定,从1开始计算。
InputOutputType:指明是输入还是输出参数。可以取值的范围为:SQL_PARAM_INPUT,SQL_PARAM_OUTPUT ,SQL_PARAM_INPUT_OUTPUT。 ValueType:指明用于和参数绑定的C语言数据类型。 ParameterType:指明在存储过程中ODBC数据类型。
ColumnSize:指明接收数据的宽度,对于字符串和结构需要指明数据的宽度,而对于普通的变量如SQLINTEGER,SQLFLOAT等设置为0就可以了。
DecimalDigits :当数据类型为SQL_NUMERIC,SQL_DECIMAL时指明数字小数点的精度,否则填0。
ParameterValuePtr:在作为输入参数指明参数的指针,在作为输出参数时指明接收数据的变量指针。
BufferLength:指明参数指针所指向的缓冲区的字节数大小。对于字符串和结构需要指明大小,而对于普通的变量如SQLINTEGER,SQLFLOAT等设置为0就可以了。
StrLen_or_IndPtr:作为输入参数时指明数据的字节数大小,对于普通的定长变量如
SQLINTEGER,SQLFLOAT等设置为0就可以了,对于字符号串需要在此参数中指定字符串数据的长度,或者设置为SQL_NULL_DATA表明此参数为空值,或者设置为SQL_NTS表明字符串以NULL字符结尾,对于结构需要指明结构的长度。当作为输出参数时,当SQL执行完毕后会在这个参数中返回拷贝的缓冲区的数据的字节数。
2.5.4.1 例子一:调用含有输出参数的存储过程
在SQL Server中建立存储过程: create proc p_f
@myid int output,@myname varchar(20) output,@mytall float output,@mytall2 dec(30,10) output,
@inid int,@inname varchar(10),@intall float,@intall2 dec(30,10) as
print 'do it'
set @myid=1+isnull(@inid,-1)
set @myname='test'+isnull(@inname,'_NULL') set @mytall=100.100 + @intall set @mytall2=100.100 + @intall2 return 1024
这个存储过程的前四个参数是输出参数,后四个参数是输入参数。并且最后返回1024作为返回值。四个参数分别是不同的数据类型:整数,字符串,浮点数和带有10位小数的30位数字。
这个例子中我们不使用后面四个参数,只演示输出参数的使用方法,后四个输出参数直接在SQL语句中指定,程序代码如下。 void OnTestP4() {
//省略分配句柄和连接数据库的部分
SQLCHAR szOutput[40],szOutput2[40]; SQLINTEGER iOutput=0,iReturnVal=0; SQLFLOAT fOutput=0; //只使用输出参数
SQLCHAR szSQL[100]=\p_f(?,?,?,?,1,'_OK',1000.001,1000.001)}\
//用于保存各个返回的输出参数的字节数 SQLINTEGER cb1,cb2,cb3,cb4,cb5; //分配STMT句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
//绑定参数
retcode = SQLBindParameter(hstmt1, 1, SQL_PARAM_OUTPUT, SQL_C_LONG,SQL_INTEGER, 0, 0, &iReturnVal, 0, &cb1);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindParameter(hstmt1, 2, SQL_PARAM_OUTPUT, SQL_C_LONG,SQL_INTEGER, 0, 0, &iOutput, 0, &cb2);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindParameter(hstmt1, 3, SQL_PARAM_OUTPUT, SQL_C_CHAR,SQL_VARCHAR, 20, 0, szOutput, 20, &cb3);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindParameter(hstmt1, 4, SQL_PARAM_OUTPUT, SQL_C_DOUBLE,SQL_FLOAT, 0, 0, &fOutput, 0, &cb4);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindParameter(hstmt1, 5, SQL_PARAM_OUTPUT, SQL_C_CHAR,SQL_DECIMAL, 25, 10, szOutput2, 40, &cb5);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
//执行SQL语句,调用存储过程
retcode = SQLExecDirect (hstmt1,szSQL, SQL_NTS); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
else
//得到结果集 while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) ;
TRACE(%utput,szOutput2);
SQLFreeHandle(SQL_HANDLE_STMT,hstmt1); //省略释放句柄部分 }
我们现在来分别分析返回值和四个参数绑定的调用。 绑定返回值和第一个整数:
retcode = SQLBindParameter(hstmt1, 1, SQL_PARAM_OUTPUT, SQL_C_LONG,SQL_INTEGER, 0, 0, &iReturnVal, 0, &cb1); ParameterNumber =1,2
InputOutputType = SQL_PARAM_OUTPUT,指明作为输出参数。 ValueType = SQL_C_LONG,指明C语言中数据类型为 int 。 ParameterType = SQL_INTEGER,指明SQL数据类型为Integer。 ColumnSize = 0 DecimalDigits = 0
ParameterValuePtr = &iReturnVal , &iOutput 为保存返回参数的缓冲区(变量)指针。 BufferLength = 0
StrLen_or_IndPtr = &cb1,cb1未赋初值,用于得到返回参数的字节大小。 绑定第二个字符串: