126

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

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

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

6 回答 6

170

要检查超时,我相信您检查 ex.Number 的值。如果它是-2,那么你有一个超时情况。

-2 是超时的错误代码,从 SQL Server 的 MDAC 驱动程序 DBNETLIB 返回。这可以通过下载Reflector并在 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");
    }
}
于 2008-09-15T13:09:29.943 回答
22

在这里:http

://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html 您还可以阅读Thomas Weingartner写道:

超时:SqlException.Number == -2(这是 ADO.NET 错误代码)
一般网络错误:SqlException.Number == 11
死锁:SqlException.Number == 1205(这是 SQL Server 错误代码)

...

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

于 2013-04-14T23:41:30.940 回答
17

针对 c# 6 更新:

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

非常简单,很好看!!

于 2019-02-11T16:18:16.603 回答
0

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

当出现超时时,可能值得检查-2146232060的代码。

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

于 2008-08-27T07:20:43.950 回答
0

我不确定,但是当我们执行超时或命令超时时,客户端向 SQL Server 发送“ABORT”,然后简单地放弃查询处理。没有事务回滚,没有锁被释放。为了解决这个问题,我在存储过程中删除事务并在我的 .Net 代码中使用 SQL 事务来管理 sqlException

于 2019-10-30T08:36:53.247 回答
-2

当客户端发送 ABORT 时,不会回滚任何事务。为了避免这种行为,我们必须使用 SET_XACT_ABORT ON https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15

于 2019-11-13T19:29:19.300 回答