連線事件

所有 .NET Framework 資料提供者都有 Connection 物件,該物件則有兩個事件,可讓您從資料來源擷取參考訊息,或判斷 Connection 的狀態是否已變更。 下表描述 Connection 物件的事件。

事件 描述
InfoMessage 會在資訊訊息從資料來源傳回時發生。 資訊訊息是從資料來源傳回,且不會造成擲回例外狀況息。
StateChange Connection 狀態變更時發生。

使用 InfoMessage 事件

您可以使用 InfoMessage 物件的 SqlConnection 事件,從 SQL Server 資料來源擷取警告和資訊訊息。 如果資料來源傳回嚴重性層級 11 到 16 的錯誤,則可能會擲回例外狀況。 不過,您可以使用 InfoMessage 事件,從與錯誤無關的資料來源取得訊息。 以 Microsoft SQL Server 為例,任何嚴重性為 10 或以下的錯誤都視為資訊訊息,而且可以使用 InfoMessage 事件進行擷取。 如需詳細資訊,請參閱資料庫引擎錯誤嚴重性一文。

InfoMessage 事件會接收 SqlInfoMessageEventArgs 物件,該物件會在其 Errors 屬性中包含來自資料來源的訊息集合。 您可以向這個集合中的 Error 物件查詢錯誤代碼、訊息文字和錯誤來源。 SQL Server 的 .NET Framework 資料提供者也包含訊息來源處的資料庫、預存程序和行號等詳細資訊。

範例

下列程式碼範例會顯示如何加入 InfoMessage 事件的事件處理常式。

' Assumes that connection represents a SqlConnection object.  
  AddHandler connection.InfoMessage, _  
    New SqlInfoMessageEventHandler(AddressOf OnInfoMessage)  
  
Private Shared Sub OnInfoMessage(sender As Object, _  
  args As SqlInfoMessageEventArgs)  
  Dim err As SqlError  
  For Each 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)  
  Next  
End Sub  
// Assumes that connection represents a SqlConnection object.  
  connection.InfoMessage +=
    new SqlInfoMessageEventHandler(OnInfoMessage);  
  
protected static void OnInfoMessage(  
  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 事件。 不過在確實發生錯誤時,將無法執行 ExecuteNonQueryExecuteReader 方法 (此方法可啟始伺服器作業),並擲回例外狀況。

若要繼續處理命令中的其餘陳述式,而不理會伺服器產生的任何錯誤,請將 FireInfoMessageEventOnUserErrorsSqlConnection 屬性設定為 true。 這麼做會使得連接引發錯誤的 InfoMessage 事件,而非擲回例外狀況並中斷處理。 用戶端應用程式接下來處理這個事件並回應錯誤狀況。

注意

必須將嚴重性層級 17 或以上的錯誤 (造成伺服器停止處理命令) 當做例外狀況處理。 在此情況下會擲回例外狀況,而不理會InfoMessage 事件中如何處理錯誤。

使用 StateChange 事件

Connection 狀態變更時,會發生 StateChange 事件。 StateChange 事件會接收 StateChangeEventArgs,讓您能夠使用 OriginalStateCurrentState 屬性,來判斷 Connection 狀態中的變更。 OriginalState 屬性是 ConnectionState 列舉,表示 Connection 變更前的狀態。 CurrentStateConnectionState 列舉,表示 Connection 變更後的狀態。

下列程式碼範例會在 Connection 狀態變更時,使用 StateChange 事件,將訊息寫入到主控台。

' Assumes connection represents a SqlConnection object.  
  AddHandler connection.StateChange, _  
    New StateChangeEventHandler(AddressOf OnStateChange)  
  
Protected Shared Sub OnStateChange( _  
  sender As Object, args As StateChangeEventArgs)  
  
  Console.WriteLine( _  
  "The current Connection state has changed from {0} to {1}.", _  
  args.OriginalState, args.CurrentState)  
End Sub  
// Assumes connection represents a SqlConnection object.  
  connection.StateChange  += new StateChangeEventHandler(OnStateChange);  
  
protected static void OnStateChange(object sender,
  StateChangeEventArgs args)  
{  
  Console.WriteLine(  
    "The current Connection state has changed from {0} to {1}.",  
      args.OriginalState, args.CurrentState);  
}  

另請參閱