当null为数据库值时,如何在get / set方法中使用datetime最小值

问题描述

|| 我有两个函数,在构造函数中,我从数据库中读取并调用了所有集合函数
while (reader.Read())
{
    Status = reader[\"status\"].ToString();
    Event_Start_Date1 = reader.GetDateTime(reader.Getordinal(\"event_start_date1\"));
}
我的状态获取设置方法工作正常。对于日期字段,但是我收到一个错误,因为有时来自数据库的字段是NULL值。如果数据库返回NULL,我将如何修改我的方法以分配最小值?
public DateTime Event_Start_Date1
{
    get
    { return event_start_date1; }
    set
    { event_start_date1 = value; }
}
    

解决方法

使用DataReader.IsDBNull检查值是否为null:
Event_Start_Date1 = reader.IsDBNull(\"event_start_date1\") ? DateTime.MinValue : 
reader.GetDateTime(reader.GetOrdinal(\"event_start_date1\"));
上面的句子采用以下格式:   条件?接受的动作:被拒绝   行动     ,检查DBNull,然后根据其可以分配MinValue。
int ordinal = reader.GetOrdinal(\"event_start_date1\");
Event_Start_Date1 = reader.IsDBNull(ordinal)? DateTime.MinValue: reader.GetDateTime(ordinal);
    ,将逻辑包装在方法中:
private static DateTime GetDateTimeValue(SqlDataReader reader,string fieldName)
{
    int ordinal = reader.GetOrdinal(fieldName);
    return reader.IsDBNull(ordinal) ? reader.GetDateTime(ordinal) : DateTime.MinValue;
}
...并称之为:
Event_Start_Date1 = GetDateTimeValue(reader,\"event_start_date1\");
一种更通用且可重用的方法是使其成为扩展方法,该方法可以(可选)采用默认值作为输入:
public static class SqlDataReaderExtensions
{
    public static DateTime GetDateTimeValue(this SqlDataReader reader,string fieldName)
    {
        return GetDateTimeValue(reader,fieldName,DateTime.MinValue);
    }

    public static DateTime GetDateTimeValue(this SqlDataReader reader,string fieldName,DateTime defaultValue)
    {
        int ordinal = reader.GetOrdinal(fieldName);
        return reader.IsDBNull(ordinal) 
            ? reader.GetDateTime(ordinal) 
            : defaultValue;
    }
}
这假定您不能更改模型。如果您有该选项,请改用ѭ7,,并将
GetDateTimeValue
方法默认返回
null
。     ,使用可为空的DateTime:
public DateTime? EventStartDate { get; set; }
类似于:
public Nullable<DateTime> EventStartDate { get; set; }
阅读有关可空类型的更多信息 要获取DateTime的默认值,可以使用
DateTime.MinValue
default(DateTime)
while (reader.Read())
{
    Status = reader[\"status\"].ToString();
    var startDate = reader.GetOrdinal(\"event_start_date1\");
    EventStartDate = if reader.IsDBNull(startDate) ? 
                        reader.GetDateTime(ordinal) :
                        default(DateTime);
}
本质上,
DateTime
是值类型,而不是引用类型,并且不能有nullnull15ѭ(或任何其他Value Type)编译时变量,以便它能够保存其具有的null值包裹在ѭ17中)。 在.NET中,所有不可为null的类型都有一个默认值,可以通过
default
关键字(例如
default(DateTime)
)获得该默认值。     ,你可以用a20ѭ
while (reader.Read())
{
    Status = reader[\"status\"].ToString();
    try{
    Event_Start_Date1 = reader.GetDateTime(reader.GetOrdinal(\"event_start_date1\"));
    }
catch{
    Event_Start_Date1 = //some other thing
}
或者你可以用
GetSqlDateTime()
while (reader.Read())
{
    Status = reader[\"status\"].ToString();
    Event_Start_Date1 = reader.GetSqlDateTime(reader.GetOrdinal(\"event_start_date1\"));
}