在DB2 Express-C上执行PreparedStatement时出错

时间:2011-02-22 10:51:05

标签: java db2

在通过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执行此操作。

提前致谢。

4 个答案:

答案 0 :(得分:2)

您可能希望将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中提到过。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

来自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个字符。所以只需在查询数据库之前检查它。

答案 3 :(得分:0)

我们正在使用DB2 9.7.x,现在我遇到了同样的问题,并发现这与设置DB2 JDBC连接参数" deferPrepares"相关。到"假"。

如果您设置" deferPrepares"到"真"或者从连接字符串中省略参数,然后PreparedStatement执行时没有错误。仅当通过" ="比较字符串列时才会发生这种情况。或"<>"。如果您将列与"比较"进行比较,那么就没有错误。

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

不幸的是我们已经将deferPrepares设置为false来解决Hibernate到Smallint列映射的布尔字段的另一个问题。至少在DB2 JDBC驱动程序版本9.7修订包8中修复了此问题(请参阅http://www-01.ibm.com/support/docview.wss?uid=swg21415236处的APAR编号IC88582)。

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