Дата, сохраненная в базе данных как NULL, возвращается как 01.01.1900, а не как DateTime.MinValue. - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть логика, которая делает следующее:

string myData =  Convert.ToDateTime(Info.ClosedDate) == DateTime.MinValue ? String.Empty : "(" + Info.ClosedDate + ")";

Он должен возвращать ClosedDate в скобках, если он не хранится в базе данных как NULL.В противном случае он должен вернуть пустую строку.

Значение Convert.ToDateTime(Info.ClosedDate) равно 01/01/1900, а значение DateTime.MinValue равно 1/1/0001 12:00:00 AM

Таким образом, условие никогда не вернется String.Empty

В настоящее время поле в объекте выглядит следующим образом:

public string ClosedDate
{
    get { return _ClosedDate; }
    set { _ClosedDate = value; }
}

Какое лучшее решение?

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Вы можете сравнить с SqlDateTime.MinValue

Convert.ToDateTime(Info.ClosedDate) == SqlDateTime.MinValue? String.Empty : "(" + Info.ClosedDate + ")";

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqltypes.sqldatetime.minvalue?view=netframework-4.7.2

0 голосов
/ 23 февраля 2019

Хотя лучше всего использовать DateTime в качестве типа для дат, ваш код должен выглядеть следующим образом:

public DateTime ClosedDate
{
    get; set;
}

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

public DateTime ClosedDate 
{
   get;
   set
   {
     Date = DateTime.Now;
   }
}

Для строки можно использовать DateTime.Parse или DateTime.ParseExact вместо Convert.ToDateTime.

Если значение равно нулю, то Parse или ParseExact возвращает ArgumentNullExceptionи таким же образом, если значение содержит какой-либо недопустимый формат даты, он возвращает FormatException.

var convertedDate = DateTime.ParseExact(dateTime, "yyyyMMdd", CultureInfo.InvariantCulture);
0 голосов
/ 23 февраля 2019

Не храните и не моделируйте DateTime типы как string.

Это относится к хранилищу данных, но также и к вашим моделям в коде.Если он может быть обнуляем в базе данных, то смоделируйте его как Nullable<DateTime> (альтернативное обозначение DateTime?) в вашем коде.Преобразуйте его в string только в последний момент, обычно на уровне представления.Если вы делаете это, нет необходимости выполнять преобразование типов при чтении / записи в хранилище данных.Вы также избегаете неоднозначности при интерпретации значения (например, , например, какое значение равно нулю или оно локализовано как "дд / мм / гггг" или "мм / дд / гггг" ).

private DateTime? _ClosedDate;
public DateTime? ClosedDate
{
    get { return _ClosedDate; }
    set { _ClosedDate = value; }
}

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

Если вы не увереныКак передать экземпляр DateTime в запрос ADO.NET в качестве параметра в его собственном формате, просмотрите этот предыдущий вопрос / ответ: Как добавить введенные пользователем данные в оператор SQL?

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