在C#上将字符串转换为日期时间为空值异常

时间:2014-05-23 07:21:58

标签: c# asp.net .net

我使用以下代码

 extensionRequest[i].EndDate = DateTime.Parse(dsResult.Tables[0].Rows[i]["ActualEndDate"].ToString());
 extensionRequest[i].ExtendedEndDate = DateTime.Parse(dsResult.Tables[0].Rows[i]["ExtendedEndDate"].ToString());
 extensionRequest[i].ReceivedDate =Convert.ToDateTime(dsResult.Tables[0].Rows[i]["dReceivedOn"].ToString());

当值来自数据库时,这可以正常工作 但是当返回NULL值时,它会抛出异常!!

我应该检查所有三个值的值,如下面的代码

if (dsResult.Tables[0].Rows[i]["dReceivedOn"].ToString()==null){
extensionRequest[i].ReceivedDate="";
}
else{
extensionRequest[i].ReceivedDate =Convert.ToDateTime(dsResult.Tables[0].Rows[i]["dReceivedOn"].ToString());
}

或者我应该在例外时将所有日期指定为空?!

还有其他方法可以单线吗?像tryparse或其他什么?

3 个答案:

答案 0 :(得分:3)

我会尝试创造性。您可以将Nullable TryParse创建为Extension Method版本:

public static DateTime? TryParseNullable(this DateTime dateTime, string val)
{
    DateTime outValue;
    return DateTime.TryParse(val, out outValue) ? (DateTime?) outValue : null;
}

然后使用:

extensionRequest[i].EndDate = DateTime.TryParseNullable(dsResult.Tables[0].Rows[i]["ActualEndDate"].ToString());

这可能是你的一个班轮。

答案 1 :(得分:2)

您可以使用DateTime.TryParse()方法在成功转换时返回true,否则返回false

注意:在ToString()上调用nullNullReferenceException,因此您需要在转化前检查null值。

试试这个:

 if(dsResult.Tables[0].Rows[i]["ActualEndDate"] != null)
    DateTime.TryParse(dsResult.Tables[0].Rows[i]["ActualEndDate"].ToString(),
                                             out extensionRequest[i].EndDate);

答案 2 :(得分:1)

您可以检查值是否为null

extensionRequest[i].EndDate = Convert.IsDbNull(dsResult.Tables[0].Rows[i]["ActualEndDate"]) ? null : Convert.ToDateTime(dsResult.Tables[0].Rows[i]["ActualEndDate"]);

我确定.ToString()不是必需的。

如果将行缓存到局部变量,它将更具可读性:

var row = dsResult.Tables[0].Rows[i];
...
extensionRequest[i].EndDate = Convert.IsDbNull(row["ActualEndDate"]) ? null : Convert.ToDateTime(row["ActualEndDate"]);

确保.EndDate和其他人允许空值。换句话说,那就是DateTime?