系统无效的转换异常:指定的转换无效。错误。

15

我正在进行一个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;
}

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

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

2个回答

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

编辑

根据您的评论,userid的类型实际上是UInt32而不是Int32。 这就是问题的原因。 尝试使用以下代码应该可以解决问题:

x.Field<UInt32>("userid")

mysql> 描述 vticketuser; +--------------+------------------+------+-----+---------+-------+ | 字段 | 类型 | 空 | 键 | 默认 | 其他 | +--------------+------------------+------+-----+---------+-------+ | idticket | int(10) unsigned | NO | | 0 | | | userid | int(10) unsigned | NO | | NULL | | - user2168042
1
@user2168042,您正在将数据库定义与在托管代码中管理时的值混淆。尝试查看代码中的原始“userid”值,对其调用.GetType并查看创建的类型是什么。 - JaredPar
我不知道我是否做得正确..但我尝试了这样做string ty = t.Rows[0]["userid"].GetType().ToString();它显示"System.UInt32" - user2168042
1
#@user2168042 那就是问题所在了。类型是 UInt32,与 Int32 不同。在 Field<T> 调用中使用 UInt32,它应该可以正常工作。 - JaredPar

1

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

x.Field<Int32>("userid")

你的userid列值可能不是整数,我敢打赌它是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. 对于传递到Field中的泛型,使用可空类型:

    where x.Field("userid") == (Int32?)usercode


它是Int类型,我100%确定。我已经重新检查过了。 - user2168042
@user2168042 - 更新了答案,详细说明了如何查找数据是否正确以及Field<T>是否是问题所在。 - BrutalDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接