Eventos de conexão
Aplicável a: .NET Framework .NET .NET Standard
O Provedor de Dados do Microsoft SqlClient para SQL Server tem objetos Connection com dois eventos que você pode usar para recuperar mensagens informativas de uma fonte de dados ou para determinar se o estado de Connection foi alterado. A tabela a seguir descreve os eventos do objeto Connection.
Evento | Descrição |
---|---|
InfoMessage | Ocorre quando uma mensagem informativa é retornada de uma fonte de dados. As mensagens informativas são mensagens de uma fonte de dados que não resultam na geração de uma exceção. |
StateChange | Ocorre quando o estado de Connection é alterado. |
Trabalhar com o evento InfoMessage
Você pode recuperar avisos e mensagens informativas de uma fonte de dados do SQL Server usando o evento InfoMessage do objeto SqlConnection. Os erros retornados da fonte de dados com um nível de severidade de 11 a 16 geram uma exceção. No entanto, o evento InfoMessage pode ser usado para obter mensagens da fonte de dados que não estão associadas a um erro. Com o Microsoft SQL Server, qualquer erro com uma severidade de 10 ou menos é considerado uma mensagem informativa e pode ser capturado usando o evento InfoMessage. Para saber mais, leia o artigo Severidade dos erros do Mecanismo de Banco de Dados.
O evento InfoMessage recebe um objeto SqlInfoMessageEventArgs que contém, em sua propriedade Errors, uma coleção das mensagens da fonte de dados. Você pode consultar os objetos Error nessa coleção para ver o número do erro, o texto da mensagem e a origem do erro. O Provedor de Dados do Microsoft SqlClient para SQL Server também inclui detalhes sobre o banco de dados, o procedimento armazenado e o número de linha de que a mensagem é proveniente.
Exemplo
O exemplo de código a seguir mostra como adicionar um manipulador de eventos para o evento 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);
}
};
Tratar erros como InfoMessages
O evento InfoMessage acionará normalmente apenas para mensagens informativas e de aviso que são enviadas do servidor. No entanto, quando ocorre um erro real, a execução do método ExecuteNonQuery ou ExecuteReader que iniciou a operação do servidor é interrompida e uma exceção é gerada.
Se você quiser continuar a processar o restante das instruções em um comando independentemente de qualquer erro gerado pelo servidor, defina a propriedade FireInfoMessageEventOnUserErrors do SqlConnection como true
. Definir essa propriedade faz a conexão disparar o evento InfoMessage para erros em vez de gerar uma exceção e interromper o processamento. O aplicativo cliente pode, em seguida, manipular esse evento e responder às condições de erro.
Observação
Um erro com um nível de severidade de 17 ou acima disso faz o servidor parar de processar o comando e deve ser tratado como uma exceção. Nesse caso, uma exceção é gerada independentemente de como o erro é tratado no evento InfoMessage.
Trabalhar com o evento StateChange
O evento StateChange ocorre quando o estado de um objeto Connection é alterado. O evento StateChange recebe StateChangeEventArgs, que permite determinar a alteração no estado de Connection usando as propriedades OriginalState e CurrentState. A propriedade OriginalState é uma enumeração ConnectionState que indica o estado de Connection antes da alteração. CurrentState é uma enumeração ConnectionState que indica o estado de Connection após a alteração.
O exemplo de código a seguir usa o evento StateChange para gravar uma mensagem para o console quando o estado de Connection muda.
// 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);
};