首先感謝@忙碌追逐遺忘提供的可以拋異常SQL文:
如下:
RAISERROR(N'異常1',11,5)WITH NOWAIT
SELECT 1
RAISERROR(N'異常2',11,5)WITH NOWAIT
SELECT 2
RAISERROR(N'異常3',11,5)WITH NOWAIT
SELECT 3
在SSMS中調試的訊息如下:
訊息 50000,層級 11,狀態 5,第 3 行
異常1
(1 行受影響)
訊息 50000,層級 11,狀態 5,第 5 行
異常2
(1 行受影響)
訊息 50000,層級 11,狀態 5,第 7 行
異常3
(1 行受影響)
可以知道 確實有3個異常拋出 。。
然後我是這樣捕捉的,不知道合不合規矩。
按鈕+事件:
/// <summary>
/// 測試SQL拋出多異常時,C#處理的順序或者處理方式。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnMultiExceptions_Click(object sender, EventArgs e)
{
try
{
StringBuilder _sqlBuilder = new StringBuilder();
_sqlBuilder.AppendLine(" RAISERROR(N'異常1',11,5)WITH NOWAIT ");
_sqlBuilder.AppendLine(" SELECT 1 ");
_sqlBuilder.AppendLine(" RAISERROR(N'異常2',11,5)WITH NOWAIT ");
_sqlBuilder.AppendLine(" SELECT 2 ");
_sqlBuilder.AppendLine(" RAISERROR(N'異常3',11,5)WITH NOWAIT ");
_sqlBuilder.AppendLine(" SELECT 3 ");
******.MSSQL.SqlServerDataAccess.StaticExcuteNoQuery(_sqlBuilder.ToString());
}
catch (Exception ex)
{
txtShow.Text = ex.Message; ///txtShow是個文字框。我把Message顯示在裡面。
}
}
現在看看結果:
MSSQL中的多異常,在C#中成了一個 ?
小菜鳥猜是這樣的。
C#處理SQLException的時候,都以一個事務為單位,不管這次事務操作拋出多少個SQL異常,在C#這邊,捕獲的都是一個。