小编典典

Java SQL:Statement.hasResultSet()?

java

我的应用程序在一个平台上使用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 OR 的方法, 或者 是一种SELECT, UPDATE, INSERT从已执行的语句中获取SQL命令(等)的方法。我在SQL
API中找不到这两者。


阅读 222

收藏
2020-09-23

共1个答案

小编典典

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

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

如果结果为true,则可使用getResultSet()来检索ResultSet,否则getUpdateCount()可使用以获取更新计数。如果是更新计数,-1则意味着没有更多结果。请注意,更新计数也将-1是当前结果为时的计数ResultSet。最好知道,getResultSet()如果没有更多结果或者结果是更新计数,则应返回null,因此SQL
Lite引发异常的行为似乎是错误的。

现在,如果要检索更多结果,请致电getMoreResults()(或它的兄弟接受int参数)。boolean此方法的返回值与的含义相同execute(),因此false并不意味着不再有结果!

如果getMoreResults()返回false getUpdateCount() return -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();
}
2020-09-23