C # SQL NULL преобразовать в-из, какие-либо проблемы с этим? - PullRequest
2 голосов
/ 17 ноября 2010

Это, кажется, работает для меня, но мне было интересно, есть ли какие-либо проблемы с ним

 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.

Привет

_Eric

1 Ответ

1 голос
/ 17 ноября 2010

Как незначительная вещь, 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;
    }
...