我试图重复使用我一直使用的相同代码,但现在却遇到了错误。
我循环遍历各种用户表,并在那里执行此操作:
DateTime dcdt = (DateTime)u.DateCreated;
DateTime lldt = (DateTime)u.LastLogon;
userRow["DateCreated"] = dcdt.ToShortDateString();
循环内部。我收到错误:
System.InvalidOperationException: Nullable object must have a value.
错误突出显示" lldt"行,而不是" dcdt"这是第一次。这本身就很奇怪。数据库中的这两个字段都允许空值"检查。它们都可能为空或者都不为空。
这两个值都列为DateTime?通过智能感知类型。
我不明白为什么ASP.NET拒绝允许我为空日期输出空白。如果它为空/ null,则逻辑会建议ASP.NET不应该只打印任何内容。
我想如何输出空日期?我尝试添加if语句以防止尝试转换null DateTimes,但它没有帮助,这没有任何意义。
答案 0 :(得分:12)
正如您所说,u.LastLogon
的数据类型为DateTime?
。这意味着它可能有也可能没有价值。通过强制转换为DateTime
,您需要它具有值。在这种情况下,它没有。
根据您尝试使用它的操作,您可能需要查看HasValue
属性:
userRow["LastLogon"] = u.LastLogin.HasValue ?
(object) u.LastLogin.ToShortDateString() : DBNull.Value;
如果您的数据库LastLogon
列是DateTime类型,那么您应该可以这样做:
userRow["LastLogon"] = u.LastLogin.HasValue ?
(object) u.LastLogin.Value : DBNull.Value;
答案 1 :(得分:1)
问题是.NET null
与SQL NULL不同。 SQL Null是System.DBNull。所以它是.NET中的[非null
]值。
答案 2 :(得分:1)
看起来你试图在DateTime上调用方法(dcdt.ToShortDateString()
)?它没有值(确实是null)。试试这个:
dcdt.HasValue ? dcdt.ToShortDateString() : String.Empty;
编辑(只是重新阅读问题):另外,不要尝试转换为DateTime。保留可空。
编辑#2(根据评论):
试试这个:
if (dcdt.HasValue)
{ userRow["DateCreated"] = dcdt.ToShortDateString(); }
else
{ userRow = DbNull.Value }
答案 3 :(得分:1)
您需要在数据访问代码中执行以下操作:
DataTable dt = ExecuteSomeQuery() ;
object value = dt.Rows[0]["nullable_datetime_column"] ;
DateTime? instance = value != null && value is DateTime ? (DateTime?)value : (DateTime?)null ) ;
如果返回的列是NULL,它将作为System.DBNull返回,否则它将作为DateTime的实例返回(或者任何适当的映射类型是 - int,string等)。因此,您需要在尝试强制转换之前检查从查询返回的对象类型。
答案 4 :(得分:1)
我看到德克斯特问他应该怎么做。好吧,我会创建一个扩展名。
static class DateTimeExtensions
{
public static string ToString(this DateTime? dateTime, string format)
{
return dateTime.HasValue ? dateTime.Value.ToString(format) : String.Empty;
}
}
然后你可以这样做:
DateTime? dt = null;
DateTime? dt2 = DateTime.Now;
Console.WriteLine(dt.ToString("dd-MM-yy"));
Console.WriteLine(dt2.ToString("dd-MM-yy"));
请注意,如果对象为null,我可以在可空类型上调用extension方法。
答案 5 :(得分:0)
简短回答
DateTime? dateTime = u.LastLogon?.ToShortDateString()