c# - MySQL 连接器附加枚举值比实际值小一

标签 c# .net mysql mysql-connector

我正在使用 MySQL Connector用于 .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 相同的索引( 0MyEnum.FirstValue 的情况下,它是 MySQL Enums 中的保留值(因为它们默认从 1 开始)。

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

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

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

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

最佳答案

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

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

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

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

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

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

我认为我的说法是正确的,SecondValueThirdValue 将分别由值 2 和 3 支持。

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

第三种选择是在两端保持类型不变,只使这个映射成为数据层的一个函数(你有一个,对吧?)——然后你只需要在一个地方处理这个.请注意,可能会对 future 的开发人员产生一些误导。

关于c# - MySQL 连接器附加枚举值比实际值小一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13530080/

相关文章:

c# - 在 C# 中创建和填充数组的函数式方法

C#:如何设置属性的默认值

c# - 无法使用 Microsoft.Azure.ServiceBus 连接到 Azure ServiceBus

.net - 通过过滤另一个 DataTable 创建一个 DataTable

.net - 如何在我的数据库中安全地存储第三方 Web 服务的密码?

mysql - 使用 Mysql 中的查询连接具有多列的表

c# - 如何以编程方式在 C# 中创建 MS Access 表?

c# - Quartz.net 作为服务无法配置 quartz_job.xml

php - 为 MYSQL 插入验证数组形式输入

mysql - 错误的数据库查询设计指南