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

Java 准备好的语句失败,DB2 SQL错误:SQLCODE:-401,SQLSTATE:42818,java,jdbc,db2,prepared-statement,Java,Jdbc,Db2,Prepared Statement,我正在开发一个通过JDBC更新数据库(IBMDB2V9.7)中数据的应用程序。以下是表架构: 列名数据类型长度 1) 索引BIGINT- 2) 用户名VARCHAR 30 3) SRC VARCHAR 30 4) 状态VARCHAR 150 5) RT_计数BIGINT- 我的代码是: String cmd1="Update ANALYTICS SET RT_COUNT = 1 WHERE USER_NAME = ?

我正在开发一个通过JDBC更新数据库(IBMDB2V9.7)中数据的应用程序。以下是表架构:

列名数据类型长度

1) 索引BIGINT-

2) 用户名VARCHAR 30

3) SRC VARCHAR 30

4) 状态VARCHAR 150

5) RT_计数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)
                 {....
但是失败了,有人能帮我吗


感谢并问候

根据IBM的网站,42818的SQLSTATE是42818“运算符或函数的操作数不兼容或不可比较”。这意味着您为准备好的语句设置了错误的数据类型

您可能需要将RT_计数带出来,然后执行setInt或setLong或其他操作以使其正常工作

另外,我假设源和内容是字符串?如果不是,这也可能是原因之一

编辑 要执行我所说的RT_计数,您必须修改查询以执行以下操作:

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需要很长的时间。看看吧

根据IBM的网站,42818的SQLSTATE是42818“运算符或函数的操作数不兼容或不可比较”。这意味着您为准备好的语句设置了错误的数据类型

您可能需要将RT_计数带出来,然后执行setInt或setLong或其他操作以使其正常工作

另外,我假设源和内容是字符串?如果不是,这也可能是原因之一

编辑 要执行我所说的RT_计数,您必须修改查询以执行以下操作:

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需要很长的时间。看看吧

除了@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))

除了@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))

请提供您正在执行的语句(即,cmd1),因为这是解决此问题的关键。在字符串cmd1中,我将其称为RT_计数和用户名,因此这不是错误。请提供您正在执行的语句(即,cmd1),因为这是解决此问题的关键。在字符串cmd1中,我提到它是RT_计数和用户名,所以这不是一个错误。仅供参考,这里是网站的链接,其中包含消息:是的,它们是字符串。你能告诉我RT_计数的事情吗?谢谢你的链接。但是没有帮助,已经检查过了:-如果你用样本值手动执行查询是否有效?仅供参考,这是网站的链接,上面有消息:是的,它们是字符串。你能告诉我RT_计数的事情吗?谢谢你的链接。但是没有帮助,已经检查过了:-如果你用样本值手动执行查询,查询是否有效?