Muszę konkretnie złapać wyjątki limitu czasu serwera SQL, aby można było je obsługiwać inaczej. Wiem, że mogę przechwycić wyjątek SqlException, a następnie sprawdzić, czy ciąg wiadomości zawiera „Timeout”, ale zastanawiałem się, czy istnieje lepszy sposób na zrobienie tego?
try
{
//some code
}
catch (SqlException ex)
{
if (ex.Message.Contains("Timeout"))
{
//handle timeout
}
else
{
throw;
}
}
c#
.net
sql-server
error-handling
brodie
źródło
źródło
Odpowiedzi:
Uważam, że aby sprawdzić limit czasu, sprawdź wartość np. Numer. Jeśli jest -2, oznacza to przekroczenie limitu czasu.
-2 to kod błędu przekroczenia limitu czasu, zwrócony z DBNETLIB, sterownika MDAC dla SQL Server. Można to zobaczyć, pobierając Reflector i sprawdzając System.Data.SqlClient.TdsEnums dla TIMEOUT_EXPIRED.
Twój kod brzmiałby:
Kod do wykazania awarii:
źródło
tutaj: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html
Możesz również przeczytać, że Thomas Weingartner napisał:
...
źródło
Zaktualizowano dla C # 6:
Bardzo proste i przyjemne dla oka !!
źródło
Jaka jest wartość właściwości SqlException.ErrorCode? Czy możesz z tym pracować?
W przypadku przekroczenia limitu czasu warto sprawdzić kod -2146232060 .
Ustawiłbym to jako statyczną stałą w kodzie danych.
źródło
Nie jestem pewien, ale kiedy upłynął limit czasu na wykonanie lub przekroczenie limitu czasu polecenia Klient wysyła „ABORT” do SQL Server, a następnie po prostu rezygnuje z przetwarzania zapytania. Żadna transakcja nie jest wycofywana, żadne blokady nie są zwalniane. Aby rozwiązać ten problem, usuwam transakcję w procedurze składowanej i używam transakcji SQL w kodzie .Net. Aby zarządzać wyjątkiem sqlException
źródło
Kiedy klient wysyła ABORT, żadne transakcje nie są wycofywane. Aby uniknąć tego zachowania, musimy użyć SET_XACT_ABORT ON https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15
źródło