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