можно ли использовать строку длиной более 255 байтов в качестве подготовленного ODBC параметра параметра оператора? - PullRequest
1 голос
/ 03 февраля 2011

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

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

Ответы [ 2 ]

2 голосов
/ 19 марта 2014

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

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

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.

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

1 голос
/ 04 февраля 2011

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

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

...