可空对象的值必须为#2

我正在尝试重用我一直使用的相同代码,但现在遇到了错误。

我循环遍历各种用户表,在那里我这样做:

DateTime dcdt = (DateTime)u.DateCreated; DateTime lldt = (DateTime)u.LastLogon; userRow["DateCreated"] = dcdt.ToShortDateString(); 

在循环内。 我收到错误:

 System.InvalidOperationException: Nullable object must have a value. 

该错误突出显示“lldt”行 ,而不是首先出现的“dcdt”。 这本身就很奇怪。 检查数据库“允许空值”中的这两个字段。 它们都可以为null或者都不为null。

这两个值都列为DateTime? 通过intellisense的类型。

我不明白为什么ASP.NET拒绝允许我为空日期输出空白。 如果它为空/ null,则逻辑会建议ASP.NET不应该只打印任何内容。

我怎么想输出空日期呢? 我尝试添加if语句以防止尝试转换null DateTimes,但它没有帮助,这没有任何意义。

正如您所说, 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; 

问题是.NET null与SQL NULL不同。 SQL Null是System.DBNull 。 所以它是.NET中的[非null ]值。

您需要在数据访问代码中执行以下操作:

 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等)。 因此,您需要在尝试强制转换之前检查从查询返回的对象类型。

看起来你试图在DateTime上调用一个方法( dcdt.ToShortDateString() )? 它没有值(确实是null)。 试试这个:

 dcdt.HasValue ? dcdt.ToShortDateString() : String.Empty; 

编辑(只是重新阅读问题):另外,不要尝试转换为DateTime。 保留可空。

编辑#2(根据评论):

试试这个:

 if (dcdt.HasValue) { userRow["DateCreated"] = dcdt.ToShortDateString(); } else { userRow = DbNull.Value } 

我看到德克斯特问他应该怎么做。 好吧,我会创建一个扩展。

 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,我可以在可空类型上调用扩展方法。

简短的回答

 DateTime? dateTime = u.LastLogon?.ToShortDateString()