为了账号安全,请及时绑定邮箱和手机立即绑定

PreparedStatement 不适用于 Java 中的 Sybase IQ

PreparedStatement 不适用于 Java 中的 Sybase IQ

MMTTMM 2022-12-21 15:08:06
我和我的团队遇到了一个问题。我们试图从 Sybase IQ 数据库中检索一些数据,并使用where子句过滤掉并获取特定数据。SQL 已经过测试并且工作正常,但在使用准备语句时失败。测试完成:如果我们运行查询(有或没有 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>
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我遇到了与 sybase iq 相同的问题。preparedStatement.execureQuery()我在声明之前添加了以下两行代码来解决问题。


 preparedStatement.setFetchSize(Integer.MAX_VALUE);

 preparedStatement.setFetchDirection(ResultSet.FETCH_FORWARD);

不确定这样做是否正确,但它奏效了。


要么


你可以设置 preparedStatement.setCursorName("SomeCursorName"); 这个也解决了这个问题。但在多线程环境中,您需要设置一个唯一的游标名称。可能正在使用随机数或其他东西并且不要创建太多游标将它们限制为将同时执行的并发线程数。


查看完整回答
反对 回复 2022-12-21
?
慕标5832272

TA贡献1966条经验 获得超4个赞

我使用了 jconn4 连接属性 LITERAL_PARAMS=true 并且工作正常。小心,性能会受到影响。

当设置为“true”时,由 PreparedStatement 接口中的 setXXX 方法设置的任何参数都会在 SQL 语句执行时逐字插入。如果设置为“false”,则参数标记将保留在 SQL 语句中,并将参数值单独发送到服务器。


查看完整回答
反对 回复 2022-12-21
?
MM们

TA贡献1886条经验 获得超2个赞

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

数组索引从 0 开始不是吗?在您使用的 API 中,它不是基于零的索引吗?


查看完整回答
反对 回复 2022-12-21
  • 3 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信