Самый эффективный способ работы с DBNull в .NET

Возможный дубликат:
Что лучший способ справиться с DBNull's

Каков наиболее эффективный синтаксис в .NET для установки переменной, имеющей значение DBNull (то есть возвращаемое значение SQL null)? Я помню, как читал кое-что, что было помещено в .NET 3.0 для такого рода вещей. Предположим, что устанавливаемая мной переменная имеет тип DateTime.

Распространенная ошибка:
Преобразование типа «DBNull» в тип «Дата» недопустимо.


person MacGyver    schedule 14.10.2011    source источник


Ответы (2)


DateTime - это тип значения, который может содержать только допустимую дату и время. Обычно это делается путем проверки вашего значения, возвращаемого из базы данных, чтобы узнать, есть ли оно DBNull.Value, и если да, установите DateTime на специальное значение, такое как DateTime.MinValue, которое представляет Null.

В качестве альтернативы вы можете использовать DateTime? который является типом данных DateTime, допускающим значение NULL, и вы можете фактически присвоить ему значение NULL (обычный .Net null, а не DBNull).

DateTime foo;
if (row["SomeField"] == DBNull.Value) {
    foo = DateTime.MinValue;
} else {
    foo = (DateTime)row["SomeField"];
}

Вы можете сделать этот синтаксис немного лучше, создав метод расширения для DataRow следующим образом:

public static void ToDateTime(this DataRow row, string columnName) {
    if (row[columnName] == DBNull.Value) {
        return DateTime.MinValue;
    } else {
        return (DateTime)row[columnName];
    }
}

то вы можете переписать исходный код следующим образом:

DateTime foo = row.ToDateTime("SomeField");
person Dylan Smith    schedule 14.10.2011

Обычно я обхожу это, делая свойство в моем классе типом NULLABLE. Это особенно актуально для типа bool, поскольку по умолчанию он не имеет значения (ни истина, ни ложь).

public class MyDbTable
    {
        public int MyId { get; set; }
        public DateTime? Date { get; set; }
        public bool? IsDirty { get; set; }
    }
person Patrick Pitre    schedule 14.10.2011