问题描述
||
我有两个函数,在构造函数中,我从数据库中读取并调用了所有集合函数:
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\"));
}