2015-05-22 34 views
2

我試圖在存儲過程中使用ODBC傳遞一個表值參數作爲參數。我按照從MSDN的例子,但是當我打電話收到以下錯誤的SQLBindParameter在使用ODBC時,綁定表值參數的錯誤C++

HY004 [微軟] [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中。

但我想綁定表項,而不是表列。這似乎與代碼示例中所述的內容直接矛盾。我不確定爲什麼發生此錯誤。有任何想法嗎?

非常感謝。

回答

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也可能會失敗,在這種情況下,「無效的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」驅動程序到更高版本或使用更高版本的操作系統將最有可能解決這一問題,以及是否導致它擺在首位。