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

我认为如果reader["EnumTypeId"]为 null,它应该分配EnumType.None值,但它仍在尝试将 null 值强制转换为 int,这显然会导致异常。

我尝试了以下,它也没有工作:

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

我没有使用Enums,而是继续并决定使用 nullable int,所以现在我的代码略有不同,但它仍然不适用于DBNull.Value,nullGetOrdinal...

intType= reader["intType"] == DBNull.Value ? null : (int?)reader["intType"];

另外,为什么我必须做(int?)演员而不是(int)演员?

4

2 回答 2

2

不要使用 DBNull,只需使用普通的 old 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"];
于 2012-09-25T05:09:00.433 回答
1

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

int index = reader.GetOrdinal("EnumTypeId");
EnumType = reader.IsDBNull(index) ? EnumType.None : 
                                    (EnumType)reader.GetInt32(index);
于 2012-09-25T05:13:50.487 回答