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

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

完成的测试:


如果我们运行查询(带有或不带有where子句参数),它将正常工作。
如果我们使用在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>

最佳答案

stmt.setString(1,“ 260”);
stmt.setString(2,“ 9050V”);

数组索引以0开头吗?您使用的API中不是基于零的索引吗?

关于java - PreparedStatement不适用于Java中的Sybase IQ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56346146/

10-11 02:35