在 SQL Server 的預存程序中根據商務邏輯的要求,有時需要拋出自訂異常,由C#程式俘獲之並進行相應的處理。
SQL Server 拋出自訂異常和簡單,像這樣就可以了:RAISERROR('Rais Error1', 16, 1) WITH NOWAIT
但定用什麼樣的錯誤層級卻很講究,否則 C# 中的 catch 塊可能俘獲不到的。
SQL Servr 拋出自訂異常的方法一般這麼寫就可以:
RAISERROR('Rais Error1', 16, 1) WITH NOWAIT
其中數字 16 代表錯誤層級:
錯誤層級從 0 到 25, 其中 19 到 25 是重大錯誤層級。
註:小於 0 的層級被解釋為 0,大於 25 的層級被解釋為 25。
任何使用者都可以指定 0 到 18 之間的錯誤層級。
19 到 25 層級的錯誤,只能由 sysadmin 角色的成員用 WITH LOG 選項指定。
19 到 25 層級的錯誤,將記錄到錯誤記錄檔和應用程式記錄檔。
20 到 25 層級的錯誤,被認為是致命的;遇到致命的層級錯誤,用戶端的串連將在收到訊息後終止。
C# 中的 catch 塊中可以俘獲 錯誤層級 11 到 19 層級的異常。
0 到 10 層級的錯誤根本不進catch 塊;而 20 到 25 層級的異常,被認為是致命的,會被斷開資料庫連接。所以 C# cath 塊可以接受到這種異常,
但異常的內容不是真正的異常內容,可能是類似這樣的內容:“在從伺服器接收結果時發生傳輸級錯誤”。
public static void GetSqlError()
{
try
{
string conString = "server=(local);uid=sa;pwd=sql;database=test1";
string sql = "select * from t1";
string raisError = "RAISERROR('Rais Error1', 16, 1) WITH NOWAIT";
sql = sql + ";" + raisError;
SqlConnection con = new SqlConnection(conString);
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}