2013-08-24 96 views
3

我在一个C#ASP.NET项目。System.InvalidCastException:指定的转换无效。错误

我有一个类型为int的userid字段的MySQL表。

现在我想要得到使用LINQ的userid值等于某个值的行数。

要做到这一点,我写了下面的方法:

public int getCount(int usercode) { 
    int count = 0; 
    DataTable mytable = getAllRowsAndReturnAsDataTable(); // assigning a DataTable value to mytable. 
    if (mytable.Rows.Count > 0) { 
     count = (from x in mytable.AsEnumerable() where x.Field<Int32>("userid") == usercode select x).Count(); 
    } 
    return count; 
} 

但它显示出红色高亮区域count = (from x in mytable.AsEnumerable() where x.Field<Int32>("userid") == usercode select x).Count();错误System.InvalidCastException: Specified cast is not valid.

我不知道我在这里做错了什么。请帮忙。

回答

4

InvalidCastException最可能的原因是x.Field<Int32>("userid")系列。如果数据的实际类型与传递给Field<T>的类型不匹配,则Field<T>扩展方法将抛出InvalidCastException。因此,如果userid不是Int32这会抛出。

编辑

根据您的意见的userid的类型实际上是UInt32,而不是Int32。这是导致问题的原因。尝试使用下面的,它应该工作

x.Field<UInt32>("userid") 
+0

'mysql> desc vticketuser; + -------------- + ------------------ + ------ + ----- + - -------- + ------- + |字段|类型|空| Key |默认|额外| + -------------- + ------------------ + ------ + ----- + - -------- + ------- + | idticket | int(10)unsigned | NO | | 0 | | |用户ID | int(10)unsigned | NO | | NULL | | ' 这是字段 – user2168042

+1

@ user2168042您将数据库定义与托管代码时的值混合在一起。尝试查看代码中原始的''userid''值,调用'.GetType'并查看它创建的类型为 – JaredPar

+0

我不知道我是否正确地做它..但我试过像这样 ' string ty = t.Rows [0] [“userid”]。GetType()。ToString();' 它说“System.UInt32” – user2168042

0

不看从数据库回来的数据,我只能猜测你的LINQ的下面的部分是有过错:

x.Field<Int32>("userid") 

你的用户ID列价值可能不是一个整数,我会把我的钱是NULL?

UPDATE:你能否证实它不是被打破了现场通话?只需更改您的代码像这样没有现场电话:

public int getCount(int usercode){ 
    int count = 0; 
    DataTable mytable = getAllRowsAndReturnAsDataTable(); // assigning a DataTable value to mytable. 
    if (mytable.Rows.Count > 0) { 
    count = mytable.AsEnumerable().Count(); // No WHERE function call so no casting. 
    } 
    return count; 
} 

你也可以检查一下值由mytable.AsEnumerable()在例如一个观察窗口返回,以确保一切看起来是正确的。如果上面的代码正常工作,那么现场调用就会爆炸。找出哪些行不能转换为Int32并从那里开始。

如果它实际上是NULL,有很多方法可以解决这个问题。

  1. 确保您不会从您的数据库查询中返回NULL,在MySQL中您可以使用IFNULL
  2. 使用可空类型为通用传递到现场:

    其中x.Field( “用户id”)==(的Int32?)用户代码

+0

,我100%确定。我重新检查了它。 – user2168042

+0

@ user2168042 - 更新了答案,详细说明了如何查找数据是否正确以及实际上是否为字段。 – BrutalDev

相关问题