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

How to convert a nullable datetime value to string using data reader?

我正在使用 IDataReader 界面回读 nullable datetime。到目前为止,我以前的专栏阅读按预期工作。

除了此列 ["Implementation End Timestamp"],我在其中尝试读回可为 null 的日期时间,将其转换为字符串并将其分配给名为 Implementation_End_String.[=19 的字符串 属性 =]

这就是我尝试过的。首先回读 DateTime? 值检查是否为 null,然后如果不为 null 则尝试转换 toString()。

但由于他们是 "no explicit conversion between string and 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

我想我需要获取 DateTime 的 value 才能在其上调用 toString()。

问题:

如何将读回的 DateTime? 值转换为字符串类型?

每个 Nullable<T> 类型都有 GetValueOrDefault 方法。如果没有值,您可以使用此方法检索 T 的值或默认值(在您的情况下为 DateTime.MinValue)。此方法将 return 纯 DateTime 对象,因此您可以在其上调用任何 ToString() 方法。

IDataReader 是一个相当古老的接口,因此不支持本机可为 null 的类型。如果你倾向于在你的代码中的很多地方使用它,你最好创建一些帮助程序,这将显着减少你的代码。例如,这里是 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") ?? "";