处理DateTime DBNull

Mik*_*lls 8 c# datetime dbnull

我已经在SO上看过很多很多这样的版本,但是它们似乎都不能满足我的需求.

我的数据来自供应商数据库,该数据库允许DateTime字段为null.首先,我将数据拉入DataTable.

using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn))
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
    da.Fill(dt);
}
Run Code Online (Sandbox Code Playgroud)

我正在将DataTable转换为List <>进行处理.

var equipment = from i in dt.AsEnumerable()
    select new Equipment()
    {
        Id = i.Field<string>("ID"),
        BeginDate = i.Field<DateTime>("BeginDate"),
        EndDate = i.Field<DateTime>("EndDate"),
        EstimatedLife = i.Field<double>("EstimatedLife")
    }
Run Code Online (Sandbox Code Playgroud)

那么,在这个实例中如何检查DBNull?我试着写一个方法.

    public DateTime CheckDBNull(object dateTime)
    {
        if (dateTime == DBNull.Value)
            return DateTime.MinValue;
        else
            return (DateTime)dateTime;
    }
Run Code Online (Sandbox Code Playgroud)

aba*_*hev 7

使用 IsDBNull()

System.Convert.IsDBNull(value);
Run Code Online (Sandbox Code Playgroud)

或者如果你有 SqlDataReader

reader.IsDBNull(ordinal);
Run Code Online (Sandbox Code Playgroud)

并使您的DateTime属性可以为空(DateTime?)并设置nullDBNull.Field<T>()会自动执行此操作.


Sco*_*ain 7

一种可能的选择是使用语法将其存储为可以为空的日期时间 DateTime?

以下是MSDN关于使用可空类型的链接


Jor*_*dan 5

我发现处理这个问题的最简单方法是使用“as”关键字将字段转换为您的数据类型。这对于可以为 null 的数据库字段非常有用,并且非常简单。

这里有更多细节:直接转换 vs 'as' 运算符?

例子:

    IDataRecord record = FromSomeSqlQuerySource;
    string nullableString;
    DateTime? nullableDateTime;

    nullableString = record["StringFromRecord"] as string;
    nullableDateTime = record["DateTimeFromRecord"] as DateTime?;
Run Code Online (Sandbox Code Playgroud)