System.InvalidCastException:指定的强制转换无效。错误
Posted
技术标签:
【中文标题】System.InvalidCastException:指定的强制转换无效。错误【英文标题】:System.InvalidCastException: Specified cast is not valid. Error 【发布时间】:2013-08-27 14:54:06 【问题描述】:我在一个 C# ASP.NET 项目上。
我有一个 mysql 表,其用户 ID 字段类型为 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();
。
我不知道我在这里做错了什么。请帮忙。
【问题讨论】:
【参考方案1】:InvalidCastException
最可能的原因是x.Field<Int32>("userid")
行。如果数据的实际类型与传递给Field<T>
的类型不匹配,Field<T>
扩展方法将抛出InvalidCastException
。因此,如果 userid
不是 Int32
这会抛出。
编辑
根据您的 cmets,userid
的类型实际上是 UInt32
而不是 Int32
。这就是导致问题的原因。尝试使用以下内容,它应该可以工作
x.Field<UInt32>("userid")
【讨论】:
mysql> desc vticketuser; +--------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+---------+-------+ | idticket | int(10) unsigned | NO | | 0 | | | userid | int(10) unsigned | NO | | NULL | |
这是字段
@user2168042 您将数据库定义与托管代码时的值混合在一起。尝试查看代码中的原始 "userid"
值,在其上调用 .GetType
并查看它被创建为什么类型
我不知道我做得对吗.. 但我尝试过这样string ty = t.Rows[0]["userid"].GetType().ToString();
它说“System.UInt32”
#@user2168042 那就是问题所在。类型是UInt32
,它不同于Int32
。在Field<T>
调用中改用UInt32
,它应该可以正常工作【参考方案2】:
如果不查看从您的数据库返回的数据,我只能猜测您的 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。
对传递给 Field 的泛型使用可为空的类型:
其中 x.Field("userid") == (Int32?)usercode
【讨论】:
它的 Int 我 100% 确定。我重新检查了它。 @user2168042 - 更新了答案,提供了更多关于如何确定数据是否正确以及 Field以上是关于System.InvalidCastException:指定的强制转换无效。错误的主要内容,如果未能解决你的问题,请参考以下文章