2008-12-03 9 views
3

J'ai un insert dans une table utilisant ODBC 3.0 sur Oracle 10g qui échoue et je ne sais pas pourquoi. La base de données est sur Windows Server 2003. Le client est sur Windows XP.La liaison int64 (SQL_BIGINT) en tant que paramètre de requête provoque une erreur lors de l'exécution dans Oracle 10g ODBC

Le tableau:

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

Les appels 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 réussit mais SQLExecute échoue. Il n'y a pas de message de diagnostic.

J'ai dû utiliser l'int64 pour écrire une chaîne et la lier en tant que chaîne. Est-ce la seule façon de lier un int64?

+0

Je reçois un échec similaire lors de l'extraction de données à partir d'une instruction select avec une variable SQL_C_SBIGINT liée. Le message d'erreur est plus descriptif, mais pas très utile: SQLSTATE = HY004, "Type de données SQL non valide". –

+0

Je reçois aussi HY004, avec le pilote ODBC 11.2 d'Oracle. Va essayer les chaînes ... argh ... – bneal

Répondre

4

Le Guide de l'administrateur Oracle 10g dans Appendix G.1 dit que le pilote ODBC Oracle 10g ne prend pas en charge soit SQL_C_SBIGINT ou SQL_C_UBIGINT.

Comme vous, nous constatons également que lors de l'exécution, le SQLExecute() échoue. Et un appel à SQLGetDiagRec() ne renvoie rien, plutôt qu'un simple message comme "Oracle 10g does not support SQL_C_SBIGINT",. Grr ....

Quoi qu'il en soit, l'annexe G.1 ne dit pas comment vous devez données se lient à envoyer dans une table avec une colonne définie comme NUMBER(20). Donc nous devons tous deviner, et utiliser n'importe quelle technique (non documentée) fonctionne. Ce serait bien si l'appendice G.1 donnait une sorte d'indice ou de suggestion quant au «meilleur» moyen.

Si vous convertissez le nombre en une chaîne et que la liaison fonctionne pour vous, respectez cette règle.

+0

+1 par pitié pour cette omission misérable dans SQLGetDiagRec(). – pilcrow

Questions connexes