Вопрос

Я определил класс Человек свойство День рождения в виде 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 позже.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top