我的应用程序在一个平台上使用MySQL,而在另一个平台上使用SQLite,因此存在差异,例如使用以下查询时DELETE FROM USERS:
DELETE FROM USERS
PreparedStatement.getResultSet()
null
java.sql.SQLException: no ResultSet available
这可能不是SQLite实现中的错误(我认为应该返回null),但是我必须以某种方式处理它。
我可以使用a try { ... } catch (SQLException e) { ... },如果异常消息为"no ResultSet available",则只需手动返回null即可。但是,这感觉不是正确的方法。
try { ... } catch (SQLException e) { ... }
"no ResultSet available"
我可以提出一个if来检查正在使用的JDBC驱动程序并做出相应的反应,但是同样,这也不是解决问题的好方法。
我真正想要的是一个.hasResultSet()返回boolean OR 的方法, 或者 是一种SELECT, UPDATE, INSERT从已执行的语句中获取SQL命令(等)的方法。我在SQL API中找不到这两者。
.hasResultSet()
boolean
SELECT, UPDATE, INSERT
当执行返回未知数量结果的查询时,则需要使用execute()。此方法返回一个boolean指示结果类型的:
execute()
true
ResultSet
false
如果结果为true,则可使用getResultSet()来检索ResultSet,否则getUpdateCount()可使用以获取更新计数。如果是更新计数,-1则意味着没有更多结果。请注意,更新计数也将-1是当前结果为时的计数ResultSet。最好知道,getResultSet()如果没有更多结果或者结果是更新计数,则应返回null,因此SQL Lite引发异常的行为似乎是错误的。
getResultSet()
getUpdateCount()
-1
现在,如果要检索更多结果,请致电getMoreResults()(或它的兄弟接受int参数)。boolean此方法的返回值与的含义相同execute(),因此false并不意味着不再有结果!
getMoreResults()
int
如果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(); }