Я определил День рождения свойства Class Person как nullable DateTime?, итак, почему не был должен пустой оператор объединения работать в следующем примере?
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? DBNull.Value;
Компилятор допускает ошибку, я добрался, был "Оператор'??' не может быть применен к операндам типа 'Система. DateTime?' и 'Система. DBNull'"
Следующее также получило ошибку компиляции:
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
(person.Birthday == null) ? person.Birthday:DBNull.Value;
Я добавил, что бросок для (возражения), как рекомендуется Осуществляет рефакторинг, и он скомпилировал, но не работал правильно, и значение было сохранено в sqlserver дб как пустой указатель в обоих случаях.
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
не одного типа, поэтому вы не можете использовать для них нулевой оператор объединения.
В вашем случае можно сделать человек. День рождения ?? (объект) DBNull.Value
для передачи значения типа объект
через Add ()
Я предпочитаю перебирать параметры непосредственно перед выполнением запроса, заменяя все экземпляры null на DBNull, например:
foreach (IDataParameter param in cmd.Parameters)
if (param.Value == null)
param.Value = DBNull.Value;
Это позволяет мне оставлять нулевые значения как есть и просто массово заменять их позже.
Ваша первая проблема заключается в том, что для оператора ??
или ?:
объекты для любого выбора должны быть одного типа. Вот они другого типа.