如何使用数据读取器将可空日期时间值转换为字符串?

时间:2016-10-13 19:54:19

标签: c# datetime dbnull idatareader

我正在使用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?值转换为字符串类型?

2 个答案:

答案 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") ?? "";