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

本文关键字:方法 set minvalue datetime get 数据库 null | 更新日期: 2023-09-27 17:50:18

我有两个函数,在我的构造函数中,我从数据库中读取并调用我所有的集合函数:

while (reader.Read())
{
    Status = reader["status"].ToString();
    Event_Start_Date1 = reader.GetDateTime(reader.GetOrdinal("event_start_date1"));
}

我的get和set方法状态工作正常。然而,对于日期字段,我得到一个错误,因为有时字段来自数据库是一个NULL值。我将如何修改我的方法来分配最小值在数据库返回NULL?

public DateTime Event_Start_Date1
{
    get
    { return event_start_date1; }
    set
    { event_start_date1 = value; }
}

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

使用DataReader。IsDBNull检查值是否为空:

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;
    }
}

这假定您不能更改模型。如果您有此选项,请使用Nullable<DateTime>代替,并将GetDateTimeValue方法默认为返回null

使用一个可空的DateTime:

public DateTime? EventStartDate { get; set; }

类似于:

public Nullable<DateTime> EventStartDate { get; set; }

阅读更多关于可空类型

要获取DateTime的默认值,您可以使用DateTime.MinValuedefault(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是一个值类型,而不是引用类型,并且不能有一个空的DateTime(或任何其他值类型)编译时变量,为了使它能够保存空值,它必须被包装在Nullable<T>中。
在。net中,所有非空类型都有一个默认值,该值可以通过default关键字获得(例如default(DateTime))。

可以使用try-catch

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"));
}