2010-07-27 62 views
4

如果我嘗試調用一個存儲過程並且存在數據庫錯誤,那麼會在我的C#代碼中引發異常嗎?或者我需要檢查存儲過程的結果並自己提出異常?使用Ado.Net存儲過程時可靠地拋出異常嗎?

如:

using (SqlCommand cmd = new SqlCommand("prc_InsertSomething", conn)) 
{ 
    if (cmd.ExecuteNonQuery() != 1) // should I be doing this bit or not? 
    { 
     throw new DataException("Could not insert something"); 
    } 
} 

感謝

回答

2

對於ExecuteNonQuery,您將一般只要嚴重程度足夠高即可;但是,如果您是讀取數據,請小心;例如,如果存儲過程返回多個網格並在倒數第二個結果集之前引發異常(例如),則如果您不遍歷數據,則可能永遠不會看到該錯誤。

這是因爲錯誤被注入TDS流(不是帶外)。您需要使用TDS ,至少在錯誤處,您的代碼才能意識到這一點。

的東西(在IDataReader的情況下)一樣簡單:

while (reader.NextResult()) { } 

您的消費代碼後,將確保你消耗整個入境TDS流。

1

這取決於錯誤,但通常情況下,如果一個存儲過程失敗就會造成SqlException被拋出。

如果您沒有捕獲存儲過程本身中的錯誤/異常,它將通過數據庫提供程序冒出來。

1

我真的依賴於錯誤的嚴重程度。檢查出下面的鏈接:

http://msdn.microsoft.com/en-us/library/ms177497.aspx

的11〜19 在 TRY ... CATCH的TRY塊執行的RAISERROR嚴重性構造使控制 轉移到相關聯的CATCH 塊。

使用RAISERROR 而不調用CATCH塊來指定嚴重性爲10或更低的 返回消息。打印 不會將控制權轉交給CATCH 區塊。

因此,它將取決於存儲過程拋出的錯誤的嚴重性,無論它是否捕獲到調用代碼的異常處理程序中。

+0

我相信OP是詢問攔截調用應用程序中的異常,而不是存儲過程本身。 – Oded 2010-07-27 09:27:24