读取SqlDataReader时检查空白日期

时间:2012-05-29 15:43:15

标签: c# ado.net

我用数据库中的结果通过sqlDataReader填充我的对象,如下所示:

foreach (DataRow dr in dt.Rows)
{
  wt = new WorkTasksDto
  {
    CompletedBy = dr.IsNull("CompletedBy") ? (DateTime?)null : (DateTime?)dr["CompletedBy"]
  };
}

正如您可以看到我正在检查DbNUll,但我的日期字段的一条记录是空白的。不是null,就像一个空的varchar字段,当我尝试进行我的DateTime强制转换时,我得到一个无效的强制转换错误。

如何检查空白字段以及DbNull字段?

3 个答案:

答案 0 :(得分:1)

不是很干净,但这似乎有效。

foreach (DataRow dr in dt.Rows)                  
{                       
     DateTime myDate;
     if(dr.IsNull("CompletedBy")) 
         myDate = DateTime.MinValue;
     else
     {
         if(DateTime.TryParse(dr["CompletedBy"].ToString(), out myDate) == false)
             myDate = DateTime.MinValue;
     }
     wt = new WorkTasksDto                              
     {                                  
         CompletedBy = (myDate == DateTime.MinValue ? null : myDate);
     };         
} 

答案 1 :(得分:1)

如果列类型为DateTime,则值不能为“空白”。 如果列类型为string,则应检查null和空白,然后解析值而不是强制转换:

CompletedBy = dr["CompletedBy"] == null || dr["CompletedBy"] == "" ?
              null : 
              DateTime.Parse(dr["CompletedBy"], CultureInfo.InvariantCulture);

如果您知道有其他值不是空白而无法解析为DateTime使用TryParse

如果列类型为object并且您混合了不同的类型,则需要首先验证类型而不是强制转换。

CompletedBy = dr["CompletedBy"] != null && dr["CompletedBy"] is DateTime ?
              (DateTime)dr["CompletedBy"] : 
              null;

答案 2 :(得分:0)

使用DateTime.TryParse() http://msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspx

DateTime completedDate;

DateTime.TryParse(reader["CompletedDate"].ToString(), out completedDate);

if(completedDate == DateTime.MinValue)
{

}