Проверка нулевого значения объекта C#

Я читаю свою базу данных с помощью DataReader.

и некоторая строка не имеет значения fdate.

поэтому, когда я преобразую нулевую дату в DateTime, возникает ошибка.

Как я могу проверить поле пустым или нет?

AdsCommand cmd = conn.CreateCommand();
cmd.CommandText = "select name,fdate from abc";

AdsDataReader reader = cmd.ExecuteReader();

DateTime flsdate = (reader["fdate"].Equals(null))? Convert.ToDateTime(reader["fdate"]) : DateTime.Today;

Я пробовал с равными, но это не работает.

кто-нибудь знает, как проверить нулевой объект, чтобы избежать преобразования ошибка?

спасибо!

6 ответов


поскольку все указали вам, как решить проблему, я пытаюсь дать вам информацию о том, в чем разница между NULL и DBNull.

  • null и DBNull отличаются.

  • null Не экземпляр любого типа. DBNull-это одноэлементный класс с одним экземпляром:DBNull.Value.

  • null представляет недопустимую ссылку, где as DBNull.Value обозначает несуществующее значение в ДЕЦИБЕЛ.

  • DBNull.Value - это то, что поставщики БД предоставляют для несуществующего значения в таблице.

на этом фоне (reader["fdate"].Equals(null)) неправильно использовать здесь. Вы должны проверить это с DBNull.Value. Если он имеет тип DBNull, или если он равен DBNull.Value, затем назначьте то, что вам нравится.


Использовать DbNull:

http://forums.asp.net/t/1383849.aspx/1


в такой ситуации мне нравится представлять столбцы базы данных с нулевым значением с ссылочным типом (строка для varchar) или типом обернутого значения с нулевым значением (DateTime?). Таким образом, вы более точно представляете схему базы данных в своей программе.

Это также позволяет более чисто написать логику преобразования, используя формат:

DateTime? fdate = datareader["fdate"] as DateTime?;

это приведение завершится ошибкой в случае, если результатом datareader будет DbNull и fdate будет установлено в по умолчанию (DateTime?), который является null. В этот момент Вы можете получить свое реальное желаемое значение, проверив, имеет ли тип nullable значение или нет (fdate.HasValue), а если нет, используя значение по умолчанию - DateTime.Сегодня.


DateTime flsdate = reader["fdate"].Equals(DBNull.Value)
    ? Convert.ToDateTime(reader["fdate"])
    : DateTime.Today;

но кажется опасным, чтобы по умолчанию дата Today. Я бы сделал это вместо этого:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
    ? Convert.ToDateTime(reader["fdate"])
    : (DateTime?)null;

кроме того, если базовый tpe fdate столбец уже DateTime, не используйте System.Преобразовать:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
    ? (DateTime?)reader["fdate"])
    : null;

попробуйте следующее:

DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value
    ? DateTime.ParseExact(reader["fdate"]) 
    : DateTime.Today;

DateTime flsdate = DateTime.Today;
if(reader["fdate"] != null)
    flsdate = Convert.ToDateTime(reader["fdate"])