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

问题描述:

我已经阅读了有关SQL Server超时异常的信息。我发现这两个环节:区分SQL Server超时异常和C#中的SqlCommand超时异常

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)服务器是否无响应?这就是问题。

+0

是否连接终止,如果命令超时?如果没有 - 你有你的答案 – BugFinder

+0

连接超时意味着SQL Server不响应你的应用程序调用。命令超时意味着SQL Server试图执行该命令,但无法及时完成它 – jean

+0

是的。我需要处理这个并抛出不同的例外。 – Canox

是的,你可以。注意当你的数据库管理系统没有响应你的应用程序调用时发生连接超时,而命令时钟指的是DBMS响应。事实上,它发送一个“失败”,以便您的驱动器抛出异常。 虽然在命令中,它在连接超时时收到服务器的显式错误代码,但您的应用程序无法知道发生了什么(可能有人拉动了网线,可能服务器已关闭),但驱动程序/框架的内部会告诉您使用数字属性发生了什么。

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

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违例。只要做一个正则表达式匹配“超时”字。

引用:​​3210

MSDN Forum

How to catch SQLServer timeout exceptions

+1

但-2可以是我还是我错了? – Canox

+0

好的谢谢你的解释,但是当我检查它是否为-2,然后会做一个else它会捕获每一个异常,而不仅仅是服务器连接超时或其他连接超时 - 对吗? – Canox

+0

@Canos youa重新更正,在此情况下编辑解释您可以解析异常消息 – jean