System.InvalidCastException:指定的强制转换无效。错误

时间:2013-08-24 18:23:50

标签: c# asp.net mysql linq

我正在使用C#ASP.NET项目。

我有一个MySQL表,其userid字段为int

现在我想使用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;
}

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

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

2 个答案:

答案 0 :(得分:6)

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

修改

根据您的评论,userid的类型实际上是UInt32而不是Int32。这就是导致问题的原因。尝试使用以下内容,它应该工作

x.Field<UInt32>("userid")

答案 1 :(得分:0)

如果不查看从数据库返回的数据,我只能猜测LINQ的以下部分是错误的:

x.Field<Int32>("userid")

你的userid列值可能不是int,我会把钱放在它上面吗?

更新:您能否确认不是正在进行的Field调用?只需在没有Field调用的情况下将代码更改为此类代码:

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()在监视窗口中返回的值,例如,以确保一切看起来都正确。如果上面的代码有效,那么Field调用就会爆炸。找出哪些行不能转换为Int32并从那里开始。

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

  1. 确保您不从数据库查询返回NULL,在MySQL中您可以使用IFNULL
  2. 对于传递到Field中的泛型使用可空类型:

    其中x.Field(“userid”)==(Int32?)usercode