我和我的团队面临一个问题。我们试图从Sybase IQ数据库中检索一些数据,并使用where
子句过滤并获取特定数据。
SQL经过测试,运行良好,但在使用预准备语句时失败。
测试完成
上面的测试证实了JDBC连接工作正常。
在使用PreparedStatement、JdbcTemplate或NamedParameterJdbcTemplate时也会出现同样的错误,因此我怀疑PreparedStatement和Sybase IQ之间可能存在问题。
有人能帮我调查一下吗?我们已经找到了解决这个问题的办法,但是知道为什么这个方法不起作用是非常有用的。
我发现了关于同一个问题的非常相似的线程(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>
发布于 2020-02-21 00:46:51
我和sybase iq也面临着同样的问题。为了解决这个问题,我在preparedStatement.execureQuery()
语句之前添加了以下两行代码。
preparedStatement.setFetchSize(Integer.MAX_VALUE);
preparedStatement.setFetchDirection(ResultSet.FETCH_FORWARD);
不确定这是否是正确的做法,但它成功了。
或
您可以设置preparedStatement.setCursorName("SomeCursorName");
,这也解决了问题。但是,在多线程环境中,需要设置唯一的游标名。可能使用的是随机数或其他东西,而不创建太多游标,将其限制为同时执行的并发线程数。
发布于 2020-09-01 06:50:37
我使用了jconn4连接属性LITERAL_PARAMS=true,它工作得很好。小心,性能应该受到影响。
当设置为“true”时,setXXX方法在PreparedStatement接口中设置的任何参数在执行时都会按字面顺序插入到SQL语句中。如果设置为“false”,则将参数标记留在SQL语句中,并将参数值分别发送到服务器。
发布于 2019-05-30 06:11:56
stmt.setString(1,"260");stmt.setString(2,9050 V);
数组索引从0开始,否?它不是使用的API中基于零的索引吗?
https://stackoverflow.com/questions/56346146
复制相似问题