连接事件
适用于: .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);
}
};
以 InfoMessages 形式处理错误
通常,只有从服务器发出的信息性消息和警告消息才会触发 InfoMessage 事件。 但是,当发生实际错误时,会暂停执行开始服务器操作的 ExecuteNonQuery 或 ExecuteReader 方法,并引发异常 。
如果无论服务器生成任何错误都要继续处理命令中的语句的其他部分,请将 FireInfoMessageEventOnUserErrors 的 SqlConnection 属性设置为 true
。 设置此属性将导致连接激发 InfoMessage 事件来显示错误,而不是引发异常并中断处理。 客户端应用程序可以处理此事件并对错误情况做出响应。
注意
严重程度等于或大于 17 的错误会造成服务器停止处理命令,这种错误必须作为异常来处理。 在这种情况下,无论如何在 InfoMessage 事件中处理该错误,都会引发异常。
使用 StateChange 事件
StateChange 事件在 Connection 的状态更改时发生。 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);
};