解释处理DBNull?

时间:2013-03-14 15:50:23

标签: c# sql datetime dbnull

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

info.BirthDate = (DateTime?)reader["Birthdate"];

这会导致“Invalid Cast”错误并且会中断。好的,我理解这是因为nulls的返回方式与sql不同,并且类型为“DBNull”

修复此问题

if (reader["Birthdate"] != DBNull.Value)
{
    info.Birthdate = (DateTime)reader["Birthdate"];
}

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

2 个答案:

答案 0 :(得分:5)

DBNull是一个单身人士。它只有一个例子。您可以使用DBNull.Value访问此实例。比较检查是否返回DBNull(.Value),如果未返回!=,则表示它可以安全地将其转换为DateTime

来自MSDN

  

DBNull是一个单例类,这意味着只有这个实例   班级可以存在。

或者您可以使用Convert.IsDBNull方法:

if (!Convert.IsDBNull(reader["Birthdate"]))
{
    info.Birthdate = (DateTime)reader["Birthdate"];
}

答案 1 :(得分:0)

DBNull类型,而不是。正如@aKzenT解释的那样,它是作为单例实现的,这意味着只能有一个实例。获取该值的方法是通过静态.Value属性。

这使得比较变得容易,因为任何DBNull实例在值和对另一个DBNull实例的引用中都是相同的。

另一种检查可能更有意义的方法是:

int columnIndex = reader.GetOrdinal("Birthdate");
if (!reader.IsDbNull(columnIndex)) // IsDbNull should have a string overload, but it does not.
{
    info.Birthdate = (DateTime)reader["Birthdate"];
}