如何捕获 SQLServer 超时异常

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

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


if (ex.Message.Contains("Timeout"))
{
//handle timeout
}
else
{
throw;
}
}
115168 次浏览

SqlException.ErrorCode 属性的值是多少? 可以使用它吗?

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

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

要检查超时,我相信您需要检查 ex 的值。号码。如果是 -2,则出现超时情况。

-2是超时的错误代码,从 DBNETLIB 返回,这是 SQL Server 的 MDAC 驱动程序。这可以通过下载 反光镜和查看 System 来看到。百科。SqlClient.TIMEOUT _ EXPIRED 的 TdsEnums。

你的代码应该是:

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 rel = “ norefrer”> http://www.tech-archive.net/archive/dotnet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html

你也可以看到 托马斯 · 温加特纳写道: < br >

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

...

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

更新 c # 6:

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

非常简单,看起来不错! !

我不确定,但当我们执行超时或命令超时时 客户机向 SQLServer 发送一个“ ABORT”,然后简单地放弃查询处理。不回滚任何事务,也不释放任何锁。为了解决这个问题,我在存储过程中删除事务,并在。管理 sqlException

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