当 PreparedStatement.execute() 完成时,是否意味着我的 sql 服务器程序结束了?
When PreparedStatement.execute() finished, it does not mean that my sql server procedure is over?
我有一个 Java 应用程序,我正在其中对 SQL 服务器 2008 数据库执行一些查询。
我正在尝试使用那段代码执行存储过程:
//...
try (Connection connection = dataSource.getConnection()) {
PreparedStatement preparedStmt = connection.prepareStatement("exec dbo.myProc");
preparedStmt.execute();
connection.commit();
connection.close();
}
//...
但是通过一些调试我发现当连接被提交和关闭时程序并没有结束。
所以我的问题是,这是为什么?以及如何确保程序在关闭连接之前结束?
确保您在 proc 代码中有 SET NOCOUNT ON
and/or 使用 return 使用 preparedStmt.getMoreResults() 消耗所有结果。这将确保过程运行完成。
SET NOCOUNT ON
将抑制需要消耗的 DONE_IN_PROC
(行数)。除了行计数之外,return 对客户端产生的其他操作(例如 SELECT
、PRINT
和 RAISERROR
将需要 getMoreResults()
来检索结果和确保过程运行完成。如果您在 proc 代码中没有这些并且没有引发异常,那么仅 SET NOCOUNT ON
就足够了。
我有一个 Java 应用程序,我正在其中对 SQL 服务器 2008 数据库执行一些查询。 我正在尝试使用那段代码执行存储过程:
//...
try (Connection connection = dataSource.getConnection()) {
PreparedStatement preparedStmt = connection.prepareStatement("exec dbo.myProc");
preparedStmt.execute();
connection.commit();
connection.close();
}
//...
但是通过一些调试我发现当连接被提交和关闭时程序并没有结束。
所以我的问题是,这是为什么?以及如何确保程序在关闭连接之前结束?
确保您在 proc 代码中有 SET NOCOUNT ON
and/or 使用 return 使用 preparedStmt.getMoreResults() 消耗所有结果。这将确保过程运行完成。
SET NOCOUNT ON
将抑制需要消耗的 DONE_IN_PROC
(行数)。除了行计数之外,return 对客户端产生的其他操作(例如 SELECT
、PRINT
和 RAISERROR
将需要 getMoreResults()
来检索结果和确保过程运行完成。如果您在 proc 代码中没有这些并且没有引发异常,那么仅 SET NOCOUNT ON
就足够了。