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

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的问题

这个问题通常是两个原因导致:

  1. 插入数据未正确赋值:注册Library类型时,没有将ProfileType.Library对应的数值(1)写入数据库,导致字段默认存储了0;
  2. 读取类型不匹配:如果数据库字段是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:15:24