【问题标题】:Error binding table-valued parameter while using ODBC, c++使用 ODBC、c++ 时绑定表值参数时出错
【发布时间】:2015-08-04 21:12:53
【问题描述】:

我正在尝试使用 ODBC 在存储过程中将表值参数作为参数传递。我遵循了 MSDN 中的示例,但在调用 SQLBindParameter 时收到以下错误:

HY004 [Microsoft][ODBC SQL Server Driver]无效的 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, "Invalid SQL data type"。 SQLSetDescField 和 SQLSetDescRec 也会发生这种情况。

但我正在尝试绑定表格项,而不是表格列。这几乎似乎直接与他们的代码示例中所述的内容相矛盾。我不确定为什么会发生此错误。有什么想法吗?

非常感谢。

【问题讨论】:

    标签: c++ odbc sqlbindparameter


    【解决方案1】:

    SQL 数据类型(在本例中为 SQL_SS_TABLE)对于 ODBC 驱动程序您正在使用。

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

    我使用的是默认的“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”驱动程序更新到更高版本或使用更高版本的操作系统很可能也能解决问题,或者一开始不会导致问题。

    【讨论】:

      【解决方案2】:

      您确定将 ODBC 设置为 3.x 版吗?在调用后立即尝试此操作以获取语句句柄:

       SQLHENV  hEnv  = SQL_NULL_HENV;
       SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); 
      
       SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
      

      【讨论】:

        猜你喜欢
        • 2013-04-02
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 2019-06-15
        相关资源
        最近更新 更多