【问题标题】:JDBC error: java.sql.SQLException: Cannot submit empty queryJDBC 错误:java.sql.SQLException:无法提交空查询
【发布时间】:2016-10-27 06:23:59
【问题描述】:

我正在尝试使用 JDBC 并使用以下命令查询数据库

CallableStatement call_state =null;
call_state =con.prepareCall("UPDATE district SET d_next_o_id = ?+1 WHERE d_id = ? AND d_w_id = ?");
call_state.setInt(1, d_next_o_id);
call_state.setInt(2, d_id);
call_state.setInt(3, d_w_id);           
rs=call_state.executeQuery();`

我遇到异常:java.sql.SQLException: 无法提交空查询。

【问题讨论】:

  • 尝试使用PreparedStatement 而不是CallableStatement
  • 使用PreparedStatementPreparedStatement.executeUpdate()update 语句不返回 ResultSet
  • CallableStatement 用于调用过程和函数,而不是运行查询。听从之前cmets的建议,使用PreparedStatement

标签: sql jdbc


【解决方案1】:

虽然CallableStatement(CS)是“用于执行SQL存储过程的接口”,但它也是PreparedStatement的子接口。因此,任何遵循Liskov Substitution Principle 的CS 实现也应该能够执行正常的UPDATESELECTDELETE 操作(普通PreparedStatement 可以做的任何事情)。

您的代码的实际问题在于您提供的 sn-p 的最后一行;您在 UPDATE 语句上使用 executeQuery(),这是行不通的。相反,您应该使用execute()executeUpdate()。所以把那行改成

call_state.executeUpdate();

应该可以。

如果您想“正确”地执行此操作,您应该习惯使用 PreparedStatement 而不是 CallableStatement - 因为您没有调用任何存储过程。此外,您应该注意使用 try-with-resources statement 关闭资源:

try (PreparedStatement ps = con.prepareStatement(
        "UPDATE district SET d_next_o_id = ?+1 WHERE d_id = ? AND d_w_id = ?")) {
    ps.setInt(1, d_next_o_id);
    ps.setInt(2, d_id);
    ps.setInt(3, d_w_id);           
    ps.executeUpdate();
} catch (SQLException e) {
  // handle it
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2017-04-22
    • 2019-05-01
    • 2020-03-07
    • 2018-04-12
    • 2015-07-10
    相关资源
    最近更新 更多