можно ли использовать строку длиннее 255 байт в качестве значения параметра подготовленного оператора ODBC?

Я использую оболочку libodbc++ ODBC для C++, разработанную аналогично JDBC. У меня есть подготовленный оператор "INSERT INTO t1 (col1) VALUES (?)", где t1.col1 определяется как VARCHAR(500).

Когда я вызываю statement->setString(1, s), значение s усекается до 255. Я подозреваю библиотеку libodbc++, но, поскольку я не очень хорошо знаком с ODBC, я хотел бы быть уверенным, что оболочка не просто выставляет ограничение базового ODBC. Справочник по API ODBC слишком сложен, чтобы его можно было быстро просмотреть, и, честно говоря, я действительно не хочу этого делать, поэтому извините меня за простой вопрос.

ПРИМЕЧАНИЕ. Неподготовленный и непараметризованный оператор insert через ту же библиотеку вставляет длинное значение ok, поэтому это не проблема базы данных MySql.


person davka    schedule 03.02.2011    source источник


Ответы (2)


Я не знаю libodbc++, но PreparedStatements, доступные через ODBC API, могут хранить больше символов. Я использую его с оболочкой Delphi/Kylix ODBC.

Может быть, в libodbc++ есть какая-то конфигурация для установки ограничения длины значения? У меня есть такая настройка в моей библиотеке Delphi. Если вы используете PreparedStatement, то вы можете выделить большой кусок памяти, разделить его на поля и показать ODBC, где начинается блок для каждого столбца и какова его длина с помощью функции SQLBindParameter().

person Michał Niklas    schedule 04.02.2011
comment
Тода, Михал. Проблема в том, что документация libodbc++ довольно минималистична и устарела. Я думаю, что правильное решение для меня - перейти на коннектор mysql/C++ - у него очень похожий интерфейс. - person davka; 04.02.2011
comment
Вы можете найти SQLBindParameter в libodbc++ источниках и посмотреть, какие параметры он использует. Может быть, там вы заметите какой-то предел. Затем найдите способ сделать его переменным (255 может быть значением по умолчанию). - person Michał Niklas; 04.02.2011

Для длинной строки используйте PreparedStatement::setAsciiStream() вместо PreparedStatement::setString().

Но при использовании потока я часто сталкиваюсь с ошибкой «HY104 Invalid Precision Value», которая раздражает, потому что я понятия не имею, как с ней справиться, однако я обхожу ее следующими шагами:

1, order the columns in SQL statement, non-stream columns go first;

2, if that doesn't work, split the statement to multiple ones, update or query a single column per statement.

Но (опять же), чтобы сначала вставить строку, а затем обновить некоторые столбцы в потоковом режиме, может потребоваться получить последний идентификатор вставки, что оказывается еще одной проблемой, с которой я снова не смог справиться. .

person Zhiyong    schedule 19.03.2014