13

我在一个 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();

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

4

2 回答 2

12

最可能的原因InvalidCastExceptionx.Field<Int32>("userid")线路。如果数据的实际类型与传递给的类型不匹配,Field<T>扩展方法将抛出一个。因此,如果不是this 会抛出。InvalidCastExceptionField<T>useridInt32

编辑

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

x.Field<UInt32>("userid")
于 2013-08-24T18:30:29.137 回答
1

如果不查看从数据库返回的数据,我只能猜测您的 LINQ 的以下部分有问题:

x.Field<Int32>("userid")

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

更新:你能确认不是现场电话中断了吗?只需在没有 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

于 2013-08-24T18:30:38.023 回答