我需要专门捕获 SQL Server 超时异常,以便可以以不同的方式处理它们。我知道我可以捕获 SqlException,然后检查消息字符串是否包含“Timeout”,但想知道是否有更好的方法来做到这一点?

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

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}
有帮助吗?

解决方案

要检查超时,我相信您检查 ex.Number 的值。如果是-2,那么就会出现超时情况。

-2 是超时错误代码,从 SQL Server 的 MDAC 驱动程序 DBNETLIB 返回。这个可以通过下载看到 反射器, ,并在 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");
    }
}

其他提示

这里: 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 Server 错误代码)

...

我们也将“一般网络错误”作为超时异常处理。它只发生在极少数情况下,例如当您的更新/插入/删除查询将引发长时间运行的触发器时。

针对 c# 6 进行了更新:

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

非常简单而且很好看!!

SqlException.ErrorCode 属性的值是多少?你能用那个吗?

当超时时,可能值得检查代码 -2146232060.

我会将其设置为数据代码中的静态常量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top