2015-11-22 79 views
2

所以我有这个旧的代码,使用Firebird,我从那里代码,因为它工作完美,但在这里没有。并抛出一个InvalidCastException。C#抛出一个枚举InvalidCastException错误

所以笏我岂

animal.FeedScheduleType = (BcFeedScheduleType)drAnimal["feedschedule_type"]; 

所以我尽量拉出来的东西我的数据表,并将其放置在animal.FeedScheduleType。现在我投点AA公共枚举

public enum BcFeedScheduleType 
{ 
    Default = 0, 
    FromList = 1, 
    Group = 2 
} 

和animal.FeedScheduleType是

private BcFeedScheduleType _feedScheduleType; 

public BcFeedScheduleType FeedScheduleType 
    { 
     get { return _feedScheduleType; } 
     set { _feedScheduleType = value; } 
    } 

但每当它击中这个它抛出我的InvalidCastException的,我不知道为什么,我搜索在这里和谷歌,但为无法找到任何关于这样的演员阵容。

编辑:在数据库中的类型是整数

+0

数据库中记录的数据类型是什么? –

+0

我把它作为一个整数在数据库里面, –

+0

尝试从声明为_var temp_的临时变量中读取数据库的返回值,然后使用调试器在尝试任何强制转换之前检查数据库返回的值。 – Steve

回答

2

试试这个:

animal.FeedScheduleType = (BcFeedScheduleType)Convert.ToInt32(drAnimal["feedschedule_type"]); 

这里是一个fiddle

1

您是否尝试过铸造为int第一?

animal.FeedScheduleType = (BcFeedScheduleType)(int)drAnimal["feedschedule_type"]; 
+0

我只是试过了,但它引发了同样的错误我害怕 –

0

我的猜测是你的drAnimal正在返回一个字符串,而不是一个int。如果是这种情况,那么

animal.FeedScheduleType = (BcFeedScheduleType)Int.Parse(drAnimal["feedschedule_type"]);

如果你不知道drAnimal是什么类型的,你可以这样做:

var feedschedule_type = drAnimal["feedschedule_type"]; Console.WriteLine("feedschedule_type is {0}", typeof(feedschedule_type));

基本上,你需要得到它变成一个int,然后像你在问题中所做的那样使用标准转换。

最后,确保提要计划类型具有有效值。也就是说,确定它的值是0,1或2.

0

我其实刚刚碰到这个时候,最近使用的是SqlParameter

我的猜测是drAnimal["feedschedule_type"]被存储为SqlDbType.Intobject。为了投我的参数,我不得不做类似如下的内容:

(int)(SqlDbType.Int)(drAnimal["feedschedule_type"]); 

您可能需要使用类似的链以获得实际int值,并将其强制到您的枚举。

+1

是的,你是对的。但是,将db字段转换为整数的最好方法是使用Convert。ToInt32(drAnimal [“feedschedule_type”])'如果该字段不可为空。如果它是可空的,那么最好是使用'drAnimal [“feedschedule_type”]作为int?'。 –

+0

可能,但'转换'失败悲惨,如果这种类型在技术上是'SqlDbType.Variant',因此最初的演员。 – Eris