处理从db返回的空日期

时间:2009-07-07 00:06:43

标签: c# .net sql-server-2005 ado.net

您好我正在尝试返回可能具有空日期值的集合。 但是,如果它们为null - 我希望保持这种方式而不是仅使用任意日期。

如果它是一个字符串,我会像这样检查空值:

calEventDTO.occurrenceType = dr.IsDBNull(10) ? null : dr.GetString(10);

我如何约会? 以下内容无法编译('null'和System.DateTime'之间没有隐式转换。)

calEventDTO.recurrenceID = dr.IsDBNull(9) ? null : dr.GetDateTime(9);

我的dto设置为处理空值。

public DateTime? recurrenceID
    {
        get { return _recurrenceID; }
        set { _recurrenceID = value; }
    }

任何提示/帮助/指针非常感谢。 感谢

3 个答案:

答案 0 :(得分:8)

尝试:

calEventDTO.recurrenceID = dr.IsDBNull(9) ? null : (DateTime?) dr.GetDateTime(9);

?运算符需要两个操作数(在这种情况下为null和dr.GetDateTime(9))属于同一类型。

答案 1 :(得分:5)

条件运算符不考虑将结果赋给的内容,因此必须将任一操作数转换为DateTime?:

calEventDTO.recurrenceID = dr.IsDBNull(9) ? (DateTime?)null : dr.GetDateTime(9);

答案 2 :(得分:0)

IsDbNull(int)通常比使用GetSqlInt32等方法慢,然后比较DBNull.Value或使用它自己的.IsNull喜欢:

    public static int Int32(this SqlDataReader r, int ord)
    {
        var t = r.GetSqlInt32(ord);
        return t.IsNull ? default(int) : t.Value;
    }

尝试了一些模板解决方案但到目前为止无济于事。问题是所有Sql类型(此处为SqlInt32)类型实际上是结构,而它们都有.Value属性C#没有真正的模板来处理它。它们也有自己的INullable接口,它只有.IsNull,并且与Nyllable<>不相容。

我怀疑人们需要完整的Sql类型作为C#模板,或者将ICOnvertible添加到它们中,以便能够只有一个或两个模板化方法。

如果有人可能有一个功能性技巧的想法或两个说出来:-)