Как поймать SQLServer, в исключения времени ожидания



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



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

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

3 ответов:

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

-2-это код ошибки для timeout, возвращаемый из DBNETLIB, драйвера MDAC для SQL Server. Это можно увидеть, загрузив отражатель, и глядя под системой.Данные.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");
    }
}

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

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

Timeout: SqlException.Число = = -2 (Это ADO.NET код ошибки)
Общая Ошибка Сети: SqlException.Количество == 11
Взаимоблокировка: SqlException.Number = = 1205 (это ошибка SQL Server код)

...

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

Что значение для SqlException.Свойство ErrorCode? Ты можешь с этим работать?

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

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

Comments

    Ничего не найдено.