Eu 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, em seguida, verificar se a string da mensagem Contém "Tempo limite", mas gostaria de saber se há uma maneira melhor de fazer isso?
try
{
//some code
}
catch (SqlException ex)
{
if (ex.Message.Contains("Timeout"))
{
//handle timeout
}
else
{
throw;
}
}
c#
.net
sql-server
error-handling
Brodie
fonte
fonte
Respostas:
Para verificar o tempo limite, acredito que você verifique o valor de ex.Number. Se for -2, você tem uma situação de tempo limite.
-2 é o código de erro para tempo limite, retornado de DBNETLIB, o driver MDAC para SQL Server. Isso pode ser visto baixando o Reflector e procurando em System.Data.SqlClient.TdsEnums por TIMEOUT_EXPIRED.
Seu código seria:
Código para demonstrar falha:
fonte
aqui: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html
Você pode ler também que Thomas Weingartner escreveu:
...
fonte
Atualizado para c # 6:
Muito simples e bonito de se olhar !!
fonte
Qual é o valor da propriedade SqlException.ErrorCode? Você pode trabalhar com isso?
Quando houver tempos limite, pode valer a pena verificar o código para -2146232060 .
Eu configuraria isso como uma const estática em seu código de dados.
fonte
Não tenho certeza, mas quando temos tempo limite de execução ou tempo limite de comando O cliente envia um "ABORT" para o SQL Server e simplesmente abandona o processamento da consulta. Nenhuma transação é revertida, nenhum bloqueio é liberado. para resolver este problema, eu removo a transação no procedimento armazenado e uso a transação SQL no meu código .Net para gerenciar sqlException
fonte
Quando um cliente envia ABORT, nenhuma transação é revertida. Para evitar esse comportamento, temos que usar SET_XACT_ABORT ON https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15
fonte