2

我收到在我的属性中检测到的无法访问的代码。这适用于常规字符串字段,但不适用于 DateTime 数据类型。

private DateTime m_RenewalDate;
    public DateTime M_RenewalDate
            {
                get { return m_RenewalDate != null ? m_RenewalDate : DateTime.MinValue; }
                set { m_RenewalDate = value; }
            }

这是我的 sqldatareader

reader.GetDateTime(reader.GetOrdinal("M_RENEWALDATE"))
4

3 回答 3

10

DateTime是值类型,不能为空。因此,getter 中的代码无法访问:

return m_RenewalDate != null ? // always evaluates to true
       m_RenewalDate :         // and therefore always returns this
       DateTime.MinValue;      // The code never hits this case.

如果您在数据库中的字段可以为空,则您可能希望将该属性声明为可为空的 DateTime: DateTime?

于 2012-10-17T16:47:42.017 回答
1

DateTime是值类型,不能为空。要与数据库中的空值进行比较,请使用DBNull.Value

于 2012-10-17T16:51:52.100 回答
0

正如 driis 在他的回答中所说,m_RenewalDate == null总是错误的,因为DateTime它是值类型,并且声明为值类型的事物不能为空。

在您的阅读器代码的情况下具有返回的get行为应该看起来更像这样DateTime.MinValueM_RenewalDateM_RENEWALDATEnull

object renewalDate = reader.GetValue(reader.GetOrdinal("M_RENEWALDATE"));

if (Equals(renewalDate, DBNull.Value))
{
    yourObject.M_RenewalDate = DateTime.MinValue;
}
else
{
    yourObject.M_RenewalDate = (DateTime) renewalDate;
}
于 2012-10-17T17:49:52.543 回答