我正在使用.NET的MySQL Connector来管理来自C#的MySQL数据库。
当我尝试将枚举插入数据库时,它会附加枚举值比实际小1。
public enum MyEnum {
FirstValue, SecondValue, ThirdValue;
}
public void InsertEnum() {
MySqlConnection con = new MySqlConnection(connStr);
string sql = "INSERT INTO table (Col1) VALUES (@enumVal);";
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.Parameters.AddWithValue("@enumVal", MyEnum.SecondValue);
//Note I'm trying to insert 'SecondValue' --^
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
这会在数据库中插入FirstValue
。
数据库中的Col1
列属于ENUM数据类型:
ENUM('FirstValue','SecondValue','ThirdValue')
如果我尝试追加MyEnum.FirstValue
,我会收到数据截断错误(data truncated for column COLUMN_NAME
),因为它尝试使用与.NET相同的索引(0
,{{1} }}),这是MySQL Enums中的保留值(因为默认情况下它们始于MyEnum.FirstValue
)。
解决方案是将1
附加到所有枚举值或可能扩展名:
+1
我仍然觉得我必须手动将值修改为应该自动转换它的库。
我做错了什么,或者没有默认的方法来解决这个问题?
答案 0 :(得分:1)
你可以像这样制作你的枚举
public enum MyEnum {
FirstValue = 1,
SecondValue,
ThirdValue
}
它将从1开始,而不是从0开始。
答案 1 :(得分:0)
默认情况下,.NET枚举从零开始,并以整数作为后缀(即您可以将默认枚举转换为整数并返回)。
我想现在发生的事情是MySQL数据库驱动程序将枚举值转换为整数,并试图插入它。
MySQL将插入枚举列的整数视为基于1的索引。
我建议只使数据库列为整数而不是MySQL枚举。这样,零就是一个有效值。
或者,您可以将枚举的第一个值声明为整数值为1,以匹配MySQL,如下所示:
public enum MyEnum
{
FirstValue = 1,
SecondValue,
ThirdValue
}
我认为我说SecondValue
和ThirdValue
将分别以值2和3支持。
然后当连接器将枚举转换为整数时,它将返回1,2和3,这将与MySQL期望的匹配。
第三种方法是保持两端的类型为原样,只是让这个映射成为你的数据层的一个功能(你有一个,对吗?) - 那么你只需要在一个地方处理这个问题。可能会对未来的开发人员产生一些误导,请注意。