C# 可为空的枚举强制转换为Int16

C# 可为空的枚举强制转换为Int16,c#,C#,我一直收到错误System.InvalidCastException:指定的强制转换无效。在运行时。RewardJoinType在数据库中可以为null 这是强制转换失败的代码行: c.rewardJoinType = (RewardJoinType)reader.GetInt16(); 'reader.GetInt16()'引发了类型为'System.InvalidCastException'short{System.InvalidCastException}的异常 在一个类中,我有以下代码

我一直收到错误System.InvalidCastException:指定的强制转换无效。在运行时。RewardJoinType在数据库中可以为null

这是强制转换失败的代码行:

c.rewardJoinType = (RewardJoinType)reader.GetInt16();
'reader.GetInt16()'引发了类型为'System.InvalidCastException'short{System.InvalidCastException}的异常

在一个类中,我有以下代码行:

private RewardJoinType? rewardJoinType; 
…其他代码

c.rewardJoinType = (RewardJoinType?)reader.GetInt16();
conn.AddParam("@rewardJoinType", (int?)rewardJoinType);
public RewardJoinType? RewardJoinType
{
     get { return rewardJoinType; }
     set { rewardJoinType = value; }
}
…其他代码

c.rewardJoinType = (RewardJoinType?)reader.GetInt16();
conn.AddParam("@rewardJoinType", (int?)rewardJoinType);
public RewardJoinType? RewardJoinType
{
     get { return rewardJoinType; }
     set { rewardJoinType = value; }
}
…其他代码

c.rewardJoinType = (RewardJoinType?)reader.GetInt16();
conn.AddParam("@rewardJoinType", (int?)rewardJoinType);
public RewardJoinType? RewardJoinType
{
     get { return rewardJoinType; }
     set { rewardJoinType = value; }
}
这是枚举本身

public enum RewardJoinType
{
    Auto,
    Manual
}
这是因为默认枚举是Int32,即使我将其设置为可空,也不能强制转换为空Int16吗

我们已经在读卡器中处理了Int16的DBNull:

    public short GetInt16()
    {
        columnIndex++;
        return reader.IsDBNull(columnIndex) ? (short)0 : reader.GetInt16(columnIndex);
    }

当数据库值为null时,实际返回的是DBNull的实例,而不是“null”,并且DBNull不能转换为其他任何内容。对于这些情况,我要做的是编写一个helper方法,将GetXXX()的返回值转换为null或可为null的结构。比如:

    static T? ConvertIfNotDBNull<T>(object o, Converter<object, T> converter) where T : struct {
        return o is DBNull ? (T?)null : converter(o);
    }
静态T?ConvertIfNotDBNull(对象o,转换器转换器),其中T:struct{
返回o为DBNull?(T?)null:转换器(o);
}
然后输入Convert.ToInt32或与转换器类似的值


如果在附加了调试器的情况下运行它,找出它抛出异常的确切位置,然后查看它试图向何处和从何处强制转换,则可能会有所帮助。

当数据库值为null时,实际返回的是DBNull的实例,而不是“null”,并且DBNull不能转换为其他任何内容。对于这些情况,我要做的是编写一个helper方法,将GetXXX()的返回值转换为null或可为null的结构。比如:

    static T? ConvertIfNotDBNull<T>(object o, Converter<object, T> converter) where T : struct {
        return o is DBNull ? (T?)null : converter(o);
    }
静态T?ConvertIfNotDBNull(对象o,转换器转换器),其中T:struct{
返回o为DBNull?(T?)null:转换器(o);
}
然后输入Convert.ToInt32或与转换器类似的值


如果您在运行它时附加了一个调试器,找出它抛出异常的确切位置,然后查看它试图向何处和从何处强制转换,那么它可能会有所帮助。

数据库空值不是代码空值,因此您需要类似的内容

obj val = reader.GetValue();
if(val != DbNull.Value) c.RewardJoinType = (RewardJoinType)val;

数据库空值不是代码空值,所以您需要这样的内容

obj val = reader.GetValue();
if(val != DbNull.Value) c.RewardJoinType = (RewardJoinType)val;

好吧,我错了。读取器需要是GetInt8(),它在我们的代码中转换为返回一个字节,因为DB字段的类型是tinyInt

好的,我的错误。读取器需要是GetInt8(),它在我们的代码中转换为返回一个字节,因为DB字段的类型是tinyInt

请参阅更新的帖子。我们通过使用自定义GetInt16()方法返回0来处理DBNull请参阅更新的帖子。我们通过使用自定义GetInt16()方法返回0来处理DBNull。InvalidCastException在哪里抛出?哪一行代码?它试图向和从中投射什么?更新。它只在异常中表示无效强制转换。我内心没有例外。看上面。啊,我在数据库中把这个字段作为一个TinyInt。好的,TinyInt是一个字节,不是Int16…我的错。InvalidCastException被抛出到哪里?哪一行代码?它试图向和从中投射什么?更新。它只在异常中表示无效强制转换。我内心没有例外。看上面。啊,我把这个字段作为数据库中的一个TinyInt。好的,TinyInt是一个字节,不是Int16…我的错。