连接事件

所有 .NET Framework 数据提供程序都具有 Connection 对象,其中包含两个事件,可用于从数据源检索信息性消息,或确定是否 连接 状态已更改。 下表描述 Connection 对象的这些事件。

事件 / 活动 DESCRIPTION
InfoMessage 当从数据源中返回信息性消息时发生。 信息性消息是数据源中不会引发异常的消息。
状态变更 当 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 事件。 但是,当发生实际错误时,由启动服务器操作的 ExecuteNonQueryExecuteReader 方法的执行将被中断,并抛出异常。

如果无论服务器生成任何错误都要继续处理命令中的语句的其他部分,请将 FireInfoMessageEventOnUserErrorsSqlConnection 属性设置为 true。 这样做会使连接对错误触发 InfoMessage 事件,而不是引发异常并中断处理。 客户端应用程序可以处理此事件并对错误情况做出响应。

注释

严重程度等于或大于 17 的错误会造成服务器停止处理命令,这种错误必须作为异常来处理。 在这种情况下,无论如何在 InfoMessage 事件中处理该错误,都会引发异常。

使用 StateChange 事件

StateChange 事件在 Connection 的状态更改时发生。 StateChange 事件接收 ,使你能够使用 OriginalState 和 CurrentState 属性来确定 Connection 状态的更改。 OriginalState 属性是一个 枚举,指示更改前的 Connection 状态。 CurrentState 是一个 枚举,指示更改后的 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);  
}  

另请参阅