我正在使用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的问题。
答案 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()
函数有多长。