PreparedStatement不适用于Java中的Sybase IQ

时间:2019-05-28 16:02:02

标签: java prepared-statement sybase-iq

我和我的团队遇到了一个问题。我们正在尝试从Sybase IQ数据库中检索一些数据,并使用where子句过滤出并获取特定数据。

该SQL已通过测试,可以正常工作,但是在使用Prepared Statement时失败。

已完成测试

  1. 如果我们运行查询(带有或不带有where子句参数),则运行良好。
  2. 如果我们使用在“ Prepared Statement”中硬编码的参数运行查询,它也可以正常工作。
  3. 如果我们以编程方式设置准备好的语句的参数,它将无法正常工作。

以上测试确认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>

3 个答案:

答案 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语句中,并将参数值分别发送到服务器。