我有两个函数,在我的构造函数中,我从数据库中读取并调用我所有的集合函数:
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; }
}
使用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.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
是一个值类型,而不是引用类型,并且不能有一个空的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"));
}