通过 DB2 Express-C 执行 PreparedStatement 时出错

Posted

技术标签:

【中文标题】通过 DB2 Express-C 执行 PreparedStatement 时出错【英文标题】:error in Executing PreparedStatement over DB2 Express-C 【发布时间】:2011-02-22 10:51:04 【问题描述】:

通过 Statement 对象执行查询时,工作正常,但通过 PreparedStatement 对象执行相同的查询会引发 SQL 异常。

这个查询工作正常...

 String query = "SELECT A, B, C, D, LOBJ FROM TABLE WHERE LOBJ = 'sGMMEMDEML2';

Statement stmt = con.createStatement()

ResultSet rs = stmt.executeQuery(query);

此查询引发 sql 异常(DB2 SQL 错误:SQLCODE=-302,SQLSTATE=22001,SQLERRMC=null)...

String query = "SELECT A, B, C, D, LOBJ FROM TABLE WHERE LOBJ = ?;

PreparedStatement preStmt = con.prepareStatement(query);

preStmt.setString(1, 'sGMMEMDEML2');

ResultSet rs = preStmt.executeQuery();

视图 TABLE 中的 LOBJ 列长 10 个字符,但由于应用程序的某些限制,它在 where 子句中的指定值可能是也可能不是 10 个字符长。

谁能帮助我,如何使用 PreparedStatement 执行此操作。

提前致谢。

【问题讨论】:

这个问题出现在我可以访问的一些但不是所有的 DB2 安装上。例如,它出现在:DB2 v9.7 Linux64、v9.7.3 Linux64、v9.7.3+FP4 (=9.7.4?) Linux64 而未在:DB2 C-express 9.7.4 Linux64/Windows64、DB2 v9 上观察到。 7.4 Windows64。 【参考方案1】:

您可能希望打开 DB2 与 Oracle 或 mysql 的兼容性(在 DB2 命令行中运行这些命令):

db2set DB2_COMPATIBILITY_VECTOR=ORA # or MYS
db2stop
db2start

但是请注意,这只会影响新创建的数据库(至少有一些 DB2_COMPATIBILITY_VECTOR 影响)。有关详细信息,请咨询DB2 documentation(但请注意,MYS 的事情没有很好地记录,但至少在C-Express 9.7.4 release notes 中提到过。

【讨论】:

【参考方案2】:

尝试打印准备好的语句并对数据库运行查询。

【讨论】:

【参考方案3】:

来自 IBM DB2 错误代码:

SQLCODE=-302

THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS INVALID OR TOO LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE

正如您所说,LOBJ 的长度为 10 个字符,并且在您的查询中

preStmt.setString(1, 'sGMMEMDEML2');

您的输入字符串长度为 11 个字符。因此,只需在查询数据库之前检查它即可。

【讨论】:

Vikas,我同意你的回答,但为什么语句对象正在执行相同的查询而不抛出任何异常?执行语句和PreparedStatement有什么内部区别??【参考方案4】:

我们使用的是 DB2 9.7.x,我现在遇到了同样的问题,发现这与将 DB2 JDBC 连接参数“deferPrepares”设置为“false”有关。

如果您将“deferPrepares”设置为“true”或从连接字符串中省略参数,则 PreparedStatement 执行时不会出错。仅当通过“=”或“”比较字符串列时才会发生这种情况。如果按“like”比较列,则没有错误。

我认为这种行为是一个主要错误,因为它偏离了任何 SQL 命令窗口中显示的行为。

不幸的是,我们将 deferPrepares 设置为 false 以解决 Hibernate 映射到 Smallint 列的布尔字段的另一个问题。这个问题至少在 DB2 JDBC Drivers Version 9.7 Fix Pack 8 中得到修复(参见 APAR 编号 IC88582,http://www-01.ibm.com/support/docview.wss?uid=swg21415236)。

所以我的建议是将 deferPrepares 设置为 true 并使用 Fix Pack 8 或更高版本的 JDBC 驱动程序。

【讨论】:

以上是关于通过 DB2 Express-C 执行 PreparedStatement 时出错的主要内容,如果未能解决你的问题,请参考以下文章

CentOS mini 6.5 安装DB2 Express-C 问题处理记录

Oracle连接Db2

通过 DB2OLEDB 执行存储过程时收到 -379 的 SQLCode

通过 db2-luw 上的 xmlquery 使用正则表达式执行更新语句时出现 SQL 错误

异步选择 db2

如何在 DB2 中执行 SQL 匿名块?