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;
    }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top