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

本文关键字:转换 无效 错误 InvalidCastException System | 更新日期: 2023-09-27 18:28:58

我正在执行一个C#ASP.NET项目。

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

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

但是它示出了在红色高亮区域中示出CCD_ 3的错误CCD_。

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

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

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

编辑

根据您的意见,userid的类型实际上是UInt32,而不是Int32。这就是造成问题的原因。尝试使用以下内容,它应该可以

x.Field<UInt32>("userid")

如果不查看从数据库返回的数据,我只能猜测LINQ的以下部分出现了故障:

x.Field<Int32>("userid")

你的userid列值可能不是int,我会把钱花在NULL上吗?

更新:你能确认不是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. 为传递到字段中的泛型使用可为null的类型:

    其中x.Field("userid")==(Int32?)用户代码