所有 .NET Framework 数据提供程序都具有 Connection 两个事件的对象,可用于从数据源检索信息性消息,或确定状态 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 事件。 但是,当发生真实错误时,启动服务器操作的ExecuteNonQuery或ExecuteReader方法的执行将停止,并抛出异常。
如果无论服务器生成任何错误都要继续处理命令中的语句的其他部分,请将 FireInfoMessageEventOnUserErrors 的 SqlConnection 属性设置为 true。 这样做会使连接对错误触发 InfoMessage 事件,而不是引发异常并中断处理。 客户端应用程序可以处理此事件并对错误情况做出响应。
注释
严重程度等于或大于 17 的错误会造成服务器停止处理命令,这种错误必须作为异常来处理。 在这种情况下,无论如何在 InfoMessage 事件中处理该错误,都会引发异常。
使用 StateChange 事件
StateChange 的状态发生变化时,会触发 Connection 事件。 事件StateChange接收StateChangeEventArgs,这使你能够使用OriginalState和CurrentState属性来确定Connection的状态变化。 该 OriginalState 属性是一个 ConnectionState 枚举,指示 Connection 在更改前的状态。
CurrentState 是一个 ConnectionState 枚举,指示 Connection 更改后的状态。
下面的代码示例使用 StateChange 事件在更改状态 Connection 时将消息写入控制台。
' 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);
}