我正在使用nullable datetime
界面回读IDataReader
。到目前为止,我之前的专栏文章正在按预期工作。
除了这个列["Implementation End Timestamp"]
,我尝试回读一个可以为空的日期时间,将其转换为字符串并将其分配给名为Implementation_End_String
的字符串属性。
所以这就是我的尝试。首先读回DateTime?
值检查null然后尝试转换为toString(),如果不为null。
但由于这些作业是"字符串和日期时间之间没有明确的转换,因此不允许这项作业?":
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
我想我需要让DateTime的value
来调用toString()。
问题:
如何将回读DateTime?
值转换为字符串类型?
答案 0 :(得分:3)
每个Nullable<T>
类型都有GetValueOrDefault
方法。如果没有值,您可以使用此方法检索T
的值或默认值(在您的情况下,它将是DateTime.MinValue
)。此方法将返回普通DateTime
对象,因此您可以在其上调用任何ToString()
方法。
答案 1 :(得分:3)
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 null conditional operator结合使用会使任务变得简单:
Implementation_End_String = dataReader
.GetNullableDateTime("Implementation End Timestamp")?.ToString("d-MMMM-yyyy") ?? "";