Java не улавливает ошибку возникновения хранимой процедуры MS SQL

У меня есть хранимая процедура в базе данных SQL Server 2008, и я разрабатываю приложение Java, использующее соединение sqljdbc4. Все работает нормально, даже вызов процедуры, но есть одно но - в некоторых случаях java не отлавливает возбужденное исключение, выброшенное процедурами и указанное при вызове типа select или update (delete insert)

вот пример

AS
BEGIN
    DECLARE @c INT
    SELECT @c= COUNT(nomUtilisateur) 
        FROM Utilisateur2
    PRINT @c
    RAISERROR(N'error message personalise',18,1)
END

в этом случае java ловит исключение

try{
    CallableStatement cll=con.prepareCall("EXEC f3 ");
    cll.execute();

    System.out.println("fin EXEC f3 ? ");}
catch (SQLException e) {
    System.out.println("sqlerror state: "+e.getSQLState() +" |error code: "
        + e.getErrorCode()+" |message: "+e.getMessage());
    e.printStackTrace();
} 

но когда я использую такой выбор


ALTER PROCEDURE [dbo].[f3]
AS
BEGIN
    declare @c INT
    SELECT @c= COUNT(nomUtilisateur) 
        FROM Utilisateur2
    select * from Utilisateur2
    PRINT @c
    RAISERROR(N'error message personalise',18,1)
END

или обновление, java продолжает выполнение без перехвата исключения. Как будто не ждет окончания процедуры.

Итак, мой вопрос: неправильно ли я использую хранимую процедуру, или это ошибка в драйвере jdbc, или он предпочитает использовать параметр out и оставить эту стратегию; Я погуглил эту проблему, ничего не найдя.

Лично я хочу использовать поднятую ошибку


person yacine ouah    schedule 20.10.2012    source источник
comment
Что означает эта строка: **select * from Utilisateur2**? Это недопустимый синтаксис SQL, насколько мне известно, и я не могу заставить эту процедуру скомпилироваться ни на одном из моих SQL-серверов.   -  person RBarryYoung    schedule 20.10.2012
comment
Это чисто предположение, но интерпретирует ли java возвращаемое значение хранимой процедуры? что если поставить return 1 после рейзеррора?   -  person Ben Thul    schedule 20.10.2012


Ответы (1)


Попробуйте удалить оператор PRINT и поставить "SET NOCOUNT ON" в коде процесса, возможно, драйвер запутался.

person Farfarak    schedule 21.10.2012
comment
спасибо, очень подходит, я искал какую-то вещь, чтобы отключить печать по умолчанию, сделанную по запросу, и - person yacine ouah; 21.10.2012
comment
К сожалению, сайт @Lion позволяет менять имена только раз в месяц. Но точка взята. - person Farfarak; 22.10.2012
comment
Если вы выполняете итерацию по набору результатов, вызывая getResultSet(), а затем next() в наборе результатов, то по моему опыту возникает исключение, даже если вы не установили nocout. Установка nocount для решения, на мой взгляд, рискованна, поскольку она очень подвержена ошибкам. - person bjdodo; 12.09.2014