2009-06-18 41 views
5

我有一個SQL服務器,該服務器具有這樣的語句2005數據庫的存儲過程:SQL Server的RAISERROR在.NET客戶端不會造成異常

IF @Condition = 0 
    BEGIN 
     RAISERROR('some error message',16,1) 
     RETURN 
    END 

,它是從一個C#客戶端調用像這樣:

try 
      { 
       SomeVariable = SqlHelper.ExecuteScalar(GetConnectionString(), "MySP", new object[] { param1, param2}); 
      } 
      catch (SqlException e) 
      { 
       Console.WriteLine(e.Message); 
      } 

然而,沒有例外被提出。 SP中的條件在測試中始終是正確的。爲了驗證這一點,我複製了來自SQL Server Profiler的調用,並在查詢窗口中執行它並打印ErrorMessage,這意味着會引發錯誤。

不知道發生了什麼事。

+0

您是否曾嘗試在您的catch語句中放置一個斷點,以查看它是否甚至得到執行? – 2009-06-18 02:03:16

+0

是的。這就是我發現它不起作用的原因。 – Abdu 2009-06-18 05:00:26

回答

6

我檢查了SQL Helper類,發現ExecuteScalar吃掉異常並返回null。我切換到不執行此操作的ExecuteDataSet。我期望不同的Execute ..方法的行爲方式相同。另一種方法是使用ExecuteScalar,當SP檢測到錯誤時,它會執行一個SELECT可以在客戶端處理的錯誤號。

0

是否與嚴重程度有關?如果你把嚴重性提高到19,它會通過你的代碼引發異常嗎?

+1

高於11的嚴重等級是客戶可以處理的錯誤。 – Abdu 2009-06-18 17:42:12

2

根據SQL Books在線嚴重性爲16「表示可由用戶糾正的一般錯誤。」 - 以便嚴重程度正常。

我只有SQL 2008才能使用,但我測試了RAISERROR('某個錯誤消息',16,1),並且錯誤在我的c#應用程序中被捕獲。你確定這個錯誤沒有在你的「SqlHelper」類中處理嗎?

1

從書籍在線

指定的10或更低的嚴重性使用RAISERROR從TRY塊返回一個消息,而無需調用 CATCH塊。