使用可空的 DateTime

4

我正在使用LINQ,有一些属性是DateTime?类型。

如果我现在想要添加来自文本框的值,似乎无法使其工作。

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ScoringLastUpgrade", DbType="Date")]
public System.Nullable<System.DateTime> ScoringLastUpgrade

我使用的文本框已经通过JavaScript确保了格式为'2011-06-17'。

但是,现在当我尝试执行以下操作时:

myObject.ScoringLastUpgrade = Convert.ToDateTime(txtScoringUpgradeDate.Text).ToShortDateString();

我收到这个错误信息:“无法将字符串类型转换为DateTime类型?”
如何解决这个问题?
4个回答

3
.ToShortDateString()方法将其转换为字符串,您应该删除该调用。
另外,您说您已经使用javascript确保了格式。如果用户没有javascript,您也应该进行服务器端检查。此外,由于它是在给定的格式中,您可以使用DateTime.ParseExactDateTime.TryParseExact(所以无效的格式不会抛出异常),因为它更有效率。(格式字符串应该是"yyyy-MM-dd")。

2
不要使用'ToShortDateTimeString'将其转换为字符串,只需设置Convert.ToDateTime的结果即可:
myObject.ScoringLastUpgrade = Convert.ToDateTime(txtScoringUpgradeDate.Text);

假设您已经对txtScoringUpgradeDate.Text进行了充分的验证?

在处理这些类型转换时,我的首选方法是使用TryParse方法,例如:

DateTime date;
if (DateTime.TryParse(txtScoringUpgradeDate.Text, out date))
    myObject.ScoringLastUpgrade = date;
Convert.ToDateTimeDateTime.Parse一样,当遇到异常值时会抛出InvalidCastException。最好使您的代码具有容错性,而不是不必要地捕获异常。 更新:根据您的最后一条评论:
在这种情况下,您不应返回DateTime.MinValue,因为MinValue小于datetime列支持的最小值。CLR DateTime支持0000-01-01开始的日期范围,而SQL datetime(以及比较的CLR SqlDateTime类型)支持最小值为1753-01-01。由于它是一个可空的DateTime,所以应将其设置为null:
public static DateTime? ToNullableDateTime(this string date)
{
    DateTime dateTime;
    return (DateTime.TryParse(date, out dateTime))
        ? (DateTime?)dateTime
        : null;
}

但是如果数据库数据类型是日期,这会成为一个问题吗? - Andreas
在这种情况下,DateTime 是等效的 CLR 数据类型。无论数据库使用 datetime 还是 datetime,Linq to Sql 引擎都会为您映射适当的值。此外,除了如何获取有效的 DateTime 值以填充 DateTime? 属性之外,您并没有做任何不同的事情。 - Matthew Abbott
我决定将其制作成一个扩展方法,这样我就可以在任何地方使用它了。public static DateTime toDateTime(this TextBox aTextBox) { DateTime date; if (aTextBox.Text != string.Empty) { if(DateTime.TryParse(aTextBox.Text, out date)) { return date; } } return System.DateTime.MinValue; }这应该是正确的做法,对吧? - Andreas

0
问题在于您在末尾放置了 ToShortDateString(),实际上将 DateTime 再次转换为 string。请尝试删除该行的这一部分。

0
在我的情况下(.cshtml):
<td>@item.InvoiceDate.Value.ToShortDateString().ToString()</td>

InvoiceDtae 在数据库中是可空日期


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接