PreparedStatement.execute() returns false 即使 SQL 服务器中有结果集?
PreparedStatement.execute() returns false even there is resultset in SQL server?
我的 sql 查询由 5 个部分组成,它们彼此高度相关。第一部分创建一个临时 table,第二部分使用该临时 table 并创建另一个临时 table,第三部分使用在第二部分中创建的临时 table 并再次创建另一个临时 table。第 4 部分 select 来自第 3 个临时 table 的一些数据,第 5 部分 select 是第 3 个临时 table.
的计数
因为临时 tables 只能在一个 preparedStatement 中使用(我的意思是一个由 preparedStatement 创建的临时 table 不能从另一个 preparedStatement 中使用,我在它之前试过了好的)我需要在准备语句中执行此操作。
所以前 3 部分创建临时 tables 因为在将参数设置为 preparedStatement I 运行 preparedStatement.execute()
3 次(我也试过 1....x次)然后我 运行 preparedStatement.execute() 但它 returns false 这意味着没有结果集。这是为什么?
PreparedStatement preparedStatement = conn.prepareStatement("select * into #tmp from tablex where ...\n" +
" select * into #tmp2 from #tmp where ...\n" +
" select * into #tmp3 from #tmp2 where ...\n" +
" select * from #tmp3\n" +
" select count(*) from #tmp3");
在上面,我添加了一个简单的插图。在这里,我需要使用准备好的语句获取第 4 次和第 5 次查询的结果。我该怎么做?
您正在执行的语句产生以下结果:
- 一个更新计数
- 一个更新计数
- 一个更新计数
- 一个结果集
- 一个结果集
execute(String)
返回的布尔值false
的含义是:
true
if the first result is a ResultSet
object; false
if it is
an update count or there are no results
这意味着您需要使用 getUpdateCount()
获取(第一个)更新计数,并使用 getMoreResults()
获取下一个结果(同样,这个 returns 一个布尔值相同的含义)。只有execute()
或getMoreResults()
returnsfalse
和getUpdateCount()
returns-1才没有了结果。
您需要执行以下操作:
boolean nextResultSet = statement.execute(...);
int resultSetCount = 0;
while (true) {
if (nextResultSet) {
resultSetCount++;
try (ResultSet rs = statement.getResultSet()) {
// Do something with result set
}
} else {
int updateCount = statement.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// do something with update count
}
nextResultSet = statement.getMoreResults();
}
您可以通过添加 SET NOCOUNT ON
作为您执行的第一条语句来跳过部分复杂性;那么你将不会获得更新计数,只需要处理两个结果集。
我的 sql 查询由 5 个部分组成,它们彼此高度相关。第一部分创建一个临时 table,第二部分使用该临时 table 并创建另一个临时 table,第三部分使用在第二部分中创建的临时 table 并再次创建另一个临时 table。第 4 部分 select 来自第 3 个临时 table 的一些数据,第 5 部分 select 是第 3 个临时 table.
的计数因为临时 tables 只能在一个 preparedStatement 中使用(我的意思是一个由 preparedStatement 创建的临时 table 不能从另一个 preparedStatement 中使用,我在它之前试过了好的)我需要在准备语句中执行此操作。
所以前 3 部分创建临时 tables 因为在将参数设置为 preparedStatement I 运行 preparedStatement.execute()
3 次(我也试过 1....x次)然后我 运行 preparedStatement.execute() 但它 returns false 这意味着没有结果集。这是为什么?
PreparedStatement preparedStatement = conn.prepareStatement("select * into #tmp from tablex where ...\n" +
" select * into #tmp2 from #tmp where ...\n" +
" select * into #tmp3 from #tmp2 where ...\n" +
" select * from #tmp3\n" +
" select count(*) from #tmp3");
在上面,我添加了一个简单的插图。在这里,我需要使用准备好的语句获取第 4 次和第 5 次查询的结果。我该怎么做?
您正在执行的语句产生以下结果:
- 一个更新计数
- 一个更新计数
- 一个更新计数
- 一个结果集
- 一个结果集
execute(String)
返回的布尔值false
的含义是:
true
if the first result is aResultSet
object;false
if it is an update count or there are no results
这意味着您需要使用 getUpdateCount()
获取(第一个)更新计数,并使用 getMoreResults()
获取下一个结果(同样,这个 returns 一个布尔值相同的含义)。只有execute()
或getMoreResults()
returnsfalse
和getUpdateCount()
returns-1才没有了结果。
您需要执行以下操作:
boolean nextResultSet = statement.execute(...);
int resultSetCount = 0;
while (true) {
if (nextResultSet) {
resultSetCount++;
try (ResultSet rs = statement.getResultSet()) {
// Do something with result set
}
} else {
int updateCount = statement.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// do something with update count
}
nextResultSet = statement.getMoreResults();
}
您可以通过添加 SET NOCOUNT ON
作为您执行的第一条语句来跳过部分复杂性;那么你将不会获得更新计数,只需要处理两个结果集。