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

Blazor框架枚举值插入数据库报错:CustomerGroup字段数据截断

解决Blazor中向MySQL插入枚举类型时的"Data truncated"错误

问题根源

你的数据库CustomerGroup字段是字符串类型,但Dapper默认会把枚举转换为对应的整数(比如National对应0,Foreign对应1),当把整数插入字符串字段时,MySQL会尝试转换但失败,触发"Data truncated"错误。你硬编码字符串能成功,也验证了这一点。

可行解决方案

方案1:手动转换枚举为字符串(快速解决)

修改InsertCustomer方法,把枚举值转为字符串后再传入参数:

public Task InsertCustomer(Customer customer)
{
    string sql = @"INSERT INTO Customer (CompanyName, VATNum, CustomerGroup) VALUES (@CompanyName, @VATNum, @CustomerGroup)";

    // 手动将枚举转为字符串,构造参数对象
    var parameters = new 
    {
        customer.CompanyName,
        customer.VATNum,
        CustomerGroup = customer.CustomerGroup.ToString()
    };

    return _db.SaveData(sql, parameters);
}

方案2:全局配置Dapper自动处理枚举为字符串(一劳永逸)

如果项目中有多处枚举需要插入字符串类型字段,可以自定义Dapper类型处理器,全局生效:

  1. 先创建通用枚举类型处理器:
public class EnumToStringTypeHandler<TEnum> : SqlMapper.TypeHandler<TEnum> where TEnum : Enum
{
    public override void SetValue(IDbDataParameter parameter, TEnum value)
    {
        parameter.Value = value.ToString();
    }

    public override TEnum Parse(object value)
    {
        return (TEnum)Enum.Parse(typeof(TEnum), value.ToString());
    }
}
  1. 在项目启动文件(Program.cs)中注册处理器:
// 针对单个枚举类型
Dapper.SqlMapper.AddTypeHandler(new EnumToStringTypeHandler<CustomerGroup>());

为什么之前的尝试无效?

  • [JsonConverter(typeof(StringEnumConverter))]:这个特性是给JSON序列化组件(比如Newtonsoft.Json)用的,和Dapper与数据库的交互逻辑无关,所以对插入数据库没有作用。
  • [Column(TypeName= "nvarchar(10)")]:这是Entity Framework的特性,而你使用的是Dapper,Dapper不会识别和处理这个特性,因此无法生效。

额外验证

确认数据库中CustomerGroup字段的类型为VARCHAR或NVARCHAR,且长度足够容纳最长的枚举值(比如设置为10字符以上,确保"National""Foreign"都能存入),避免因字段长度不足导致截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:23:23