2012-10-20 42 views
3

我有我的SQL Server 2008數據庫中的存儲過程,我devloping使用sqljdbc4連接的Java應用程序。一切工作正常,甚至過程調用,但有一件事 - 在某些情況下,Java沒有捕獲由程序引發的異常throwen和指定時有像選擇或更新(刪除插入)的呼叫java是不是捕捉MS SQL存儲過程引發錯誤

這裏是一個例子

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

java的catche異常

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參數並離開此策略;我谷歌搜索這個問題沒有找到任何東西。

就個人而言,我想使用超募錯誤

+0

這條線是什麼意思:'**選擇*來自Utilisateur2 **'應該表示?這是無效的SQL語法AFAIK,我無法讓這個過程在我的任何SQL Server中編譯。 – RBarryYoung

+0

這純粹是一種猜測,但java是否解釋了存儲過程的返回值?如果你在raiserror後面加上「return 1」會怎麼樣? –

回答

2

嘗試取出PRINT語句,並把在進程內的代碼「SET NOCOUNT ON」,它可能是司機迷糊。

+0

非常感謝您的配合,我不禁要求somme的東西禁用請求所做的默認打印。 –

+0

@Lion網站允許每個月只能更改一次名字,不幸的是。但有一點要說。 – Farfarak

+0

如果通過調用getResultSet()遍歷結果集,然後對resultset執行next(),那麼即使您沒有「set nocout on」,該異常也會以我的體驗拋出。在我看來,解決方案的設置是有風險的,因爲它非常容易出錯。 – bjdodo