Проверка нулевого значения объекта 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
представляет недопустимую ссылку, где asDBNull.Value
обозначает несуществующее значение в ДЕЦИБЕЛ.DBNull.Value
- это то, что поставщики БД предоставляют для несуществующего значения в таблице.
на этом фоне (reader["fdate"].Equals(null))
неправильно использовать здесь. Вы должны проверить это с DBNull.Value
. Если он имеет тип DBNull
, или если он равен DBNull.Value
, затем назначьте то, что вам нравится.
в такой ситуации мне нравится представлять столбцы базы данных с нулевым значением с ссылочным типом (строка для 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"])