Как преобразовать обнуляемое значение даты и времени в строку, используя средство чтения данных?
Я читаю обратно 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") ?? "";