C # ??вопрос об операторе слияния - PullRequest
8 голосов
/ 06 августа 2010

Я определил класс Персона свойство День рождения как обнуляемый DateTime? , так почему же в следующем примере не должен работать нулевой оператор объединения

cmd.Parameters.Add(new SqlParameter("@Birthday",
   SqlDbType.SmallDateTime)).Value =       
     person.Birthday ?? DBNull.Value; 

Я получил сообщение об ошибке "Оператор" ?? не может быть применен к операндам типа 'System.DateTime?' и 'System.DBNull' "

Следующее также получило ошибку компиляции:

cmd.Parameters.Add(new SqlParameter("@Birthday", 
  SqlDbType.SmallDateTime)).Value = 
   (person.Birthday == null) ? person.Birthday:DBNull.Value;

Я добавил приведение к (объекту) в соответствии с рекомендациями Refactor, и оно скомпилировалось, но оно не сработало должным образом, и значение было сохранено в базе данных sqlserver как 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;

Ответы [ 3 ]

22 голосов
/ 06 августа 2010

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

В вашем случае вы можете сделать person.Birthday ?? (object)DBNull.Value, чтобы передать значение типа object через Add()

4 голосов
/ 06 августа 2010

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

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

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

3 голосов
/ 06 августа 2010

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

...