Привязка int64 (SQL_BIGINT) в качестве параметра запроса вызывает ошибку во время выполнения в Oracle 10g ODBC - PullRequest
3 голосов
/ 03 декабря 2008

У меня есть вставка в таблицу с использованием ODBC 3.0 в Oracle 10g, которая не работает, и я понятия не имею, почему. База данных находится на Windows Server 2003. Клиент находится на Windows XP.

Таблица:

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?

1 Ответ

4 голосов
/ 15 апреля 2009

В Руководстве администратора Oracle 10g в Приложении G.1 говорится, что драйвер Oracle 10g ODBC не поддерживает * SQL_C_SBIGINT или SQL_C_UBIGINT.

Как и вы, мы также обнаруживаем, что во время выполнения SQLExecute() дает сбой. И вызов SQLGetDiagRec() ничего не возвращает, а простое сообщение типа "Oracle 10g does not support SQL_C_SBIGINT",. Grr ....

В любом случае, в Приложении G.1 не указано, как следует связать данные для отправки в таблицу со столбцом, определенным как NUMBER(20). Таким образом, мы все должны угадывать и использовать любую (недокументированную) технику. Было бы неплохо, если бы в Приложении G.1 был какой-то намек или предложение относительно «лучшего» пути.

Если преобразование числа в строку, а затем связывание работает для вас, придерживайтесь этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...