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类型处理器,全局生效:
- 先创建通用枚举类型处理器:
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()); } }
- 在项目启动文件(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
相关产品推荐
相关产品推荐

