sqlite Java SQL:Statement.hasResultSet()?

t5fffqht  于 2023-04-21  发布在  SQLite
关注(0)|答案(2)|浏览(150)

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

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

这可能是SQLite实现中的一个bug(我认为它应该返回null),但我必须以某种方式处理这个问题。
我可以使用一个try { ... } catch (SQLException e) { ... },如果异常消息是"no ResultSet available",简单地手动返回null。
我可以设置一个if,它检查正在使用的JDBC驱动程序并做出相应的React,但同样,这似乎不是问题的好解决方案。
我真正想要的是一个像.hasResultSet()这样的方法,它返回一个boolean *,或者 * 一种从已经执行的语句中获取SQL命令(SELECT, UPDATE, INSERT等)的方法。I can find neither of the two in SQL API though.

ajsxfq5m

ajsxfq5m1#

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

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

如果结果是true,则使用getResultSet()检索ResultSet,否则使用getUpdateCount()检索更新计数。如果更新计数为-1,则表示没有更多结果。请注意,当当前结果为ResultSet时,更新计数也将为-1。如果没有更多的结果或者结果是一个更新计数,getResultSet()应该返回null,所以SQL Lite抛出异常的行为似乎是错误的。
现在,如果你想检索更多的结果,你可以调用getMoreResults()(或者它的兄弟接受一个int参数)。这个方法的boolean返回值与execute()的返回值具有相同的含义,所以false并不意味着没有更多的结果!
只有当getMoreResults()返回falsegetUpdateCount()返回-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();
}
khbbv19g

khbbv19g2#

问题是您使用了无效的方法来执行删除操作。您应该使用Statement#execute(String)而不是getResultSet
恕我直言,SQLite实现中的Exeption对于MySQL来说比null更有效。因为delete不返回集合,而是返回增量行的标量值。

相关问题