您好我正在尝试返回可能具有空日期值的集合。 但是,如果它们为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; }
}
任何提示/帮助/指针非常感谢。 感谢
答案 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添加到它们中,以便能够只有一个或两个模板化方法。
如果有人可能有一个功能性技巧的想法或两个说出来:-)