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

4
我现在了解了一些关于SQL Server超时异常的内容。我找到了这两个链接: 如何在不使用catch Exception的情况下从.NET应用程序检测SQL Server超时 如何捕获SQLServer超时异常 所以,-2是客户端超时,如果我理解得正确,可以将其用于服务器连接超时和命令超时。 -1和-3是服务器网络错误。
现在,在C#中是否有可能捕获异常并区分服务器连接超时和命令超时?
非常感谢!
编辑:例如在这里:

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

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

如何检测超时时间是否在操作完成之前已过期或服务器未响应?这就是问题所在。


如果命令超时,连接会终止吗?如果不会,那么你就得到了答案。 - BugFinder
连接超时意味着 SQL Server 未响应您的应用程序调用。命令超时意味着 SQL Server 尝试执行命令,但无法及时完成。 - jean
是的,需要处理这个并抛出不同的异常。 - Canox
我知道它们的意思,但当连接超时发生时,我需要检测是服务器连接超时还是命令超时。 - Canox
1个回答

1
是的,可以。注意连接超时是指当您的DBMS在应用程序调用时没有响应,而命令超时则意味着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违规。只需执行正则表达式匹配"timeout"单词即可。
参考资料:MSDN MSDN论坛 如何捕获SQLServer超时异常

好的,感谢您的解释。但是如果我检查它是否为-2,然后执行else语句,它会捕获每个异常,而不仅仅是服务器连接超时或其他连接超时 - 对吗? - Canox
@Canos 你是正确的,需要编辑并解释,在这种情况下,你可以解析异常消息。 - jean
解析异常信息?哪一个是正确的? - Canox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接