C # ?? нулевой оператор оператора
-
26-09-2019 - |
Вопрос
Я определил класс Человек свойство День рождения в виде Nulleble DateTime? Так почему же не должен работать оператора NULL Coalescing в следующем примере?
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? DBNull.Value;
Компилятор Err I получил был «оператор» ?? не может быть применено к операндам типа «Система». Расстояние? и «System.dbnull»
Следующее также получила ошибку компиляции:
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
(person.Birthday == null) ? person.Birthday:DBNull.Value;
Я добавил цыпочку в (объект), как рекомендовано рефактором, и он скомпилирован, но не работает должным образом, и значение хранилось в SQLSERVER DB как NULL в обоих случаях.
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? (object)DBNull.Value;
Может кто-нибудь объяснить, что здесь происходит?
Мне нужно было использовать следующий неуклюжий код:
if (person.Birthday == null)
cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value
= DBNull.Value;
else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value =
person.Birthday;
Решение
Проблема в том, что DateTime?
и DBNull.Value
не тот же тип, поэтому вы не можете использовать нулевой коамичный оператор на них.
В вашем случае вы можете сделать person.Birthday ?? (object)DBNull.Value
пройти значение типа object
сквозь Add()
Другие советы
Я предпочитаю повторять свои параметры непосредственно перед выполнением запроса, изменяя все экземпляры NULL до DBNull, например, например:
foreach (IDataParameter param in cmd.Parameters)
if (param.Value == null)
param.Value = DBNull.Value;
Это позволяет мне оставить нулевые значения как есть и просто поменяйте их Masse позже.
Ваша первая проблема в том, что для ??
или ?:
Оператор, объекты для любого из выбора должны быть одинаковым типом. Здесь они разные виды.