代码之家  ›  专栏  ›  技术社区  ›  Eric

SQL空转换为from,有什么问题吗?

  •  2
  • Eric  · 技术社区  · 15 年前

    这似乎对我有用,但我想知道是否有什么问题

     class Test
        {
            public int PKId { get; set; }
            public string RequiredString { get; set; }
            public int RequiredInt { get; set; }
            public decimal RequiredMoney { get; set; }
            public bool RequiredBool { get; set; }
            public DateTime RequiredDate { get; set; }
            public string NullableString { get; set; }
            public int? NullableInt { get; set; }
            public decimal? NullableMoney { get; set; }
            public bool? NullableBool { get; set; }
            public DateTime? NullableDate { get; set; }
        }
    

    只要涉及到空值,testDatabase就与类匹配。

      static internal T NullConvertFromDB<T>(object value) 
            {
                if (value.Equals(DBNull.Value))
                {
                    return default(T);
                }
                else
                {
                    return (T)value;
                }
            }
    
            static internal object NullConvertToDB<T>(object value)
            {
                if (value == null)
                    return System.DBNull.Value;
                else
                    return (T)value;
            }
    

    在检索我使用的数据时

     Test test = new Test();
                            test.PKId = dr.GetInt32(0);
                            test.RequiredString = dr.GetString(1);
                            test.RequiredInt = dr.GetInt32(2);
                            test.RequiredMoney = (decimal)dr.GetSqlMoney(3);
                            test.RequiredBool = dr.GetBoolean(4);
                            test.RequiredDate = dr.GetDateTime(5);
                            test.NullableString = NullConvertFromDB<string>(dr[6]);
                            test.NullableInt = NullConvertFromDB<int?>(dr[7]);
                            test.NullableMoney = NullConvertFromDB<decimal?>(dr[8]);
                            test.NullableBool = NullConvertFromDB<bool?>(dr[9]);
                            test.NullableDate = NullConvertFromDB<DateTime?>(dr[10]);
    

    插入我使用的

     cmd.Parameters.AddWithValue("@RequiredString", test.RequiredString);
                        cmd.Parameters.AddWithValue("@RequiredInt", test.RequiredInt);
                        cmd.Parameters.AddWithValue("@RequiredMoney", test.RequiredMoney);
                        cmd.Parameters.AddWithValue("@RequiredBool", test.RequiredBool);
                        cmd.Parameters.AddWithValue("@RequiredDate", test.RequiredDate);
                        cmd.Parameters.AddWithValue("@NullableString", NullConvertToDB<string>(test.NullableString));
                        cmd.Parameters.AddWithValue("@NullableInt", NullConvertToDB<int?>(test.NullableInt));
                        cmd.Parameters.AddWithValue("@NullableMoney", NullConvertToDB<decimal?>(test.NullableMoney));
                        cmd.Parameters.AddWithValue("@NullableBool", NullConvertToDB<bool?>(test.NullableBool));
                        cmd.Parameters.AddWithValue("@NullableDate", NullConvertToDB<DateTime?>(test.NullableDate));
    

    这很好,但是我想知道在我的DAL中实现之前是否有什么需要注意的。

    当做

    _埃里克

    1 回复  |  直到 15 年前
        1
  •  1
  •   Marc Gravell    15 年前

    作为一件小事, is 可能会更有效率:

    if (value == null || value is DBNull) {... null code...}
    

    作为一个 第二 我不喜欢这样的事实 T=int 你会得到 0 对于空值;我想要一个错误。我很想用:

    return (T)(object)null;
    

    对于引用类型和 Nullable<T> 正确,并为 int 等。


    ConvertToDb ,和 return (T)value; 是多余的,因为你真的回来了 object ;你也可以:

    return value ?? DBNull.Value;
    

    (在两种情况下)


    所以:

        static internal T NullConvertFromDB<T>(object value) 
        {
            if (value == null || value is DBNull)
            {
                return (T)(object)null;
            }
            return (T)value;
        }
    
        static internal object NullConvertToDB<T>(object value)
        {
            return value ?? DBNull.Value;
        }