字符串未被识别为有效的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
---------------------
---------------------
---------------------
可能的解决方案:
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"));
}
更新了代码以适应您的最后一条评论。这就是你隐藏/显示"-"的方式。但这完全取决于你想如何处理这个案子。