📜  枚举到表 C# (1)

📅  最后修改于: 2023-12-03 15:26:35.500000             🧑  作者: Mango

枚举到表 C#

什么是枚举?

枚举(Enumeration)是一种在编程中常常使用的数据类型,用于定义变量只能取预先定义好的值,枚举类型常用于代替数字或字符串。在 C# 中,枚举类型需要使用 enum 来定义。

enum WeekDays
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}
枚举到表

在实际开发中,我们经常需要将一些枚举类型转换成相应的字符串或整数,或是将字符串或整数转换成相应的枚举类型。在操作数据库时,我们通常需要将枚举类型对应到数据库中的表。

可以使用 Enum 类的 GetValues 方法获取枚举类型的所有值。

WeekDays[] values = (WeekDays[])Enum.GetValues(typeof(WeekDays));

如果需要将枚举类型转换成相应的字符串,可以使用 Enum 类的 GetName 方法。

string dayName = Enum.GetName(typeof(WeekDays), WeekDays.Monday);

如果需要将字符串转换成相应的枚举类型,可以使用 Enum 类的 Parse 方法。

WeekDays day = (WeekDays)Enum.Parse(typeof(WeekDays), "Monday");

如果需要将整数转换成相应的枚举类型,可以直接将整数赋值给枚举类型。

WeekDays day = (WeekDays)0; // Monday
枚举到表的应用

在操作数据库时,我们通常需要将枚举类型对应到数据库中的表。

例如,我们有一个枚举类型 Sex,其中 Male 表示男性,Female 表示女性。我们需要将这个枚举类型对应到数据库中的 users 表中的 sex 字段上。

enum Sex
{
    Male,
    Female
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Sex Sex { get; set; }
}

对应的数据库表为:

CREATE TABLE users
(
    id INT PRIMARY KEY IDENTITY NOT NULL,
    name VARCHAR(50) NOT NULL,
    sex INT NOT NULL
);

我们需要将 Sex 枚举类型中的 Male 和 Female 分别对应到数据库中的 0 和 1。可以为 Sex 枚举类型定义一个扩展方法 ToInt,将 Male 和 Female 分别转换成 0 和 1。

public static class SexExtensions
{
    public static int ToInt(this Sex sex)
    {
        switch (sex)
        {
            case Sex.Male:
                return 0;
            case Sex.Female:
                return 1;
            default:
                return -1;
        }
    }
}

在保存 User 对象到数据库时,我们可以将 Sex 属性通过 ToInt 方法转换成相应的整数,然后存入数据库。

using (var connection = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True"))
{
    connection.Open();

    var user = new User
    {
        Name = "Tom",
        Sex = Sex.Male
    };

    var sql = "INSERT INTO users (name, sex) VALUES (@Name, @Sex)";
    var command = new SqlCommand(sql, connection);
    command.Parameters.AddWithValue("@Name", user.Name);
    command.Parameters.AddWithValue("@Sex", user.Sex.ToInt());
    command.ExecuteNonQuery();
}

读取数据库中的 User 对象时,我们可以将 sex 字段转换成相应的 Sex 枚举类型,然后赋值给 User 对象的 Sex 属性。

using (var connection = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True"))
{
    connection.Open();

    var sql = "SELECT id, name, sex FROM users WHERE id = @Id";
    var command = new SqlCommand(sql, connection);
    command.Parameters.AddWithValue("@Id", 1);

    var reader = command.ExecuteReader();
    if (reader.Read())
    {
        var user = new User
        {
            Id = (int)reader["id"],
            Name = (string)reader["name"],
            Sex = ((int)reader["sex"]).ToEnum<Sex>()
        };
    }
}