Dre*_*een 1 java sql sqlite jdbc resultset
我的应用程序在一个平台上使用MySQL而在另一个平台上使用SQLite,因此存在差异,例如在使用查询时DELETE FROM USERS:
PreparedStatement.getResultSet()将返回null.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中找不到这两个.
执行返回未知数量结果的查询时,您需要使用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中记录)
从本质上讲,这意味着如果您想要正确处理所有结果,您需要执行以下操作:
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)