首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PreparedStatement不适用于Java中的Sybase IQ

PreparedStatement不适用于Java中的Sybase IQ
EN

Stack Overflow用户
提问于 2019-05-28 08:02:01
回答 3查看 1.4K关注 0票数 3

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

SQL经过测试,运行良好,但在使用预准备语句时失败。

测试完成

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

上面的测试证实了JDBC连接工作正常。

在使用PreparedStatement、JdbcTemplate或NamedParameterJdbcTemplate时也会出现同样的错误,因此我怀疑PreparedStatement和Sybase IQ之间可能存在问题。

有人能帮我调查一下吗?我们已经找到了解决这个问题的办法,但是知道为什么这个方法不起作用是非常有用的。

我发现了关于同一个问题的非常相似的线程(id()) in sybase iq?),但是没有人在那里提供一个被接受和正确的答案,所以我决定为此创建一个新的问题。

使用的代码是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();

错误消息是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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依赖项):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>com.sybase</groupId>
            <artifactId>jconn4</artifactId>
            <version>7.0</version>
</dependency>
EN

回答 3

Stack Overflow用户

发布于 2020-02-21 00:46:51

我和sybase iq也面临着同样的问题。为了解决这个问题,我在preparedStatement.execureQuery()语句之前添加了以下两行代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 preparedStatement.setFetchSize(Integer.MAX_VALUE);
 preparedStatement.setFetchDirection(ResultSet.FETCH_FORWARD);

不确定这是否是正确的做法,但它成功了。

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

票数 1
EN

Stack Overflow用户

发布于 2020-09-01 06:50:37

我使用了jconn4连接属性LITERAL_PARAMS=true,它工作得很好。小心,性能应该受到影响。

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

票数 1
EN

Stack Overflow用户

发布于 2019-05-30 06:11:56

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56346146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文