Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PreparedStatement不适用于Java中的Sybase IQ_Java_Prepared Statement_Sap Iq - Fatal编程技术网

PreparedStatement不适用于Java中的Sybase IQ

PreparedStatement不适用于Java中的Sybase IQ,java,prepared-statement,sap-iq,Java,Prepared Statement,Sap Iq,我和我的团队面临一个问题。我们正在尝试从Sybase IQ数据库中检索一些数据,并使用where子句筛选并获取特定数据 SQL经过测试,工作正常,但在使用Prepared语句时失败 完成的测试: 如果我们运行查询(带或不带where子句参数),它可以正常工作 如果我们使用预先准备好的语句中硬编码的参数运行查询,它也可以正常工作 如果我们以编程方式设置prepared语句的参数,它将不起作用 上述测试确认JDBC连接工作正常 使用PreparedStatement、JdbcTemplate或Nam

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

SQL经过测试,工作正常,但在使用Prepared语句时失败

完成的测试

  • 如果我们运行查询(带或不带where子句参数),它可以正常工作
  • 如果我们使用预先准备好的语句中硬编码的参数运行查询,它也可以正常工作
  • 如果我们以编程方式设置prepared语句的参数,它将不起作用
  • 上述测试确认JDBC连接工作正常

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

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

    我在同一个问题上发现了非常相似的线程(),但是没有人提供一个公认的正确答案,所以我决定为此创建一个新问题

    使用的代码是:

    Class.forName(“com.sybase.jdbc4.jdbc.SybDriver”);
    PreparedStatement stmt=con.prepareStatement(“从myView中选择*,其中off=?和acc=?”;
    stmt.setString(1,“260”);
    标准设置管柱(2,“9050V”);
    ResultSet set=stmt.executeQuery();
    
    错误消息是:

    线程“main”java.sql.SQLException中的异常:JZ0SA:准备好的语句:未设置输入参数,索引:0。 位于com.sybase.jdbc4.jdbc.SybConnection.getAllExceptions(未知源) 位于com.sybase.jdbc4.jdbc.SybStatement.handleSQLE(未知源) 位于com.sybase.jdbc4.jdbc.SybStatement.sendQuery(未知源) 位于com.sybase.jdbc4.jdbc.SybPreparedStatement.sendQuery(未知源) 位于com.sybase.jdbc4.jdbc.SybStatement.executeQuery(未知源) 位于com.sybase.jdbc4.jdbc.SybPreparedStatement.executeQuery(未知源) 使用的JDBC驱动程序(Maven依赖项):

    
    com.sybase
    jconn4
    7
    
    stmt.setString(1,“260”); 标准设置管柱(2,“9050V”)


    数组索引以0开头否?在您使用的API中,它不是一个基于零的索引吗?

    我在sybase iq中遇到了同样的问题。 我在
    preparedStatement.execureQuery()语句之前添加了以下两行代码来解决这个问题

     preparedStatement.setFetchSize(Integer.MAX_VALUE);
     preparedStatement.setFetchDirection(ResultSet.FETCH_FORWARD);
    
    不确定这是否是正确的做法,但它起了作用

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

    我使用了jconn4连接属性LITERAL_PARAMS=true,效果很好。小心,性能会受到影响

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


    请添加execute语句。虽然JDBC驱动程序应该使用基于1的索引作为参数(JDBC规范要求),但您是否尝试过使用基于0的索引(因为错误消息也使用基于0的索引)?在任何情况下,您都应该使用完整的异常stacktrace更新问题,并指定Sybase驱动程序和Sybase服务器的完整版本。您使用哪个JDBC驱动程序进行连接?编辑问题。是的,我尝试过使用基于0的索引-ArrayOutOfBoundsException被抛出,因此肯定必须使用基于1的索引。从您发布的代码中:
    select*From view where off=?和acc=?
    view
    是数据库表吗?
    off
    acc
    的数据类型是什么?根据Java文档,PreparedStatement索引从1开始-这是答案吗?这应该是一个注释吗?这也解决了我在Sybase SQL Anywhere DB中遇到的问题