【问题标题】:Distinguish between SQL Server Timeout Exceptions and SqlCommand Timeout Exceptions in C#区分 C# 中的 SQL Server 超时异常和 SqlCommand 超时异常
【发布时间】:2017-07-02 12:50:26
【问题描述】:

我现在已经阅读了一些关于 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) 服务器是否没有响应之前的超时时间?这就是问题。

【问题讨论】:

  • 如果命令超时,连接是否终止?如果没有 - 你有你的答案
  • 连接超时意味着 SQL Server 不响应您的应用调用。命令超时表示 SQL Server 尝试执行命令但无法及时完成
  • 是的。我需要处理这个并抛出不同的异常。
  • 我知道它们的意思,但是当连接超时发生时,我需要检测它是服务器连接超时还是命令超时。

标签: c# sql-server command timeout


【解决方案1】:

是的,你可以。请注意,当您的 DBMS 未响应您的应用程序调用时,会发生连接超时,而命令超时意味着 DBMS 已响应。事实上,它发送一个“失败”是为了让你的驱动器抛出一个异常。 在命令 timout 中,它在连接超时时从服务器收到了一个明确的错误代码,您的应用程序无法知道发生了什么(可能有人拔掉了网络电缆,可能服务器关闭了),但是驱动程序/框架的内部会告诉您什么使用 number 属性发生。

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

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

【讨论】:

  • 好的,感谢您的解释,但是当我检查它是否为 -2 然后会执行 else 时,它​​会捕获每一个异常,而不仅仅是服务器连接超时或其他连接超时 - 对吗?跨度>
  • @Canos 你是正确的,编辑解释在这种情况下你可以解析异常消息
  • 解析异常信息?哪个是正确的?
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2023-03-15
  • 2016-05-03
  • 1970-01-01
  • 2015-03-12
  • 2018-11-22
相关资源
最近更新 更多