retcode = SQLBindParameter(hstmt1, 3, SQL_PARAM_OUTPUT, SQL_C_CHAR,SQL_VARCHAR, 20, 0, szOutput, 20, &cb3); ParameterNumber =3
InputOutputType = SQL_PARAM_OUTPUT,指明作为输出参数。 ValueType =SQL_C_CHAR,指明C语言中数据类型为 char[ ] 。 ParameterType = SQL_VARCHAR,指明SQL数据类型为 Varchar。 ColumnSize = 20 ,指明字符串宽度为20。 DecimalDigits = 0
ParameterValuePtr = szOutput 为保存返回参数的缓冲区(变量)指针。 BufferLength = 20 ,指明缓冲区的最大字节数。
StrLen_or_IndPtr = &cb3,cb3未赋初值,用于得到返回参数的字节大小。 绑定第三个浮点数:
retcode = SQLBindParameter(hstmt1, 4, SQL_PARAM_OUTPUT, SQL_C_DOUBLE,SQL_FLOAT, 0, 0, &fOutput, 0, &cb4); ParameterNumber =4
InputOutputType = SQL_PARAM_OUTPUT,指明作为输出参数。 ValueType =SQL_C_DOUBLE,指明C语言中数据类型为 double 。 ParameterType = SQL_FLOAT,指明SQL数据类型为 float或double。 ColumnSize = 0 DecimalDigits = 0
ParameterValuePtr =&fOutput为保存返回参数的缓冲区(变量)指针。 BufferLength = 0
StrLen_or_IndPtr = &cb4,cb4未赋初值,用于得到返回参数的字节大小。 绑定第四个数字:
retcode = SQLBindParameter(hstmt1, 5, SQL_PARAM_OUTPUT, SQL_C_CHAR,SQL_DECIMAL, 25, 10, szOutput2, 40, &cb5); ParameterNumber =4
InputOutputType = SQL_PARAM_OUTPUT,指明作为输出参数。
ValueType =SQL_C_ CHAR,指明C语言中数据类型为 char[ ] ,虽然可以使用
SQL_NUMERIC_STRUCT结构来进行参数绑定,不过ODBC中默认的类型是SQL_C_CHAR(见图2.6)。
ParameterType = SQL_ DECIMAL,指明SQL数据类型为 Dec或Number。
ColumnSize = 25 ,指明数据的宽度,请注意在存储过程中定义的参数为dec(30, 10)表明参数为30位,而实际上返回的不足30位,所以这里可以指定一个比较小的值,但是如果返回的数的位数如果超过25位,将无法得到正确结果。 DecimalDigits = 10 ,指明小数点后位数为10位。
ParameterValuePtr =&fOutput为保存返回参数的缓冲区(变量)指针。 BufferLength =4 0 ,指明缓冲区的最大字节数。
StrLen_or_IndPtr = &cb5,cb5未赋初值,用于得到返回参数的字节大小。
2.5.4.2 例子二:调用含有输入和输出参数的存储过程
在这个例子里我们会处理输入参数,输出参数绑定和既输入又输出的参数绑定。此外我们还可以看看如何传递空值。
这个例子所用到的存储过程是在前一个存储过程的基础上修改的,前面的参数完全相同,而最后4个参数为既输入又输出的参数。 create proc p_f2
@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),
@ioid int output,@ioname varchar(10) output,@iotall float output,@iotall2 dec(30,10) output as
print 'do it'
set @myid=1+isnull(@inid,-1) set @myname='Test2'+@inname set @mytall=200.200 + @intall set @mytall2=200.200 + @intall2
set @ioid=@ioid+1
set @ioname='test'+@ioname set @iotall=200.200 + @iotall set @iotall2=200.200 + @iotall2 return 2048 代码如下。 void OnTestP6() {
SQLCHAR szOutput[40],szOutput2[40]; SQLINTEGER iOutput=0,iReturnVal=0; SQLFLOAT fOutput=0;
SQLCHAR
szInput[40]=\ SQLINTEGER iInput=1000;
SQLFLOAT fInput=1000.1;
SQLCHAR szIO[40]=\ SQLINTEGER iIO=2000; SQLFLOAT fIO=3000.3;
SQLCHAR szSQL[100]=\p_f2(?,?,?,?,?,?,?,?,?,?,?,?)}\
SQLINTEGER cb1,cb2,cb3,cb4,cb5;
SQLINTEGER cb6=0,cb7=SQL_NTS,cb8=0,cb9=SQL_NTS; SQLINTEGER cb10=0,cb11=SQL_NTS,cb12=0,cb13=SQL_NTS; //分配STMT句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
// output 此部分代码在前面出现过,此处省略 // input
cb6= SQL_NULL_DATA;
retcode = SQLBindParameter(hstmt1, 6, SQL_PARAM_INPUT, SQL_C_LONG,SQL_INTEGER, 0, 0, NULL, 0, &cb6);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindParameter(hstmt1, 7, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_VARCHAR, 20, 0, szInput, 20, &cb7);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindParameter(hstmt1, 8, SQL_PARAM_INPUT, SQL_C_DOUBLE,SQL_FLOAT, 0, 0, &fInput, 0, &cb8);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindParameter(hstmt1, 9, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_DECIMAL, 25, 10, szInput2, 40, &cb9);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
// input & output
retcode = SQLBindParameter(hstmt1, 10,
SQL_PARAM_INPUT_OUTPUT, SQL_C_LONG,SQL_INTEGER, 0, 0, &iIO, 0, &cb10);