You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中正确捕获SQL Server网络相关错误?

SQL Server网络相关异常捕获问题

我希望捕获SQL Server的所有网络相关异常(连接丢失、超时等),并在SQL Server实例突然宕机时向终端用户显示警告对话框。SqlException包含错误列表,本应展示具体错误信息,但测试发现,停止SQL Server服务时,该集合中唯一记录的SqlError.Number属性值为-1,代码如下:

if (ex is SqlException sqlException)
{
    int number = ex.Number; // -1
}

错误消息为:

建立与SQL Server的连接时发生与网络相关的或特定于实例的错误。找不到服务器或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。(provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

我的问题如下:

  1. 是否可以安全地认为,当SqlError集合仅包含一条Number为-1的记录时,即为网络相关问题?
  2. 若不能,如何从SqlException对象中获取上述特定的“provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified”信息?
  3. 尝试通过解析错误消息获取编号“26”是否容易出错?因为这些错误消息可能会根据系统设置本地化。
  4. 是否有关于SQL Server实例连接丢失相关问题的文档,以及在C#中正确捕获这类问题的建议?

我曾尝试查找相关文档,但未找到有用链接。


问题解答

1. 是否可以安全认为SqlError集合仅含Number=-1的记录即为网络问题?

不能完全安全认定。Number=-1通常对应客户端层面的连接初始化失败(比如找不到服务器、网络不通),但某些非网络场景也可能触发该值(比如连接字符串格式完全错误)。不过结合业务场景判断,这类错误大概率属于网络/实例可达性问题,可以作为网络异常的强参考,但最好配合其他判断条件。

2. 如何获取特定的SQL Network Interfaces错误信息?

遍历SqlException.Errors集合,每个SqlError对象的Message属性会包含完整错误详情,包括你提到的provider和error编号部分。示例代码:

if (ex is SqlException sqlException)
{
    foreach (SqlError error in sqlException.Errors)
    {
        string fullErrorDetail = error.Message;
        // 可在此筛选包含"SQL Network Interfaces"的消息
    }
}

注意:SqlException.Number仅返回集合中第一个错误的编号,若存在多个错误,必须遍历每个SqlError才能获取完整信息。

3. 解析错误消息获取编号是否容易出错?

是的,这种方式极易出错。错误消息会随系统语言设置本地化(比如中文系统返回中文消息、英文系统返回英文消息),解析逻辑会在非预期语言环境下失效;同时微软可能调整错误消息格式,导致解析逻辑直接失效,绝对不推荐依赖这种方式。

4. SQL Server连接丢失捕获的文档与建议

  • 核心判断逻辑:优先依赖SqlError.Number的已知网络相关编号,典型值包括:
    • 10054:TCP连接被远程主机强制关闭(对应实例宕机、网络中断)
    • 4060:无法打开指定数据库(可能关联实例不可达或权限问题)
    • 另外,SqlException.Class(错误级别)可作为辅助参考,网络相关错误通常Class在11-16区间,但并非绝对标准。
  • 额外异常处理:除SqlException外,需单独捕获TimeoutException,这是连接超时或命令超时时抛出的独立异常。
  • 最佳实践:
    1. 区分连接初始化错误与执行阶段错误:连接阶段的Number=-1或TimeoutException通常是网络/实例问题;执行阶段的错误(如10054)是连接中途丢失。
    2. 始终以SqlError.Number作为判断依据,绝不依赖错误消息文本。
    3. 实现重试逻辑时,仅针对网络相关错误进行有限次数重试,避免无效操作。

内容的提问来源于stack exchange,提问作者Babangida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:37:17