C#?? пустой вопрос об операторе объединения

Я определил День рождения свойства 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;
8
задан Lill Lansey 6 August 2010 в 16:17
поделиться

3 ответа

Проблема в том, что DateTime? и DBNull.Value не одного типа, поэтому вы не можете использовать для них нулевой оператор объединения.

В вашем случае можно сделать человек. День рождения ?? (объект) DBNull.Value для передачи значения типа объект через Add ()

22
ответ дан 5 December 2019 в 05:44
поделиться

Я предпочитаю перебирать параметры непосредственно перед выполнением запроса, заменяя все экземпляры null на DBNull, например:

foreach (IDataParameter param in cmd.Parameters)
    if (param.Value == null)
        param.Value = DBNull.Value;

Это позволяет мне оставлять нулевые значения как есть и просто массово заменять их позже.

4
ответ дан 5 December 2019 в 05:44
поделиться

Ваша первая проблема заключается в том, что для оператора ?? или ?: объекты для любого выбора должны быть одного типа. Вот они другого типа.

3
ответ дан 5 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: