Мне нужно специально перехватывать исключения тайм-аута SQL-сервера, чтобы их можно было обрабатывать по-другому. Я знаю, что могу поймать SqlException, а затем проверить, содержит ли строка сообщения «Тайм-аут», но мне было интересно, есть ли лучший способ сделать это?
try
{
//some code
}
catch (SqlException ex)
{
if (ex.Message.Contains("Timeout"))
{
//handle timeout
}
else
{
throw;
}
}
c#
.net
sql-server
error-handling
Броди
источник
источник
Ответы:
Чтобы проверить тайм-аут, я думаю, вы проверяете значение ex.Number. Если это -2, то у вас ситуация тайм-аута.
-2 - это код ошибки для тайм-аута, возвращаемый DBNETLIB, драйвером MDAC для SQL Server. Это можно увидеть, загрузив Reflector и посмотрев в System.Data.SqlClient.TdsEnums на предмет TIMEOUT_EXPIRED.
Ваш код будет читать:
Код для демонстрации сбоя:
источник
здесь: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html
Вы также можете прочитать, что Томас Вайнгартнер написал:
...
источник
Обновлено для C # 6:
Очень просто и приятно смотреть !!
источник
Какое значение имеет свойство SqlException.ErrorCode? Вы можете с этим работать?
Если есть таймауты, возможно, стоит проверить код -2146232060 .
Я бы установил это как статическую константу в вашем коде данных.
источник
Я не уверен, но когда у нас истекает время ожидания выполнения или время ожидания команды. Клиент отправляет «ABORT» на SQL Server, а затем просто прекращает обработку запроса. Ни одна транзакция не откатывается, блокировки не снимаются. чтобы решить эту проблему, я удаляю транзакцию в хранимой процедуре и использую транзакцию SQL в моем .Net-коде для управления sqlException
источник
Когда клиент отправляет ABORT, транзакции не откатываются. Чтобы избежать такого поведения, мы должны использовать SET_XACT_ABORT НА https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15
источник