0

我正在通过 sqlDataReader 使用来自数据库的结果填充我的对象,如下所示:

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

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

如何检查空白字段和​​ DbNull 字段?

4

3 回答 3

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);
     };         
} 
于 2012-05-29T15:56:21.093 回答
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;
于 2012-05-29T16:01:25.660 回答
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)
{

}
于 2012-05-29T15:45:38.207 回答