Jak złapać wyjątki SQLServer timeout

Muszę dokładnie wyłapać wyjątki SQL server timeout, aby mogły być obsługiwane inaczej. Wiem, że mógłbym złapać SqlException, a następnie sprawdzić, czy ciąg wiadomości zawiera "Timeout", ale zastanawiałem się, czy jest lepszy sposób, aby to zrobić?

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

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}
Author: brodie, 2008-08-27

3 answers

Aby sprawdzić limit czasu, wierzę, że sprawdzasz wartość ex.Numer. Jeśli jest -2, to masz sytuację timeout.

-2 jest kodem błędu timeout, zwracanym z DBNETLIB, sterownika MDAC dla SQL Server. Można to zobaczyć pobierając Reflector i patrząc pod System.Data.SqlClient.TdsEnums dla TIMEOUT_EXPIRED.

Twój kod będzie brzmiał:

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

Kod do wykazania błędu:

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");
    }
}
 140
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-26 16:37:06

Tutaj: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html

Możesz też przeczytać, że Thomas Weingartner napisał:

Timeout: SqlException.Liczba = = -2 (jest to ADO.NET kod błędu)
Ogólny Błąd Sieci: SqlException.Liczba = = 11
Deadlock: SqlException.Liczba = = 1205 (jest to kod błędu SQL Server)

...

Zajmujemy się " ogólnym Błąd sieci " jako wyjątek limitu czasu. Występuje tylko w rzadkich okolicznościach, np. gdy zapytanie update / insert/delete wywoła długo działający WYZWALACZ.

 14
Author: Roland Pihlakas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 23:35:10

Jaka jest wartość dla SqlException.Właściwość ErrorCode? Możesz z tym popracować?

Mając timeouty, warto sprawdzić kod pod kątem -2146232060.

Ustawiłbym to jako statyczny const w Twoim kodzie danych.

 1
Author: Rob Cooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-23 19:06:29