2

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

4

2 回答 2

6

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

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

如果结果是true,则使用getResultSet()检索ResultSet,否则getUpdateCount()检索更新计数。如果更新计数是-1,则意味着没有更多结果。请注意,更新计数也将-1是当前结果为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();
}
于 2013-01-19T09:59:04.400 回答
2

问题是您使用无效的方法来执行删除操作。而不是使用getResultSet你应该使用Statement#execute(String)

恕我直言,SQLite 实现中的 Exeption 对于 MySQL 来说比 null 更有效。delete不返回集合,而是返回删除行的标量值。

于 2013-01-08T11:36:58.110 回答