1

我正在使用libodbc++C++ 的 ODBC 包装器,其设计类似于 JDBC。我有一个准备好的声明"INSERT INTO t1 (col1) VALUES (?)",其中t1.col1定义为VARCHAR(500).

当我调用时statement->setString(1, s), 的值s被截断为255。我怀疑 libodbc++ 库,但由于我对 ODBC 不是很熟悉,我想确保包装器不只是暴露底层 ODBC 的限制。ODBC API 参考太复杂了,无法快速浏览,坦率地说我真的不想这样做,所以请原谅我问了一个基本问题。

注意:通过同一个库的未准备和未参数化的insert语句会插入一个 long 值 ok,因此这不是 MySql DB 的问题。

4

2 回答 2

2

对于长字符串,请使用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.

但是(再次),为了先插入一行,然后以流方式更新一些列,可能必须获取最后一个插入 id,结果证明这是另一个挑战,我现在再次未能正面解决...... .

于 2014-03-19T14:58:11.900 回答
1

我不知道libodbc++,但通过 ODBC API 可用的 PreparedStatements 可以存储更多字符。我将它与 Delphi/Kylix ODBC 包装器一起使用。

也许有一些配置libodbc++来设置值长度限制?我的 Delphi 库中有这样的设置。如果您使用 PreparedStatement,那么您可以分配大块内存,将其划分为字段并显示 ODBC,每列的块从哪里开始,以及它通过SQLBindParameter()函数多长时间。

于 2011-02-04T07:24:22.260 回答