Когда PreparedStatement.execute () закончил, это не значит, что моя процедура sql server закончена? - PullRequest
1 голос
/ 02 мая 2019

У меня есть приложение Java, где я выполняю некоторые запросы к базе данных SQL Server 2008.Я пытаюсь выполнить хранимую процедуру с этим фрагментом кода:

//...
try (Connection connection = dataSource.getConnection()) {
    PreparedStatement preparedStmt = connection.prepareStatement("exec dbo.myProc");
    preparedStmt.execute();
    connection.commit();
    connection.close();
}
//...

Но с некоторой отладкой я обнаружил, что процедура не была закончена, когда соединение фиксируется и закрывается.

Итак, мой вопрос, почему это так?И как я могу убедиться, что процедура завершена до закрытия соединения?

1 Ответ

1 голос
/ 02 мая 2019

Убедитесь, что в коде процедуры указано SET NOCOUNT ON и / или используете все результаты, возвращенные с помощью prepareStmt.getMoreResults ().Это обеспечит выполнение процедуры до завершения.

SET NOCOUNT ON будет подавлять DONE_IN_PROC (количество строк), которое необходимо использовать.Помимо подсчета строк, другие операции, возвращающие результаты клиенту, такие как SELECT, PRINT и RAISERROR, потребуют getMoreResults() для получения результатов и обеспечения выполнения процедуры до ее завершения.Если у вас их нет в коде процедуры и не сгенерировано никаких исключений, достаточно будет только SET NOCOUNT ON.

...