【问题标题】:MySQL Connector appending the enum with the value one less than the actual oneMySQL 连接器附加枚举值比实际值小一
【发布时间】:2012-11-11 21:03:36
【问题描述】:

我正在使用 .NET 的 MySQL Connector 从 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 Enums 中的值(因为它们默认从 1 开始)。

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

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

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

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

【问题讨论】:

  • 表中col1的数据类型是什么?
  • 你确定你的枚举和你给出的完全一样,并且你没有在枚举声明中使用特定的 int 值吗?
  • @MilindThakkar ENUM('FirstValue','SecondValue','ThirdValue')
  • @nawfal,你问我是否写过例如FirstValue = -1 等等?在那种情况下,不,我没有。

标签: c# .net mysql mysql-connector


【解决方案1】:

你可以让你的枚举像这样

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

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

【讨论】:

  • 但是我必须对我使用的所有枚举都这样做,对吧?
  • @AskeB。是的,但在存储到数据库或从数据库中提取时,您不需要添加 1 或删除 1。其他选择只是在数据库中使用 int 值 * Enum 实际上就是这样。
【解决方案2】:

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

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

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

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

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

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

我认为我说 SecondValueThirdValue 将分别以值 2 和 3 为后盾。

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

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

【讨论】:

  • 在问这个问题之前,我正在考虑你的第一个和第三个选择,但对我来说,这首先需要它似乎仍然很奇怪。我的意思是,如果 MySQL 为 .NET 制作了自己的连接器库,为什么不正确转换枚举?
  • 因为 MySQL 枚举和 .NET 枚举不相似。 MyEnum.FirstValue 只是一种从字面上表达0 的奇特方式(或1,如果这是您定义枚举的方式)。从文档的外观来看,MySQL 枚举是字符串文字。没有办法在两者之间进行映射,这对于每种情况都是正确的。
  • 但是我不明白传递MyEnum.ThirdValue 是如何工作的,因为那是2 变成3,使其成为.NET 的无效值,但正确应用于数据库ThirdValue。据我了解,MySQLConnector 必须映射枚举 int 值。
  • 仔细阅读文档意味着...VALUES (@enumVal)...AddWithValue("@enumVal", MyEnum.SecondValue); 正在向该字段中插入一个整数(不是字符串)。文档指出“如果省略引号,则该数字被视为索引”,然后“列规范中允许元素列表中的值从 1 开始编号我>”。所以我会说这是按预期执行的。
  • 你可以这么说,如果 int 值的值高于默认行为。我猜MySQL连接器必须知道枚举的BaseTypeSystem.Enum,然后我不明白为什么它们至少有一个标志属性来将默认值映射到默认值。我知道 MySQL 枚举默认以1 开头,而.NET 默认以0 开头,但我不明白为什么它不应该至少将它们默认映射在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2019-03-25
  • 1970-01-01
  • 2022-08-03
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多