3

我正在使用MySQL Connector for .NET 从 C# 管理 MySQL 数据库。

当我尝试将枚举插入数据库时​​,它会将值附加到比实际值小一的枚举中。

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在 的情况下MyEnum.FirstValue),这是MySQL 枚举中的保留值(因为它们1默认启动)。

一种解决方案是附加+1到所有枚举值或可能进行扩展:

cmd.Parameters.AddWithValue("@enumVal", MyEnum.SecondValue + 1);

我仍然觉得我必须手动将值修改为应该自动转换它的库。

我做错了什么,还是没有默认的方法来处理这个?

4

2 回答 2

1

你可以让你的枚举像这样

public enum MyEnum {
    FirstValue = 1, 
    SecondValue, 
    ThirdValue
}

它将从 1 开始,而不是从 0 开始。

于 2012-11-23T13:38:02.907 回答
0

.NET 枚举默认从零开始,并以整数为后盾(即,您可以将默认枚举强制转换为整数并返回)。

我想正在发生的事情是 MySQL 数据库驱动程序将枚举值转换为整数,并尝试插入它。

MySQL 将插入枚举列的整数视为从 1 开始的索引。

我建议只将数据库列设为整数而不是 MySQL 枚举。这样,零是一个有效值。

或者,您可以将枚举的第一个值声明为整数值 1,以匹配 MySQL,如下所示:

public enum MyEnum 
{
    FirstValue = 1, 
    SecondValue, 
    ThirdValue
}

我认为我说得对,SecondValue然后ThirdValue将分别以值 2 和 3 支持。

然后,当连接器将枚举转换为整数时,它将返回 1、2 和 3,这将与 MySQL 的预期相匹配。

第三种选择是在两端保持类型不变,并且只是使这个映射成为你的数据层的一个函数(你确实有一个,对吗?) - 然后你只需要在一个地方处理这个问题。请注意,对于未来的开发人员可能会有点误导。

于 2012-11-23T13:38:18.820 回答