Как преобразовать обнуляемое значение даты и времени в строку, используя средство чтения данных?

Я читаю обратно nullable datetime с использованием IDataReader интерфейс. Пока что мои предыдущие чтения в колонке работают как положено.

За исключением этого столбца ["Implementation End Timestamp"] где я пытаюсь прочитать обратно обнуляемую дату, преобразовать ее в строку и присвоить ей строковое свойство с именем Implementation_End_String,

Так вот что я попробовал. Первое чтение назад DateTime? проверка значения на ноль, затем попытка преобразования toString(), если не ноль.

Но это назначение не разрешено из-за того, что они "не имеют явного преобразования между строкой и DateTime?":

Implementation_End_String = dataReader["Implementation End Timestamp"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dataReader["Implementation End Timestamp"]).ToString("d-MMMM-yyyy"), //show full month name

Я думаю, что мне нужно получить value DateTime для вызова toString() на нем.

Вопрос:

Как я могу конвертировать прочитанное обратно DateTime? значение для типа строки?

2 ответа

Решение

Каждый Nullable<T> тип имеет GetValueOrDefault метод. Вы можете использовать этот метод для получения значения или значения по умолчанию T (в вашем случае это было бы DateTime.MinValue) если нет значения. Этот метод вернет обычный DateTime объект, так что вы можете вызвать любой ToString() методы на это.

IDataReader довольно старый интерфейс, поэтому не поддерживает нуль-нативные типы. Если вы склонны использовать его во многих местах своего кода, вам лучше создать несколько помощников, которые значительно уменьшат ваш код. Например, вот вспомогательные методы для DateTime? Вы могли бы легко сделать подобное для других типов:

public static class DataReaderExtensions
{
    public static DateTime? GetNullableDateTime(this IDataReader source, string name)
    {
        return source.GetNullableDateTime(source.GetOrdinal(name));
    }
    public static DateTime? GetNullableDateTime(this IDataReader source, int i)
    {
        return !source.IsDBNull(i) ? source.GetDateTime(i) : (DateTime?)null;
    }
}

Это, в сочетании с нулевым условным оператором C#6, сделало бы данную задачу простой:

Implementation_End_String = dataReader
    .GetNullableDateTime("Implementation End Timestamp")?.ToString("d-MMMM-yyyy") ?? "";
Другие вопросы по тегам