MySQL与C#:从MySQL获取枚举类型时的转换及存储问题
问题解决:MySQL枚举与C#枚举映射及读取异常
一、MySQL枚举类型读取"指定的转换无效"问题
错误根源在于MySQL枚举类型的存储逻辑和你当前的读取方式不匹配:MySQL的ENUM字段默认返回字符串值,即使它底层用整数索引存储,MySqlDataReader也不会直接以Int16类型返回,强行强转就会触发类型转换错误。另外要注意,MySQL枚举的索引是从1开始的,和你C#枚举里User=0的定义天然冲突,这也是转换异常的隐形诱因。
解决方法1:读取字符串后转换为C#枚举
直接读取数据库返回的枚举字符串,再解析为C#枚举类型,这是最稳妥的方式:
// 先读取字符串值,再转枚举 string profileTypeStr = rd.GetString("profileType"); ProfileType = Enum.Parse<ProfileType>(profileTypeStr);
如果数据库里的枚举值和C#枚举名称存在大小写差异,可以添加忽略大小写参数:
ProfileType = Enum.Parse<ProfileType>(profileTypeStr, ignoreCase: true);
解决方法2:对齐MySQL枚举索引与C#枚举数值
如果坚持按数值读取,需要调整C#枚举的数值,和MySQL枚举的索引(从1开始)完全对齐:
首先确认MySQL字段定义:
profileType ENUM('User', 'Library', 'Admin') NOT NULL DEFAULT 'User'
修改C#枚举:
public enum ProfileType { User = 1, // 对应MySQL枚举第一个值,索引1 Library = 2, // 对应第二个值,索引2 Admin = 3 // 对应第三个值,索引3 }
然后用对应类型读取(MySQL枚举索引是tinyint类型,用GetByte更准确):
ProfileType = (ProfileType)rd.GetByte("profileType");
二、int存储时读取值始终为0的问题
这个问题通常是两个原因导致:
- 插入数据未正确赋值:注册Library类型时,没有将
ProfileType.Library对应的数值(1)写入数据库,导致字段默认存储了0; - 读取类型不匹配:如果数据库字段是INT类型,应该用
rd.GetInt32("profileType")读取,而非GetInt16,否则可能因类型截断导致值异常。
修正后的读取代码:
ProfileType = (ProfileType)rd.GetInt32("profileType");
额外重要提醒:修复SQL注入漏洞
你的代码直接用字符串拼接生成SQL语句,存在严重的SQL注入风险,必须改用参数化查询:
var cmd = new MySqlCommand("select * from users where username=@username and password=@password", connection); cmd.Parameters.AddWithValue("@username", username); cmd.Parameters.AddWithValue("@password", password);
内容的提问来源于stack exchange,提问作者spoooooooonman
相关产品推荐
相关产品推荐

