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