3

MySQL Connector for .NET を使用して、 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')

追加しようとすると、.NET と同じインデックス (の場合)を使用しようとするMyEnum.FirstValueため、データ切り捨てエラー ( )が発生します。data truncated for column COLUMN_NAME0MyEnum.FirstValue1

解決策は、すべての列挙値に追加+1するか、場合によっては拡張を行うことです。

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

値を手動で変更し、自動的に変換するはずのライブラリに変更する必要があることは、私にはまだ間違っていると感じています。

私は何か間違ったことをしていますか、またはこれに対処するデフォルトの方法はありませんか?

4

2 に答える 2

1

このように列挙型を作成できます

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

0からではなく1から始まります。

于 2012-11-23T13:38:02.907 に答える
0

.NET 列挙は、デフォルトではゼロから始まり、整数でバックアップされます (つまり、デフォルトの列挙を整数にキャストしたり戻したりすることができます)。

何が起こっているのか、MySQL データベース ドライバーが列挙値を整数にキャストし、それを挿入しようとしていると思います。

MySQL は、列挙列に挿入される整数を 1 から始まるインデックスとして扱います。

データベース列をMySQL列挙ではなく整数にすることをお勧めします。このように、ゼロは有効な値です。

または、次のように、MySQL と一致するように、列挙の最初の値を整数値 1 として宣言することもできます。

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

私はそれを言っているのは正しいと思いますしSecondValueThirdValueそれぞれ値 2 と 3 で裏付けられます。

次に、コネクタが列挙を整数にキャストすると、MySQL が期待するものと一致する 1、2、および 3 が返されます。

3 番目の方法は、両端で型をそのまま保持し、このマッピングをデータ層の関数にすることです (データ層はありますよね?)。そうすれば、これを 1 か所で処理するだけで済みます。将来の開発者にとっては少し誤解を招く可能性があります。

于 2012-11-23T13:38:18.820 に答える