区分SQL服务器超时异常和C#中的SqlCommand超时异常

Distinguish between SQL Server Timeout Exceptions and SqlCommand Timeout Exceptions in C#

我现在已经阅读了一些关于 SQL 服务器超时异常的内容。我找到了这两个链接:

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 超时已过。在操作完成之前超时期限已过,或者服务器没有响应。 (微软 SQL 服务器,错误:-2)。

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

是的,你可以。请注意,当您的 DBMS 未响应您的应用程序调用时会发生连接超时,而命令超时表示 DBMS 已响应。事实上,它发送一个 "fail" 以便您的驱动器抛出异常。 在命令超时中,它在连接超时时从服务器收到一个明确的错误代码,您的应用程序不知道发生了什么(也许有人拔了网线,也许服务器关闭了)但是 driver/framework 的内部会告诉你用号码 属性 .

发生了什么

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

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" word.

参考文献:MSDN

MSDN Forum

How to catch SQLServer timeout exceptions