继承的方法execute查询不能在此子类中使用

时间:2019-05-02 03:19:42

标签: java sql jdbc sybase

复制一些进行更新的现有代码,以执行查询。

PreparedStatement pstmt2  = connection.prepareStatement(sql);              
pstmt2.executeUpdate();

成为

PreparedStatement pstmt2  = connection.prepareStatement(sql);              
pstmt2.executeQuery(sql);

执行代码时,收到此异常。我怀疑此异常仅由sybase产生。

2 个答案:

答案 0 :(得分:0)

贷记给专家交流以寻求指导-使用方法createStatement而不是prepareStatement。

SQL应该是: 语句pstmt2 = dbconn2.createStatement(); ResultSet结果= pstmt2.executeQuery(sql);

答案 1 :(得分:0)

引用Statement.executeQuery(String)的文档中的内容:

  

投掷
  SQLException-如果发生数据库访问错误,这   在给定的SQL语句的封闭Statement上调用方法   产生一个ResultSet对象,该方法在   PreparedStatementCallableStatement

换句话说,使用executeQuery(String)(或其他任何接受字符串的execute方法)是错误的,并且应该在所有JDBC兼容驱动程序中引发异常。因此,Sybase在这里抛出异常是正确的,也是预期的。

此要求是在JDBC 4.1(Java 7)中引入的,早期的JDBC规范并未明确包含此要求,尤其是MySQL(和iirc MariaDB)Connector / J不幸地仍然忽略了规范的这一部分。

您应该使用

try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
    // set parameters
    try (ResultSet rs = pstmt.executeQuery()) {
        // process result set
    }
}

或(如果未使用参数化语句):

try (Statement stmt = connection.createStatement();
     ResultSet rs = stmt.executeQuery(sql)) {
    // process result set
}