在C#中区分SQL Server超时异常和SqlCommand超时异常

时间:2017-02-14 09:42:37

标签: c# sql-server command timeout

我现在已经阅读了有关SQL Server超时异常的信息。我找到了这两个链接:

how to detect sql server timeout from .NET application without using catch Exception

How to catch SQLServer timeout exceptions

所以-2是客户端超时,当我理解这一点时,可以将其用于服务器连接超时和命令超时。 -1和-3是服务器网络错误。

现在。在C#中以某种方式可以捕获异常并区分服务器连接超时和命令超时吗?

非常感谢!

编辑:例如:

https://msdn.microsoft.com/en-us/library/cc645611.aspx

-2 超时已过期。操作完成之前经过的超时时间或服务器没有响应。 (Microsoft SQL Server,错误:-2)。

如何检测在a)操作完成之前是否已经过了超时时间或b)服务器是否没有响应?这就是问题。

1 个答案:

答案 0 :(得分:1)

是的,你可以。注意当您的DBMS没有响应您的应用程序调用时发生连接超时,而命令timout意味着DBMS被请求。事实上,它发送了一个"失败"为了你的驱动器抛出异常。 虽然在命令timout中它在连接超时时从服务器收到一个明确的错误代码,你的应用程序无法知道发生了什么(可能有人拉网线,也许服务器关机)但驱动程序/框架的内容会告诉你什么发生在使用数字属性。

下面的代码将查找异常编号属性,并检查它是否为命令超时

try
{
   //your .net C# code here 
}    
catch (SqlException ex)
{
    if (ex.Number == -2 && (Regex.IsMatch(sqlEx.Message, "[tT]ime\-{0,1}out")) {
        Console.WriteLine ("Command Timeout occurred")
    };
}

此外,您可以解析异常文本以获取其他类型的命令错误,例如FK违规。只需进行正则表达式匹配"超时"字。

参考:MSDN

MSDN Forum

How to catch SQLServer timeout exceptions