可空对象的值必须为#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()