![](/img/trans.png)
[英]System.InvalidCastException: 'Specified cast is not valid.' C# MYSQL
[英]C# System.InvalidCastException: 'Specified cast is not valid.' When using MySQL with Discord.Net
我一直在得到可怕的错误:D
public static List<tableName> GetUserStatus(IUser user)
{
var result = new List<tableName>();
var database = new Database("dibot");
var str = string.Format("SELECT * FROM dibott WHERE userid = '{0}'", user.Id);
var tableName = database.FireCommand(str);
while (tableName.Read())
{
var userId = (string)tableName["userid"];
var userName = (string)tableName["username"];
var currentTokens = (int)tableName["tokens"]; // Here
result.Add(new tableName
{
userid = userId,
username = userName,
tokens = currentTokens
});
}
database.CloseConnection();
return result;
}
在此命令
[Command("Status")]
[Alias("status", "s")]
public async Task Status([Remainder] IUser user = null)
{
var embed = new EmbedBuilder()
{
Color = new Color(0, 0, 255)
};
if (user == null)
{
user = Context.User;
}
var result = Database.CheckExistingUser(user); //Here
if (result.Count() <= 0)
{
Database.EnterUser(user);
}
var tableName = Database.GetUserStatus(user);
我已经尝试了一切,请帮忙。 我尝试了很多事情。 什么都没有帮助寻求帮助,因为即时通讯出于想法和互联网的存在,我没有进行任何修复//以查看错误在哪里。 希望我能尽快得到帮助! :)
因此,有问题的行是这样的:
var currentTokens = (int)tableName["tokens"];
InvalidCastException
表示tableName["tokens"]
包含的类型不是 int
。 要获得实际的类型,您可以例如删除强制转换,在该行上放置一个断点,然后与调试器进行检查。
根据您的评论,我们知道数据库类型是varchar,这意味着您需要在.NET中使用字符串:
var currentTokens = (string)tableName["tokens"];
因为您将令牌转换为int
im并假定其为数字列。
如果您有TINYINT
则使用byte
;如果其未签名,则使用ubyte
如果您有SMALLINT
则使用short
,如果未签名,则使用ushort
如果您有MEDIUMINT/INT
则将int
或uint
用作未签名
如果您有BIGINT
则将long
或ulong
用于未签名
找出tableName["tokens"].GetType()
最佳方法是执行tableName["tokens"].GetType()
。
如果您不将其转换为正确的类型,则将收到该InvalidCast
异常
编辑:
根据您的评论,它的varchar
列表示它是一个字符串。 如果要使其为整数,则需要
int.Parse((string) tableName["tokens"]);
要么
long.Parse((string) tableName["tokens"]);
如果它是64位int
但是,将数字存储为字符串格式并随后再次解析它确实是一个糟糕的设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.