解释处理DBNull?

Evr*_*Evr 2 c# sql datetime dbnull

我有一个可以为空的DateTime字段"BirthDate",现有代码以这种方式处理这个问题

info.BirthDate = (DateTime?)reader["Birthdate"];
Run Code Online (Sandbox Code Playgroud)

这会导致"无效转换"错误,并且会中断.好吧,我理解这是因为nulls的返回方式与sql不同,并且类型为"DBNull"

结果证明是这样的

if (reader["Birthdate"] != DBNull.Value)
{
    info.Birthdate = (DateTime)reader["Birthdate"];
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这个有效吗?..我特别迷失在DBNull的.Value部分.如果IS返回作为的DBNull如何代码连这个块内到达?

aKz*_*enT 5

DBNull是一个单身人士.它只有一个例子.您可以使用访问此实例DBNull.Value.比较检查是否DBNull(.Value)返回以及是否返回(!=)然后它知道它可以安全地将其转换为DateTime.

来自MSDN:

DBNull是一个单例类,这意味着只能存在此类的此实例.

或者你可以使用这个Convert.IsDBNull方法:

if (!Convert.IsDBNull(reader["Birthdate"]))
{
    info.Birthdate = (DateTime)reader["Birthdate"];
}
Run Code Online (Sandbox Code Playgroud)