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

何时使用Microsoft.Data.SqlClient.SqlException与System.Data.SqlClient.SqlException

处理方案说明

你给出的第二种同时检查两类SqlException的方案是当前阶段最稳妥的实现方式,目前不存在可以仅处理Microsoft.Data.SqlClient.SqlException就覆盖所有场景的机制,原因如下:

  • 两个命名空间下的SqlException是完全独立的类型,没有继承关系,也不支持互相转换。依赖旧版System.Data.SqlClient的第三方库抛出的异常,必然是旧版SqlException类型,仅捕获新版异常会直接漏掉这部分错误。
  • 如需确认第三方库使用的SqlClient版本,可以直接查看项目的依赖项列表,或是在调试时捕获异常查看它的类型完整名称即可判断。

如果觉得两处异常分支的处理逻辑重复冗余,可以把公共处理逻辑抽离为单独的方法,避免重复编码,参考实现如下:

private static bool HandleSqlExceptionInSomeWay(Exception ex)
{
    // 处理旧版类库抛出的异常
    if (ex is System.Data.SqlClient.SqlException seOld)
    {
        return ProcessSqlException(seOld.Number, seOld.Message, seOld.Errors);
    }
    // 处理新版类库抛出的异常
    if (ex is Microsoft.Data.SqlClient.SqlException seNew)
    {
        return ProcessSqlException(seNew.Number, seNew.Message, seNew.Errors);
    }
    return false;
}

/// <summary>
/// 统一的SqlException处理逻辑
/// </summary>
private static bool ProcessSqlException(int errorNumber, string message, dynamic errors)
{
    // 你的原有异常处理逻辑
    return true;
}

长期优化建议

后续可以逐步排查项目依赖的第三方库:

  • 优先升级仍在使用旧版System.Data.SqlClient的第三方库到最新版本,大部分活跃维护的库已经完成了向新版Microsoft.Data.SqlClient的切换
  • 对于不再维护、无法升级的第三方库,保留旧版SqlException的处理分支即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:27:00