代码之家  ›  专栏  ›  技术社区  ›  Ashish Gupta Shiva

代码检查-从SqlDataReader检索数据

  •  2
  • Ashish Gupta Shiva  · 技术社区  · 14 年前

    b) 在下面的代码中检查enum和bool是正确的还是有更好的方法?

     public static List<ClassA> Select(string connectionString)
            {
                List<ClassA> ClassAList = new List<ClassA>();
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    con.Open();
                    using (SqlCommand command = new SqlCommand(SPROC_ClassA_Select, con))
                    {
    
                        using (SqlDataReader reader = command.ExecuteReader())
                        {
                            int MyGuidOrdinal   = reader.GetOrdinal("MyGuid") ;
                            int MyStringOrdinal = reader.GetOrdinal("MyString") ;
                            int MyDateTimeOrdinal = reader.GetOrdinal("MyDateTime") ;
                            int MyBooleanOrdinal    = reader.GetOrdinal("MyBoolean") ;
                            int MyEnumValueOrdinal  = reader.GetOrdinal("MyEnumValue") ;
    
                            if(reader.HasRows)
                            {
                                while (reader.Read())
                                {
                                    ClassA classA = new ClassA
                                    {
                                        MyGuid = reader.GetGuid(MyGuidOrdinal),
                                        MyString = reader["MyString"] is DBNull ? null : reader.GetString(MyStringOrdinal),
                                        MyDateTime = reader["MyDateTime"] is DBNull ? DateTime.MinValue : reader.GetDateTime(MyDateTimeOrdinal),                         
                                        MyBoolean = reader["MyBoolean"] is DBNull ? false : reader.GetBoolean(MyBooleanOrdinal),          
                                        MyEnumValue = reader["MyEnumValue"] is DBNull ? (int)MyEnumValue.Value1 : reader.GetInt32(MyEnumValueOrdinal),
    
                                    };
    
                                    ClassAList.Add(classA);
                                }
                            }
                            return ClassAList;
    
                        }
    
    
                    }
                }
    

    下面是enum:-

    public enum MyEnumValue 
    {
     value1 =1,
     value2
    }
    
    6 回复  |  直到 14 年前
        1
  •  3
  •   BlueMonkMN    14 年前

    另外,如果您使用reader.IsDBNull()之类的工具来检查空值,代码不是更好一点吗?

        2
  •  3
  •   MrFox    14 年前

    b) 如果false是一个有效的默认值,那么bool很好,否则使其为空。使用GetByte获取枚举并将其强制转换为枚举类型。

    (MyEnumValue)reader.GetByte(MyEnumValueOrdinal)
    

        3
  •  2
  •   VladV    14 年前

    当可空属性对应于数据库中的可空列时,可以很好地使用它们。

    以下代码与您的代码基本相同,但较短:

    MyString = reader["MyString"] is DBNull ? null : (string)reader["MyString"]
    
        4
  •  1
  •   Dr Herbie    14 年前

    将false作为DBNull的表示形式可能与您的业务逻辑相匹配,如果不匹配,那么我将再次使用可为null的类型。

    枚举强制转换可能会让您感到困惑--您可能需要使用 Enum.IsDefined(typeof(MyEnumValue), reader["MyEnumValue"])

    此外,我会将所有字段名定义为字符串常量,以避免键入错误(intellisense也会增强自动完成功能)。

        5
  •  0
  •   Meff    14 年前

    另外,在使用DateTime.MinValue时,调用者可能会觉得某个东西正在出售(例如,它的“出售开始”日期是MinValue),而实际上它在数据库中为空,以防止它被出售。

    public enum MyEnumValue 
    {
     ItWasNullInTheDB = 0,
     value1 =1,
     value2
    }
    
        6
  •  0
  •   Matej    14 年前

    Enum 因为有效的基类型是 byte , sbyte short , ushort int , uint , long ,或 ulong 默认类型为 内景 - Int32 因此,使用默认枚举的代码是安全的。 SQL Server不支持无符号类型,因此您只需关心long- Int64 .