Java SQL:Statement.hasResultSet()?

Dre*_*een 1 java sql sqlite jdbc resultset

我的应用程序在一个平台上使用MySQL而在另一个平台上使用SQLite,因此存在差异,例如在使用查询时DELETE FROM USERS:

  • MySQL上,PreparedStatement.getResultSet()将返回null.
  • SQLite上,PreparedStatement.getResultSet()将抛出java.sql.SQLException: no ResultSet available.

这可能是也可能不是SQLite实现中的错误(我认为它应该返回null),但我必须以某种方式处理它.

我可以使用a try { ... } catch (SQLException e) { ... },如果是异常消息"no ResultSet available",只需手动返回null.尽管如此,这并不是一种正确的方法.

我可以提出一个if,它会检查正在使用的JDBC驱动程序并做出相应的反应,但同样,这并不是解决问题的好方法.

我真正想要的是一个像.hasResultSet()这样的方法返回boolean ORSELECT, UPDATE, INSERT从一个已经执行的语句中获取SQL命令(等)的方法.我在SQL API中找不到这两个.

Mar*_*eel 5

执行返回未知数量结果的查询时,您需要使用execute().此方法返回boolean指示结果类型:

  • true:结果是一个 ResultSet
  • false :结果是更新计数

如果结果是true,则getResultSet()用于检索ResultSet,否则getUpdateCount()检索更新计数.如果更新计数,-1则意味着没有更多结果.请注意,更新计数也将-1是当前结果为a时ResultSet.getResultSet()如果没有更多结果或者结果是更新计数,那么应该返回null 也是一件好事,因此SQL Lite抛出异常的行为似乎是错误的.

现在,如果您想要检索更多结果,请调用getMoreResults()(或其兄弟接受int参数).boolean此方法的返回值与其含义相同execute(),因此false并不意味着没有更多结果!

如果getMoreResults()返回false getUpdateCount()返回,则只有没有更多结果-1(也在Javadoc中记录)

从本质上讲,这意味着如果您想要正确处理所有结果,您需要执行以下操作:

PreparedStatement pstmt = connection.prepareStatement(...);
// ...
boolean result = pstmt.execute();
while(true)
    if (result) {
        ResultSet rs = pstmt.getResultSet();
        // Do something with resultset ...
    } else {
        int updateCount = pstmt.getUpdateCount();
        if (updateCount == -1) {
            // no more results
            break;
        }
        // Do something with update count ...
    }
    result = pstmt.getMoreResults();
}
Run Code Online (Sandbox Code Playgroud)