我的应用程序在一个平台上使用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.
2条答案
按热度按时间ajsxfq5m1#
当执行一个返回未知数量结果的查询时,那么你需要使用
execute()
。这个方法返回一个boolean
,指示结果的类型:true
:结果为ResultSet
false
:结果是更新计数如果结果是
true
,则使用getResultSet()
检索ResultSet
,否则使用getUpdateCount()
检索更新计数。如果更新计数为-1
,则表示没有更多结果。请注意,当当前结果为ResultSet
时,更新计数也将为-1
。如果没有更多的结果或者结果是一个更新计数,getResultSet()
应该返回null,所以SQL Lite抛出异常的行为似乎是错误的。现在,如果你想检索更多的结果,你可以调用
getMoreResults()
(或者它的兄弟接受一个int
参数)。这个方法的boolean
返回值与execute()
的返回值具有相同的含义,所以false
并不意味着没有更多的结果!只有当
getMoreResults()
返回false和getUpdateCount()
返回-1
时才不会有更多的结果(如Javadoc中所述)从本质上讲,这意味着如果你想正确地处理所有结果,你需要做一些事情,比如:
khbbv19g2#
问题是您使用了无效的方法来执行删除操作。您应该使用
Statement#execute(String)
而不是getResultSet
恕我直言,SQLite实现中的Exeption对于MySQL来说比null更有效。因为
delete
不返回集合,而是返回增量行的标量值。