初学者遇到的很奇怪的问题,请耐心看完描述:
  用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,加一些其他代码,发现只要加任何代码都会导致参数无法正确输出。实在不明白为什么。
  
  高手请指教,不胜感激!