How to catch SQLServer timeout exceptions How to catch SQLServer timeout exceptions sql-server sql-server

How to catch SQLServer timeout exceptions


To check for a timeout, I believe you check the value of ex.Number. If it is -2, then you have a timeout situation.

-2 is the error code for timeout, returned from DBNETLIB, the MDAC driver for SQL Server. This can be seen by downloading Reflector, and looking under System.Data.SqlClient.TdsEnums for TIMEOUT_EXPIRED.

Your code would read:

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

Code to demonstrate failure:

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


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

You can read also that Thomas Weingartner wrote:

Timeout: SqlException.Number == -2 (This is an ADO.NET error code)
General Network Error: SqlException.Number == 11
Deadlock: SqlException.Number == 1205 (This is an SQL Server error code)

...

We handle the "General Network Error" as a timeout exception too. It only occurs under rare circumstances e.g. when your update/insert/delete query will raise a long running trigger.


Updated for c# 6:

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

Very simple and nice to look at!!