連線事件
適用於:.NET Framework .NET .NET Standard
Microsoft SqlClient Data Provider for SQL Server 具有含兩個事件的 Connection 物件,可讓您從資料來源擷取參考訊息,或判斷 Connection 的狀態是否已變更。 下表描述 Connection 物件的事件。
事件 | 描述 |
---|---|
InfoMessage | 會在資訊訊息從資料來源傳回時發生。 資訊訊息是從資料來源傳回,且不會造成擲回例外狀況。 |
StateChange | 於 Connection 狀態變更時發生。 |
使用 InfoMessage 事件
您可以使用 InfoMessage 物件的 SqlConnection 事件,從 SQL Server 資料來源擷取警告和資訊訊息。 如果資料來源傳回嚴重性層級 11 到 16 的錯誤,則可能會擲回例外狀況。 然而,可以使用 InfoMessage 事件,從與錯誤無關的資料來源取得訊息。 有了 Microsoft SQL Server,任何嚴重性為 10 或以下的錯誤都會視為資訊訊息,且可以使用 InfoMessage 事件進行擷取。 如需詳細資訊,請參閱資料庫引擎錯誤嚴重性一文。
InfoMessage 事件會接收 SqlInfoMessageEventArgs 物件,該物件會在其 Errors 屬性中包含來自資料來源的訊息集合。 您可以查詢此集合中的 Error 物件,以取得錯誤號碼、訊息文字與錯誤來源。 Microsoft SqlClient Data Provider for SQL Server 也會包含有關訊息來源之資料庫、預存程序與行號的詳細資料。
範例
下列程式碼範例會顯示如何加入 InfoMessage 事件的事件處理常式。
// Assumes that connection represents a SqlConnection object.
connection.InfoMessage +=
(object sender, SqlInfoMessageEventArgs args) =>
{
foreach (SqlError err in args.Errors)
{
Console.WriteLine(
"The {0} has received a severity {1}, state {2} error number {3}\n" +
"on line {4} of procedure {5} on server {6}:\n{7}",
err.Source, err.Class, err.State, err.Number, err.LineNumber,
err.Procedure, err.Server, err.Message);
}
};
將錯誤視為 InfoMessage 來處理
只有在資訊訊息及警告訊息是從伺服器傳回時,才會正常地引發 InfoMessage 事件。 然而,在發生實際錯誤時,會停止執行起始伺服器作業的 ExecuteNonQuery 或 ExecuteReader 方法,並擲回例外狀況。
若要繼續處理命令中的其餘陳述式,而不理會伺服器產生的任何錯誤,請將 FireInfoMessageEventOnUserErrors 的 SqlConnection 屬性設定為 true
。 設定此屬性會使得連線引發錯誤的 InfoMessage 事件,而非擲回例外狀況並中斷處理。 用戶端應用程式接下來處理這個事件並回應錯誤狀況。
注意
必須將嚴重性層級 17 或以上的錯誤 (造成伺服器停止處理命令) 當做例外狀況處理。 在此情況下會擲回例外狀況,而不理會InfoMessage 事件中如何處理錯誤。
使用 StateChange 事件
當 Connection 狀態變更時,會發生 StateChange 事件。 StateChange 事件會接收 StateChangeEventArgs,讓您能夠使用 OriginalState 與 CurrentState 屬性,來判斷 Connection 狀態中的變更。 OriginalState 屬性是 ConnectionState 列舉,表示 Connection 變更前的狀態。 CurrentState 是 ConnectionState 列舉,表示 Connection 變更後的狀態。
下列程式碼範例會在 Connection 狀態變更時,使用 StateChange 事件,將訊息寫入到主控台。
// Assumes that connection represents a SqlConnection object.
connection.StateChange +=
(object sender, StateChangeEventArgs args) =>
{
Console.WriteLine(
"The current Connection state has changed from {0} to {1}.",
args.OriginalState, args.CurrentState);
};