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_。
我不知道我在这里做错了什么。请帮忙。
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,那么有很多方法可以解决这个问题。
- 确保您的数据库查询不会返回NULL,在MySQL中您可以使用IFNULL
为传递到字段中的泛型使用可为null的类型:
其中x.Field("userid")==(Int32?)用户代码