Howsit!
我在datareader中获取空值时遇到错误。
public List<Complaint> View_all_complaints()
{
csDAL objdal= new csDAL();
List<Complaint> oblcomplist=new List<Complaint>();
using( IDataReader dr=objdal.executespreturndr("View_all_complaints"))
{
while (dr.Read())
{
Complaint objcomp= new Complaint();
populate_reader(dr,objcomp);
oblcomplist.Add(objcomp);
}
}
return oblcomplist;
}
public void populate_reader(IDataReader dr, Complaint objcomp)
{
objcomp.ref_num = dr.GetString(0);
objcomp.type = dr.GetString(1);
objcomp.desc = dr.GetString(2);
objcomp.date = dr.GetDateTime(3);
objcomp.housenum = dr.GetInt32(4);
objcomp.streetnum = dr.GetInt32(5);
objcomp.status = dr.GetString(6);
objcomp.priority = dr.GetString(7);
objcomp.cid = dr.GetInt32(8);
if (!dr.IsDBNull(9))
{
objcomp.resolved_date = dr.GetDateTime(9);
}
}
在SQL解析日期中允许空值,这是因为只有在投诉得到解决时,它必须反映该日期,否则它应该为空。
如果dr.getdatetime(9)为null,则必须设置一个字符串“Not Resolved”
请帮忙!
答案 0 :(得分:2)
您尚未显示Complaint
类似的内容,但基本上您需要确保其resolved_date
的类型为DateTime?
,而Nullable<DateTime>
。这样您就可以优雅地建模缺失值。
至于显示它 - 您没有显示有关显示数据的位置的任何信息,但您需要以下内容:
string text = complaint.ResolvedDate.HasValue ? complaint.ResolvedDate.ToString()
: "Not Resolved";
(我已将此更改为同时使用具有惯用名称的属性...)
答案 1 :(得分:1)
IDataReader有一个“IsDBNull”方法,应该在调用GetXXX()之前调用,以防你的值不可为空。
例如:
objcomp.date = dr.GetDateTime(3);
应该是:
objcomp.date = dr.IsDBNull(3) ? DateTime.MinValue : dr.GetDateTime(3);