我和我的团队面临一个问题。我们正在尝试从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/