如何捕获SQLServer超时异常
-
09-06-2019 - |
题
我需要专门捕获 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.
我会将其设置为数据代码中的静态常量。
不隶属于 StackOverflow