可空对象的值必须为#2

时间:2012-01-05 20:18:21

标签: c# asp.net sql-server sql-server-2008

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

我循环遍历各种用户表,并在那里执行此操作:

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,但它没有帮助,这没有任何意义。

6 个答案:

答案 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()