主题:高手请进:ODBC API 调用存储过程问题
初学者遇到的很奇怪的问题,请耐心看完描述:
用ODBC API访问SQL Server存储过程,发现输出参数有问题。代码如下(初始化代码略):
...
...
SQLRETURN rc;
int i;
SQLINTEGER x;
// 绑定一个int型输出参数
rc = SQLBindParameter(m_hStmt, 1, SQL_PARAM_INPUT_OUTPUT,
SQL_C_LONG, SQL_INTEGER, 0, 0, &i, 0, &x);
TEST(rc); // TEST是自定义函数,检测函数返回值
rc = SQLPrepare(hStmt, "EXEC sp_Test ?", SQL_NTS);
TEST(rc);
rc = SQLExecute(m_hStmt);
TEST(rc);
sp_Test存储过程定义如下:
CREATE PROCEDURE sp_Test
@a int out
as
set @a=1342
显然,它什么也不干,直接对输出参数赋值。
问题1:执行后发现参数未成功输出。将SQLBindParameter函数的最后一个参数(&x)改为NULL即可成功(i的值变为1342)。请问原来的用法有什么问题?
问题2:用SQL_PARAM_OUTPUT会失败,用SQL_PARAM_INPUT_OUTPUT成功,请问两者有什么区别?我这里的参数并不需要作为输入。
问题3: 成功之后修改sp_Test,加一些其他代码,发现只要加任何代码都会导致参数无法正确输出。实在不明白为什么。
高手请指教,不胜感激!
用ODBC API访问SQL Server存储过程,发现输出参数有问题。代码如下(初始化代码略):
...
...
SQLRETURN rc;
int i;
SQLINTEGER x;
// 绑定一个int型输出参数
rc = SQLBindParameter(m_hStmt, 1, SQL_PARAM_INPUT_OUTPUT,
SQL_C_LONG, SQL_INTEGER, 0, 0, &i, 0, &x);
TEST(rc); // TEST是自定义函数,检测函数返回值
rc = SQLPrepare(hStmt, "EXEC sp_Test ?", SQL_NTS);
TEST(rc);
rc = SQLExecute(m_hStmt);
TEST(rc);
sp_Test存储过程定义如下:
CREATE PROCEDURE sp_Test
@a int out
as
set @a=1342
显然,它什么也不干,直接对输出参数赋值。
问题1:执行后发现参数未成功输出。将SQLBindParameter函数的最后一个参数(&x)改为NULL即可成功(i的值变为1342)。请问原来的用法有什么问题?
问题2:用SQL_PARAM_OUTPUT会失败,用SQL_PARAM_INPUT_OUTPUT成功,请问两者有什么区别?我这里的参数并不需要作为输入。
问题3: 成功之后修改sp_Test,加一些其他代码,发现只要加任何代码都会导致参数无法正确输出。实在不明白为什么。
高手请指教,不胜感激!