2008-12-03 42 views
3

我已經在Oracle 10g上使用ODBC 3.0插入表,並且我不知道爲什麼。數據庫位於Windows Server 2003上。客戶端位於Windows XP上。在Oracle 10g中執行綁定int64(SQL_BIGINT)會導致錯誤ODBC

表:

CREATE TABLE test (testcol NUMBER(20,0) NULL); 

的ODBC電話:

SQLAllocHandle(SQL_HANDLE_STMT) = SQL_SUCCESS 
SQLPrepare(INSERT INTO test (testcol) VALUES (?);) = SQL_SUCCESS 

SQLINTEGER nStrLen = 0; 
__int64 nInt64 = 99; 
SQLBindParameter(hStatement, 1, SQL_PARAM_INPUT, 
    SQL_C_SBIGINT, SQL_BIGINT, 20, 0, &nInt64, 0, &nStrLen) = SQL_SUCCESS 

SQLExecute() = SQL_ERROR 
SQLGetDiagRec(1) = SQL_NO_DATA 

SQLBindParameter成功,但隨後SQLExecute失敗。沒有診斷信息。

我不得不求助於將int64寫入字符串並將其作爲字符串進行綁定。這是綁定int64的唯一方法嗎?

+0

從綁定SQL_C_SBIGINT變量的select語句中獲取數據時,我遇到了類似的失敗。該錯誤消息更具描述性,但仍不很有用:SQLSTATE = HY004,「無效的SQL數據類型」。 – 2010-07-15 17:19:54

+0

我得到HY004以及Oracle的11.2 ODBC驅動程序。將嘗試字符串... argh ... – bneal 2011-01-20 23:23:47

回答

4

的Oracle 10g的管理員指南在Appendix G.1說,Oracle 10g的ODBC驅動程序不支持要麼SQL_C_SBIGINTSQL_C_UBIGINT

和你一樣,我們也發現在運行時SQLExecute()失敗。對SQLGetDiagRec()的呼叫不會返回任何內容,而不會返回像"Oracle 10g does not support SQL_C_SBIGINT"這樣的簡單消息。 GRR ....

無論如何,附錄G.1不說你怎麼應該綁定數據發送到一個表像NUMBER(20)定義的列。所以我們都必須猜測,並使用任何(無證)技術。如果附錄G.1給出了某種關於「最佳」方式的暗示或建議,那將是很好的。

如果將數字轉換爲字符串,然後綁定適用於您,請堅持。