Как проверить, не был ли назначен объект DateTime? - PullRequest
2 голосов
/ 05 июля 2011

Итак, прежде всего. Код: У меня есть класс:

public class Myobject
{
    public string Code { get; set; }
    public DateTime? StartDate { get; set; }
}

И это часть очень простого источника:

MyObject mo = new MyObject();
mo.Code= "sth";
// NO action on StartDate property! 

    if (mo.StartDate.HasValue)
    {
        sc.Parameters.Add(new SqlParameter("@inStartDate", mo.StartDate.Value));
    }
    else
    {
        sc.Parameters.Add(new SqlParameter("@inStartDate", DBNull.Value));
    }

Простое 'if' - Sql Server 2008, выдавать ошибку - когда получает значение Datetime (значение должно быть DBNull.Value) Поэтому я хочу сначала проверить это, а затем передать правильное значение или DBNull.

Моя проблема в том, что «если» всегда повторяет истину! Зачем!?

Также пробовал это:

if (mo.StartDate.Value == null)

но всегда возвращает false. Почему это не ноль? Он даже не был создан ..

Итак .. Как проверить, не был ли назначен объект DateTime?

Ответы [ 5 ]

5 голосов
/ 05 июля 2011

Попробуйте это:


if (mo.StartDate.GetValueOrDefault() != DateTime.MinValue) 
{
  // True - mo.StartDate has value
}
else
{
  // False - mo.StartDate doesn't have value
}

2 голосов
/ 05 июля 2011

просто надо уметь

mo.StartDate != null 

вместо

mo.StartDate.Value != null
0 голосов
/ 05 июля 2011

.HasValue и ==null - это способы проверить, присвоено ли DateTime? значение или нет. Вы делаете это правильно. В другом месте может быть проблема, что .HasValue всегда возвращает true.

0 голосов
/ 05 июля 2011

То, как вы проверяете нулевое значение, хорошо, должно быть что-то еще, что устанавливает значение поля.


Чтобы найти поле для настройки, вы можете щелкнуть по нему правой кнопкой мыши, затем найти все ссылки и отсканировать список для любых назначений.

Если это не удастся, вы можете временно изменить его на явно заданное свойство и установить точку останова в методе set, тогда выполнение будет приостановлено всякий раз, когда установлено значение, и вы сможете искать в стеке вызовов.

0 голосов
/ 05 июля 2011

Выполнение простейшего теста с этим классом (в том виде, в каком вы его представляли) выдает false:

        var mo = new Myobject();

        Console.WriteLine(mo.StartDate.HasValue);

Вывод False.

Я бы поставил точку останова на вашем конструкторе (если выесть один), убедитесь, что больше ничего не назначено, и пройдитесь по любым методам, вызываемым по пути, чтобы убедиться, что нет ничего другого, устанавливающего свойство, которое может быть не сразу очевидным ...

Можете ли вы опубликовать больше кодавозможно?Должно быть что-то в коде, который не был опубликован при установке свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...