可以将长度超过255个字节的字符串用作ODBC预处理语句参数值吗?

时间:2011-02-03 09:01:21

标签: c++ mysql odbc prepared-statement unixodbc

我正在使用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值,因此它不是MySql DB的问题。

2 个答案:

答案 0 :(得分:2)

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

但是(再次),为了先插入一行然后以流方式更新一些列,可能必须得到最后一个插入ID,这结果是另一个挑战,我再次无法解决现在...

答案 1 :(得分:1)

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

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