Eventos de ConnectionConnection Events

Todos los proveedores de datos .NET Framework tienen objetos de conexión con dos eventos que se pueden usar para recuperar mensajes informativos de un origen de datos o para determinar si el estado de una conexión ha cambiado.All of the .NET Framework data providers have Connection objects with two events that you can use to retrieve informational messages from a data source or to determine if the state of a Connection has changed. En la tabla siguiente se describen los eventos del objeto de conexión .The following table describes the events of the Connection object.

EventoEvent DESCRIPCIÓNDescription
InfoMessageInfoMessage Se produce cuando se devuelve un mensaje informativo desde un origen de datos.Occurs when an informational message is returned from a data source. Los mensajes informativos son aquellos procedentes de orígenes de datos que no inician una excepción.Informational messages are messages from a data source that do not result in an exception being thrown.
StateChangeStateChange Se produce cuando cambia el estado de la conexión .Occurs when the state of the Connection changes.

Trabajar con el evento InfoMessageWorking with the InfoMessage Event

Con el evento InfoMessage del objeto SqlConnection puede recuperar advertencias o mensajes informativos de un origen de datos de SQL Server.You can retrieve warnings and informational messages from a SQL Server data source using the InfoMessage event of the SqlConnection object. Si se devuelven errores desde el origen de datos con un nivel de seguridad entre 11 y 16, se inicia una excepción.Errors returned from the data source with a severity level of 11 through 16 cause an exception to be thrown. Sin embargo, el evento InfoMessage se puede utilizar para obtener mensajes del origen de datos que no estén asociados a un error.However, the InfoMessage event can be used to obtain messages from the data source that are not associated with an error. En el caso de Microsoft SQL Server, cualquier error que tenga la gravedad 10, como máximo, se considera de tipo informativo y se captura mediante el evento InfoMessage.In the case of Microsoft SQL Server, any error with a severity of 10 or less is considered to be an informational message, and can be captured by using the InfoMessage event. Para obtener más información, consulte el artículo sobre gravedad de los errores de motor de base de datos .For more information, see the Database Engine Error Severities article.

El InfoMessage evento recibe un SqlInfoMessageEventArgs objeto que contiene, en su propiedad Errors , una colección de los mensajes del origen de datos.The InfoMessage event receives an SqlInfoMessageEventArgs object containing, in its Errors property, a collection of the messages from the data source. Puede consultar los objetos de error de esta colección para obtener el número de error y el texto del mensaje, así como el origen del error.You can query the Error objects in this collection for the error number and message text, as well as the source of the error. El proveedor de datos .NET Framework para SQL Server incluye asimismo datos acerca de la base de datos, el procedimiento almacenado y el número de línea donde se originó el mensaje.The .NET Framework Data Provider for SQL Server also includes detail about the database, stored procedure, and line number that the message came from.

EjemploExample

En el ejemplo de código siguiente se muestra cómo se puede agregar un controlador de eventos para el evento InfoMessage.The following code example shows how to add an event handler for the InfoMessage event.

' 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);  
  }  
}  

Controlar errores como InfoMessagesHandling Errors as InfoMessages

Normalmente, el evento InfoMessage solo se activa para mensajes informativos y de advertencia enviados desde el servidor.The InfoMessage event will normally fire only for informational and warning messages that are sent from the server. Sin embargo, cuando se produce un error real, se detiene la ejecución del método ExecuteNonQuery o ExecuteReader que inició la operación del servidor y se produce una excepción.However, when an actual error occurs, the execution of the ExecuteNonQuery or ExecuteReader method that initiated the server operation is halted and an exception is thrown.

Si desea seguir procesando el resto de las instrucciones de un comando, independientemente de los errores producidos en el servidor, establezca la propiedad FireInfoMessageEventOnUserErrors de SqlConnection como true.If you want to continue processing the rest of the statements in a command regardless of any errors produced by the server, set the FireInfoMessageEventOnUserErrors property of the SqlConnection to true. De esta forma, la conexión activa el evento InfoMessage para errores, en lugar de iniciar una excepción e interrumpir el procesamiento.Doing this causes the connection to fire the InfoMessage event for errors instead of throwing an exception and interrupting processing. La aplicación cliente puede controlar el evento y reaccionar ante las situaciones de error.The client application can then handle this event and respond to error conditions.

Nota

Los errores con un nivel de gravedad de 17, como mínimo, que hacen que el servidor interrumpa el procesamiento de comandos, deben controlarse como excepciones.An error with a severity level of 17 or above that causes the server to stop processing the command must be handled as an exception. En este caso, se inicia una excepción, independientemente del modo en que se controle el error en el evento InfoMessage.In this case, an exception is thrown regardless of how the error is handled in the InfoMessage event.

Trabajar con el evento StateChangeWorking with the StateChange Event

El evento StateChange se produce cuando cambia el estado de una conexión .The StateChange event occurs when the state of a Connection changes. El evento StateChange recibe StateChangeEventArgs que le permite determinar el cambio de estado de la conexión mediante el uso de las propiedades OriginalState y CurrentState .The StateChange event receives StateChangeEventArgs that enable you to determine the change in state of the Connection by using the OriginalState and CurrentState properties. La propiedad OriginalState es una ConnectionState enumeración que indica el estado de la conexión antes de que se cambiara.The OriginalState property is a ConnectionState enumeration that indicates the state of the Connection before it changed. CurrentState es una ConnectionState enumeración que indica el estado de la conexión después de que se haya cambiado.CurrentState is a ConnectionState enumeration that indicates the state of the Connection after it changed.

En el ejemplo de código siguiente se usa el evento StateChange para escribir un mensaje en la consola cuando cambia el estado de la conexión .The following code example uses the StateChange event to write a message to the console when the state of the Connection changes.

' 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);  
}  

Vea tambiénSee also