我和我的团队遇到了一个问题。我们正在尝试从Sybase IQ数据库中检索一些数据,并使用where
子句过滤出并获取特定数据。
该SQL已通过测试,可以正常工作,但是在使用Prepared Statement时失败。
已完成测试:
以上测试确认JDBC连接正常。
当使用PreparedStatement,JdbcTemplate或NamedParameterJdbcTemplate时,会出现相同的错误,因此我怀疑PreparedStatement和Sybase IQ之间可能存在问题。
有人可以帮助调查吗?我们已经找到了解决方法,但是知道为什么它不起作用将非常有用。
我在同一问题上发现了非常相似的线索(How do I execute PreparedStatement(select object_id()) in sybase iq?),但是没人在那里提供可接受的正确答案,因此我决定为此提出一个新问题。
使用的代码是:
Class.forName("com.sybase.jdbc4.jdbc.SybDriver");
PreparedStatement stmt = con.prepareStatement("select * from myView where off = ? and acc = ?");
stmt.setString(1, "260");
stmt.setString(2, "9050V");
ResultSet set = stmt.executeQuery();
错误消息是:
Exception in thread "main" java.sql.SQLException: JZ0SA: Prepared Statement: Input parameter not set, index: 0.
at com.sybase.jdbc4.jdbc.SybConnection.getAllExceptions(Unknown Source)
at com.sybase.jdbc4.jdbc.SybStatement.handleSQLE(Unknown Source)
at com.sybase.jdbc4.jdbc.SybStatement.sendQuery(Unknown Source)
at com.sybase.jdbc4.jdbc.SybPreparedStatement.sendQuery(Unknown Source)
at com.sybase.jdbc4.jdbc.SybStatement.executeQuery(Unknown Source)
at com.sybase.jdbc4.jdbc.SybPreparedStatement.executeQuery(Unknown Source)
使用的JDBC驱动程序(Maven依赖项):
<dependency>
<groupId>com.sybase</groupId>
<artifactId>jconn4</artifactId>
<version>7.0</version>
</dependency>
答案 0 :(得分:1)
我在使用sybase iq时遇到了同样的问题。
在preparedStatement.execureQuery()
语句之前,我添加了以下两行代码来解决此问题。
preparedStatement.setFetchSize(Integer.MAX_VALUE);
preparedStatement.setFetchDirection(ResultSet.FETCH_FORWARD);
不确定这样做是否正确,但确实有效。
OR
您可以设置
preparedStatement.setCursorName("SomeCursorName");
这也解决了问题。
但是在多线程环境中,您需要设置唯一的游标名称。可能使用的是随机数或其他内容,并且不会创建过多的游标,将它们限制为可以同时执行的并发线程数。
答案 1 :(得分:0)
stmt.setString(1,“ 260”); stmt.setString(2,“ 9050V”);
数组索引以0开头吗?是不是在您使用的API中从零开始的索引编制?
答案 2 :(得分:0)
我使用了jconn4连接属性LITERAL_PARAMS = true,并且工作正常。注意,性能会受到影响。
设置为“ true”时,在执行时,在PreparedStatement接口中由setXXX方法设置的任何参数都将按字面插入SQL语句中。如果设置为“ false”,则将参数标记保留在SQL语句中,并将参数值分别发送到服务器。