zoukankan      html  css  js  c++  java
  • 可空枚举的处理方法

    可空枚举

    在使用枚举的时候的,经常希望可以对枚举赋值为Null,或者清空枚举值。但是常用的枚举,就是固定的几项。而且不能对值类型赋值为Null。如何来实现可空枚举?

    要求保留到数据库中的值,需要为NULL。这种情况在业务开发中经常出现。

    尽管问题较小,但是可以探讨下解决方案,找到一种最优解。

    方法1:将存储值定义可空类型

            /// <summary>
    /// 单据状态,记录枚举值
    /// </summary>
    public int? State { get; set; }

    可行,如果为空,则数据库存储的值也为Null.

    缺点:不方便我们对枚举进行展现和赋值,通常直接使用枚举,参见方法2。

    方法2:定义枚举字段,并将其定义为可空类型

            /// <summary>
    /// 状态
    /// </summary>
    public RecordState? State { get; set; }

    这种方法较上面的方法较好,同样能够实现此功能。

    缺点:通常枚举值的展现是展现枚举的所有项,一般使用下拉框,必须选中一项。这样无法实现可空情况。如果要实现所需功能,需要在显示时,做下处理,加入空项。

    方法3:在枚举中定义空项,并在写入数据库,或取值时进行的相关的转换

    3.1 定义枚举:

        /// <summary>
    /// 记录状态
    /// </summary>
    public enum RecordState
    {
    /// <summary>
    ///
    /// </summary>
    None,
    /// <summary>
    /// 新增
    /// </summary>
    New,
    /// <summary>
    /// 修改
    /// </summary>
    Modified,
    /// <summary>
    /// 删除
    /// </summary>
    Deleted
    }

    3.2 使用枚举:

        /// <summary>
    /// 单据
    /// </summary>
    public class Doc
    {
    /// <summary>
    /// 单据
    /// </summary>
    public string DocNo { get; set; }
    /// <summary>
    /// 单据状态
    /// </summary>
    public RecordState State { get; set; }
    /// <summary>
    /// 构造函数
    /// </summary>
    public Doc()
    {

    }
    }

    下面是数据时需要特别注意的:

    写入数据库时,处理情况,参数赋值情况,这样其数据库的值才为NULL,

                SqlParameter param = new SqlParameter("State",SqlDbType.SmallInt);
    if (doc.State == RecordState.None)
    {
    param.Value = DBNull.Value;
    }
    else
    {
    param.Value = doc.State;
    }


    加载对象时:加载出来又是枚举项

                //SqlDataReader reader
    Doc doc = new Doc();
    if (reader["State"] == DBNull.Value)
    {
    doc.State = RecordState.None;
    }
    else
    {
    doc.State =(RecordState)reader.GetInt16(reader.GetOrdinal("State"));
    }



  • 相关阅读:
    ARC081F Flip and Rectangles
    LCA
    Tarjan
    2020牛客暑期多校六
    状压DP
    操作系统
    JAVA期末复习
    D. Yet Another Yet Another Task (区间最值)
    构造
    Codeforces Round #641 (Div. 2)
  • 原文地址:https://www.cnblogs.com/yank/p/2185273.html
Copyright © 2011-2022 走看看