在C#中将字符串转换为日期时间时出现null值异常

本文关键字:null 异常 时间 日期 字符串 转换 | 更新日期: 2023-09-27 18:04:48

我使用以下代码

 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());
}

或者我应该在异常时将所有日期分配为null?!

在单行中还有其他方法吗?比如tryparse什么的?

在C#中将字符串转换为日期时间时出现null值异常

我会努力发挥创意。您可以将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());

这可能是你的一句话。

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

注意:在null上调用ToString()会抛出NullReferenceException,因此在转换之前需要检查null的值。

试试这个:

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

您可以像这个一样检查值是否为空

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?