我有一个可以为空的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形式返回,那么代码如何在这个块内部到达?
答案 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"];
}