使用ODBC,c ++时绑定表值参数时出错

时间:2015-05-22 18:32:19

标签: c++ odbc sqlbindparameter

我试图使用ODBC将表值参数作为参数传递给存储过程。我已经按照MSDN中的示例进行操作,但在调用 SQLBindParameter 时收到以下错误:

  

HY004   [Microsoft] [ODBC SQL Server驱动程序]无效的SQL数据类型

这是我的代码。

//Allocate stament handle
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);

//Prep command
SQLPrepare(hStmt, (SQLCHAR*)"{call myStoredProc(?)}", SQL_NTS)

//Variables
const int arraySize = 2;
const int varcharSize = 30;
SQLCHAR *myUserDefTableName = (SQLCHAR *) "myUserDefTableName";
SQLLEN     myUserDefTableInd = 0;



//bind table item

int result = SQLBindParameter(hStmt, 
  1,// ParameterNumber
  SQL_PARAM_INPUT,// InputOutputType
  SQL_C_DEFAULT,// ValueType 
  SQL_SS_TABLE,// Parametertype
  (SQLINTEGER)arraySize,// ColumnSize - for a TVP this the row array size
  0,// DecimalDigits - for a TVP this is the number of columns in the TVP 
  (SQLPOINTER)myUserDefTableName,// ParameterValuePtr - for a TVP this is       the type name of the TVP
  SQL_NTS,// BufferLength - for a TVP this is the length of the type name or SQL_NTS
  &myUserDefTableInd);// StrLen_or_IndPtr - for a TVP this is the number of rows available

//bind columns for the table-valued parameter 
//and execute command
...

我也在MSDN上找到了这个:

  

表值参数列不能绑定为SQL_SS_TABLE类型。如果在ParameterType设置为SQL_SS_TABLE的情况下调用SQLBindParameter,则返回SQL_ERROR,并使用SQLSTATE = HY004,“无效的SQL数据类型”生成诊断记录。 SQLSetDescField和SQLSetDescRec也可能发生这种情况。

但是我试图绑定表项而不是表列。这似乎与他们的代码示例中所述的内容直接相矛盾。我不确定为什么会出现这种错误。有什么想法吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

SQLBindParameter 的调用也可能失败,并且#34;无效的SQL数据类型"当 SQL数据类型SQL_SS_TABLE在这种情况下,您使用的 ODBC驱动程序未知时。

您可以通过打开驱动程序标签下的 ODBC数据源管理员来检查已安装的ODBC驱动程序及其版本:

Win7 ODBC Drivers

我使用的是默认的" SQL Server"驱动程序,在传递给 SQLDriverConnect 的连接字符串中指定。

SQLDriverConnect(hdbc, NULL, (SQLCHAR*)"DRIVER={SQL Server}...

但是,此驱动程序是从2010开始的,似乎不支持SQL_SS_TABLE SQL类型。 因此SQLBindParameter调用发出无效类型错误记录。将此驱动程序更改为SQL Server Native Client 11.0可以解决我的问题,因为该问题来自2016年,很可能更新。

SQLDriverConnect(hdbc, NULL, (SQLCHAR*)"DRIVER={SQL Server Native Client 11.0}...

更新默认" SQL Server"驱动程序到更高版本或使用更高版本的操作系统很可能也会解决问题,或者首先不会导致问题。