我的应用程序在一个平台上使用 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 中找不到这两者。
当执行返回未知数量结果的查询时,您需要使用
execute(). 此方法返回一个boolean指示结果类型:true: 结果是ResultSetfalse: 结果是更新计数如果结果为
true,则使用getResultSet()检索ResultSet,否则getUpdateCount()检索更新计数。如果更新计数是,-1则意味着没有更多结果。请注意,更新计数也将-1是当前结果为 a 时ResultSet。知道getResultSet()如果没有更多结果或者结果是更新计数应该返回 null也很好,所以 SQL Lite 抛出异常的行为似乎是错误的。现在,如果您想检索更多结果,请调用
getMoreResults()(或它的兄弟接受int参数)。该boolean方法的返回值与 的含义相同execute(),false不代表没有结果!如果
getMoreResults()返回 false并getUpdateCount()返回,则不会有更多结果-1(也记录在 Javadoc 中)从本质上讲,这意味着如果您想正确处理所有结果,您需要执行以下操作: