Сведения о вопросе

LiKIY

10:46, 11th August, 2020

Теги

c#   .net   sql-server   error-handling    

Как поймать SQLServer тайм-аут исключения

Просмотров: 547   Ответов: 4

Мне нужно специально поймать SQL исключений таймаута сервера, чтобы их можно было обрабатывать по-разному. Я знаю, что могу поймать SqlException, а затем проверить, содержит ли строка сообщения "Timeout", но мне было интересно, есть ли лучший способ сделать это?

try
{
    //some code
}
catch (SqlException ex)
{

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}



  Сведения об ответе

crush

23:18, 21st August, 2020

Чтобы проверить наличие таймаута, я полагаю, что вы проверяете значение ex.Number. Если это -2, то у вас есть ситуация тайм-аута.

2 - это код ошибки для timeout, возвращаемый из DBNETLIB, драйвера MDAC для SQL сервера. Это можно увидеть, загрузив Reflector и посмотрев под System.Data.SqlClient.TdsEnums для TIMEOUT_EXPIRED.

Ваш код будет читать::

if (ex.Number == -2)
{
     //handle timeout
}

Код, чтобы продемонстрировать отказ:

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");
    }
}


  Сведения об ответе

prince

21:06, 1st October, 2020

здесь: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html

Вы также можете прочитать, что написал Томас Вайнгартнер :


Таймаут: SqlException.Number = = -2 (это код ошибки ADO.NET)
Общая Ошибка Сети: SqlException.Number = = 11
Взаимоблокировка: SqlException.Number = = 1205 (это код ошибки сервера SQL) ...


Мы также обрабатываем "General Network Error" как исключение таймаута. Это происходит только в редких случаях, например, когда ваш запрос update/insert/delete вызовет долго работающий триггер.


  Сведения об ответе

LIZA

18:13, 10th August, 2020

Обновлено для c# 6:

    try
    {
        // some code
    }
    catch (SqlException ex) when (ex.Number == -2)  // -2 is a sql timeout
    {
        // handle timeout
    }

Очень просто и приятно смотреть!!


  Сведения об ответе

fo_I_K

12:25, 28th August, 2020

Какое значение имеет свойство SqlException.ErrorCode? Ты можешь с этим работать?

При наличии таймаутов, возможно, стоит проверить код на -2146232060 .

Я бы настроил это как статическую константу в вашем коде данных.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться