Statement.getMoreResults()的两种形式之间有什么关系?

时间:2015-11-22 09:30:02

标签: jdbc

方法Statement.getMoreResults()存在两种变体:一种不带参数,另一种带整数参数。第二个变体接受三个常量之一CLOSE_CURRENT_RESULTKEEP_CURRENT_RESULTCLOSE_ALL_RESULTS。我的问题是,第一个变体是否相当于传递给第二个变量的某个常量(如果是,那么哪一个?)getMoreResults()是等同于getMoreResults(CLOSE_CURRENT_RESULT)还是getMoreResults(CLOSE_ALL_RESULTS)还是两个?

1 个答案:

答案 0 :(得分:2)

JDBC是接口和所需行为的集合。 getMoreResults()调用getMoreResults(int)是否取决于各个JDBC实现。

但是,getMoreResults()的API文档说:

  

移动到此Statement对象的下一个结果,如果它是true对象,则返回ResultSet,并隐式关闭任何当前ResultSet个对象< / strong>使用方法getResultSet获得。

这相当于调用getMoreResults(Statement.CLOSE_ALL_RESULTS)

Statement.CLOSE_ALL_RESULTS定义为:

  

在调用ResultSet时,应该关闭表示之前保持打开的所有getMoreResults个对象的常量。

使用any和all可能会引起一些混淆,但它们都表明任何先前打开的ResultSet应该被关闭。

有趣的是(正如您在评论中指出的那样),如果驱动程序不支持多个打开的结果,getMoreResults(Statement.CLOSE_ALL_RESULTS)应该抛出SQLFeatureNotSupportedException

apidoc和JDBC规范中描述的getMoreResults()的行为确实表明它应该是等效的。

JDBC 4.2规范在13.1.2.3中说:

  

默认情况下,对方法getMoreResult的每次调用都会关闭之前的任何内容   方法ResultSet返回的getResultSet对象。

基于此,在不支持多个打开结果的驱动程序中,getMoreResults()等同于getMoreResults(Statement.CLOSE_CURRENT_RESULT),并且在支持多个打开结果的驱动程序中,它等同于{{1 }}。我认为这种区别有点奇怪和不必要,因为在不支持多个打开结果的驱动程序中,关闭当前结果与关闭所有结果相同(因为只有一个结果)。我将与JDBC专家组讨论这个问题。