准备好的语句因DB2 SQL错误而失败:SQLCODE:-401,SQLSTATE:42818

时间:2012-02-16 14:06:12

标签: java jdbc db2 prepared-statement

我正在开发一个通过JDBC更新数据库(IBM DB2 v 9.7)中的数据的应用程序。这是表模式:

列名数据类型长度

1)INDEX BIGINT -

2)USER_NAME VARCHAR 30

3)SRC VARCHAR 30

4)STATUS VARCHAR 150

5)RT_COUNT BIGINT -

我的代码如下:

                                      String cmd1="Update ANALYTICS  SET RT_COUNT = 1 WHERE USER_NAME = ? AND STATUS = ?";
                                     PreparedStatement process=connection.prepareStatement(cmd1);

                 process.setString(1, Source);
                 process.setString(2, Content);


                 if(process.executeUpdate()==0)
                 {....

但它失败了,任何人都可以帮助我吗?

谢谢和问候

2 个答案:

答案 0 :(得分:2)

根据IBM的网站,42818的SQLSTATE是42818“运营商或功能的操作数不相容或不具有可比性。”这意味着您将错误的数据类型设置为准备好的语句。

您可能需要退出RT_COUNT并执行setInt或setLong或其他操作才能使其正常工作。

另外,我假设源和内容是字符串?如果不是,那也可能有助于此。

修改 要做RT_COUNT事情,我在谈论你必须修改你的查询来执行以下操作:

String cmd1="Update ANALYTICS SET RT_COUNT = ? WHERE USER_NAME = ? AND STATUS = ?";
PreparedStatement process = connection.prepareStatement(cmd1);

process.setLong(1, new Long(1));
process.setString(2, source);
process.setString(3, content);

if(process.executeUpdate()==0)
{....

这可能实际上是你的问题,因为我不确定司机是如何解释“1”的。它需要很长才能映射到DB2中的bigint。请参阅what data types in Java map to what data types in DB2

答案 1 :(得分:2)

除了@Chris Aldrich在Java中进行强制转换的答案之外,如果你知道参数应该是什么类型,你也可以在SQL中强制转换它们,如下所示:

UPDATE ANALYTICS
   SET RT_COUNT  = CAST(? AS BIGINT)
 WHERE USER_NAME = CAST(? AS VARCHAR(30))
   AND STATUS    = CAST(? AS VARCHAR(150))