2015-05-22 5 views
2

Я пытаюсь передать параметр таблицы в качестве параметра в хранимой процедуре с использованием ODBC. Я следовал примеры из MSDN, но получить следующее сообщение об ошибке, когда я звоню SQLBindParameter:Ошибка привязки параметра table-valued при использовании ODBC, C++

HY004 [Microsoft] [ODBC SQL Server Driver] Invalid 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. Если SQLBindParameter вызывается с параметром ParameterType, установленным в SQL_SS_TABLE, возвращается SQL_ERROR и создается диагностическая запись с SQLSTATE = HY004, «Недопустимый тип данных SQL». Это также может происходить с SQLSetDescField и SQLSetDescRec.

Но я пытаюсь связать элемент таблицы, а не столбцы таблицы. Это, по-видимому, прямо противоречит тому, что указано в их примерах кода. Я не уверен, почему эта ошибка возникает. Есть идеи?

Большое спасибо.

ответ

0

Уверены ли вы, что у 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); 
0

Вызов к SQLBindParameter также может завершиться с ошибкой «Invalid SQL типа данных», когда тип данных SQL, SQL_SS_TABLE в этом случае неизвестно к драйверу ODBC вы используете.

Вы можете проверить установленные драйверы ODBC и их версии, открыв ODBC Data Source Administrator под Драйверы вкладки:

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» драйвера по умолчанию для более поздней версии, либо с помощью более поздних версий операционной системы, скорее всего, решить эту проблему, так или не вызывать его в первую очередь.