字符串未被识别为有效的DateTime

本文关键字:有效 DateTime 识别 字符串 | 更新日期: 2023-09-27 18:25:30

当我的列的一个数据表具有null值时,我收到了此异常。比方说我确实想允许null值或类似的东西,我该如何解决这个问题?

字符串未被识别为有效的DateTime。

这是我的密码。

     foreach (DataRow row in ds.Tables[0].Rows)
                {
     row["Effective_Period"] = Convert.ToDateTime(row["Effect_Date_From"].ToString()).ToString("dd/MM/yyyy") 
+ " - " +  Convert.ToDateTime(row["Effect_Date_To"].ToString()).ToString("dd/MM/yyyy");
    }

在我的ds表中,这是我的专栏

----------------------
Effective_Period
---------------------
10/2/2012 - 20/3/2012
---------------------
---------------------
---------------------

字符串未被识别为有效的DateTime

可能的解决方案:

foreach (DataRow row in ds.Tables[0].Rows)
{
    DateTime effectiveDateFrom;
    DateTime effectiveDateTo;
    if (!DateTime.TryParse(row["Effect_Date_From"], out effectiveDateFrom)
        effectiveDateFrom = DateTime.MinValue;
    if (!DateTime.TryParse(row["Effect_Date_To"], out effectiveDateTo)
        effectiveDateTo = DateTime.MinValue;
    row["Effective_Period"] = effectiveDateFrom.ToString("dd/MM/yyyy") + " - " +  effectiveDateTo.ToString("dd/MM/yyyy");
}

如果要允许NULL,则在数据库表中将字段设为NULLABLE。然后,它将允许在没有任何问题的情况下插入NULL值。

此外,如果您希望允许如您所示的值,则必须将字段设置为nvarchar,因为这不会被识别为有效的DateTime

另一个重要的注意事项是,您可以轻松地为from到句点创建两个单独的列,并分别在这两个列中存储DateTime值,而不是像这样存储。这也将为您提供根据所需日期查询数据和筛选数据的优势。

更新:

如果您传递NULL并使用.ToString(),也会收到此异常。因此,在使用.ToString()之前,请确保您在这里传递了一些内容,无论是日期还是字符串。在后端,您可以根据自己的喜好修改数据类型。

这里要做的一件好事是在使用.ToString()进行转换之前实现一个null检查如果为null,则可以直接传递null;如果不是,则可以转换值,然后传递该值。

希望这能有所帮助。

使用DateTime.TryParse可以帮助您检查是否存在无效日期,并相应地调整业务逻辑。

https://msdn.microsoft.com/en-us/library/system.datetime.tryparse(v=vs.110).aspx

Null没有ToString()函数,因此如果您希望结果为Null,则必须确保不会对其调用函数。

您可能希望在DateTime定义的C#表示中反映可为null的选项:

Nullable<DateTime> value;
// or
DateTime? value;

这两种形式是等价的。

当然,当使用C#中的值时,您必须定义在null上做什么,并且不能依赖一些神奇的null.ToString()来进行转换。

你可能也想看看这个问题。本质:使用row.Field<DateTime?>("Effect_Date_From")从数据行中获取可为null的DateTime

尝试:

 foreach (DataRow row in ds.Tables[0].Rows)
            {
                bool fromIsNull = DBNull.Value.Equals(row["Effect_Date_From"]);
                bool toIsNull = DBNull.Value.Equals(row["Effect_Date_To"]);
                row["Effective_Period"] = (fromIsNull ? string.Empty : Convert.ToDateTime(row["Effect_Date_From"].ToString()).ToString("dd/MM/yyyy"))
                    + (fromIsNull || toIsNull ? string.Empty : " - " )
                    + (toIsNull ? string.Empty : Convert.ToDateTime(row["Effect_Date_To"].ToString()).ToString("dd/MM/yyyy"));
            }

更新了代码以适应您的最后一条评论。这就是你隐藏/显示"-"的方式。但这完全取决于你想如何处理这个案子。