为什么DBNull.Value在这里不起作用?

时间:2012-09-25 04:58:00

标签: c#

EnumType = reader["EnumTypeId"] == DBNull.Value ? EnumType.None : (EnumType)(int)reader["EnumTypeId"];

我认为如果reader["EnumTypeId"]为空,它应该分配EnumType.None值,但它仍然试图将空值转换为显然导致异常的int。

我尝试了以下操作,它也无效:

EnumType = reader["EnumTypeId"] == null ? EnumType.None : (EnumType)(int)reader["EnumTypeId"];

我没有使用Enums,而是决定使用可空的int,所以现在我的代码略有不同,但它仍然不适用于DBNull.Value,{{ 1}},或null

GetOrdinal...

另外,为什么我必须进行intType= reader["intType"] == DBNull.Value ? null : (int?)reader["intType"]; 演员而不仅仅是(int?)演员?

2 个答案:

答案 0 :(得分:2)

不要使用DBNull,只需使用普通的null

EnumType = reader["EnumTypeId"] == null ? EnumType.None : (EnumType)(int)reader["EnumTypeId"];

修改

问题可能是EnumTypeId的数据库类型不是int / Int32。如果是这样,那么读取字符串然后解析应该可以解决问题。

EnumType? enumVal = null;
if (reader["EnumTypeId"] != null)
{
    int intVal;
    enumVal = (int.TryParse(reader["EnumTypeId"].ToString(), out intVal)) ? (EnumType)intVal : null;
}
EnumType =  ? EnumType.None : (EnumType)(int)reader["EnumTypeId"];

答案 1 :(得分:1)

您可以使用的另一种方法是IsDBNull方法:

int index = reader.GetOrdinal("EnumTypeId");
EnumType = reader.IsDBNull(index) ? EnumType.None : 
                                    (EnumType)reader.GetInt32(index);