我的应用程序在一个平台上使用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
OR 的方法, 或者 是一种SELECT, UPDATE, INSERT
从已执行的语句中获取SQL命令(等)的方法。我在SQL
API中找不到这两者。
当执行返回未知数量结果的查询时,则需要使用execute()
。此方法返回一个boolean
指示结果类型的:
true
:结果是 ResultSet
false
:结果是更新计数如果结果为true
,则可使用getResultSet()
来检索ResultSet
,否则getUpdateCount()
可使用以获取更新计数。如果是更新计数,-1
则意味着没有更多结果。请注意,更新计数也将-1
是当前结果为时的计数ResultSet
。最好知道,getResultSet()
如果没有更多结果或者结果是更新计数,则应返回null,因此SQL
Lite引发异常的行为似乎是错误的。
现在,如果要检索更多结果,请致电getMoreResults()
(或它的兄弟接受int
参数)。boolean
此方法的返回值与的含义相同execute()
,因此false
并不意味着不再有结果!
如果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();
}