Como capturar exceções de tempo limite do SQLServer
-
09-06-2019 - |
Pergunta
Preciso capturar especificamente as exceções de tempo limite do servidor SQL para que possam ser tratadas de maneira diferente.Eu sei que poderia capturar o SqlException e verificar se a string da mensagem contém "Timeout", mas queria saber se existe uma maneira melhor de fazer isso?
try
{
//some code
}
catch (SqlException ex)
{
if (ex.Message.Contains("Timeout"))
{
//handle timeout
}
else
{
throw;
}
}
Solução
Para verificar o tempo limite, acredito que você verifique o valor de ex.Number.Se for -2, você terá uma situação de tempo limite.
-2 é o código de erro de tempo limite, retornado do DBNETLIB, o driver MDAC para SQL Server.Isso pode ser visto baixando Refletor, e procurando em System.Data.SqlClient.TdsEnums por TIMEOUT_EXPIRED.
Seu código seria:
if (ex.Number == -2)
{
//handle timeout
}
Código para demonstrar falha:
try
{
SqlConnection sql = new SqlConnection(@"Network Library=DBMSSOCN;Data Source=YourServer,1433;Initial Catalog=YourDB;Integrated Security=SSPI;");
sql.Open();
SqlCommand cmd = sql.CreateCommand();
cmd.CommandText = "DECLARE @i int WHILE EXISTS (SELECT 1 from sysobjects) BEGIN SELECT @i = 1 END";
cmd.ExecuteNonQuery(); // This line will timeout.
cmd.Dispose();
sql.Close();
}
catch (SqlException ex)
{
if (ex.Number == -2) {
Console.WriteLine ("Timeout occurred");
}
}
Outras dicas
aqui: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html
Você pode ler também isso Thomas Weingartner escreveu:
Tempo esgotado:SqlException.Number == -2 (Este é um código de erro ADO.NET)
Erro geral de rede:SqlException.Number == 11
Impasse:SqlException.Number == 1205 (este é um código de erro do SQL Server)
...
Também tratamos o "Erro Geral de Rede" como uma exceção de tempo limite.Ocorre apenas em circunstâncias raras, por ex.quando sua consulta de atualização/inserção/exclusão gerará um gatilho de longa duração.
Atualizado para c # 6:
try
{
// some code
}
catch (SqlException ex) when (ex.Number == -2) // -2 is a sql timeout
{
// handle timeout
}
Muito simples e bonito de ver!!
Qual é o valor da propriedade SqlException.ErrorCode?Você pode trabalhar com isso?
Ao ter tempos limite, pode valer a pena verificar o código para -2146232060.
Eu configuraria isso como uma const estática no seu código de dados.