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

.NET5 WebAPI对接MySQL时如何获取重复记录异常的ErrorCode

解决方案

你遇到的问题是DbUpdateException是EF Core封装的外层异常,MySQL驱动抛出的原生错误信息、错误码都包裹在它的InnerException属性中,类型为MySqlException,按以下步骤处理即可:

  1. 先引入对应MySQL驱动的命名空间:

    • 若使用MySqlConnector驱动(.NET Core/.NET 5+推荐):using MySqlConnector;
    • 若使用MySql.Data驱动:using MySql.Data.MySqlClient;
  2. 修改异常捕获块的逻辑,强转内层异常后读取对应字段:

{
    try
    {
        module.Id = Guid.NewGuid();
        await _moduleRepository.Add(module);
        await _uow.CompleteAsync();
        return true;
    }
    catch (DbUpdateException ex)
    {
        // 判断内层异常是否为MySQL原生异常
        if (ex.InnerException is MySqlException mysqlEx)
        {
            // MySQL重复条目错误码固定为1062
            if (mysqlEx.Number == 1062)
            {
                // 这里可以拿到完整的DuplicateEntry提示,也可以提取重复字段值做定制化返回
                var duplicateMsg = mysqlEx.Message;
                var errorCode = mysqlEx.ErrorCode;
                logger.LogWarning("Module - 重复记录入库错误: {Msg}, 错误码: {Code}", duplicateMsg, errorCode);
                // 这里可返回自定义业务提示给前端,示例:return new ApiResult { Code = 400, Msg = "当前记录已存在,请勿重复提交" };
            }
            else
            {
                // 其他MySQL错误逻辑
                logger.LogWarning("Module - 数据库操作错误: {Msg}, 错误码: {Code}", mysqlEx.Message, mysqlEx.ErrorCode);
            }
        }
        else
        {
            // 非MySQL触发的DbUpdate异常逻辑
            logger.LogWarning("Module - Add Error: " + ex.Message);
        }
        return false;
    }
}

补充说明

  • MySqlException的Number属性值1062对应唯一约束冲突的重复录入错误,是MySQL服务端固定返回的错误码,和驱动版本无关
  • 如果仅需要判断是否是重复录入错误,无需解析异常文本,直接判断Number == 1062即可,稳定性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:45:04