C# System.InvalidCastException:"指定的强制转换无效。将 MySQL 与 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假设它是数字列。

如果您有TINYINT则使用 byte ,如果它没有符号,则使用 ubyte
如果您有SMALLINT则使用 short ,或者如果它未签名
,则使用 ushort如果您有MEDIUMINT/INT请使用 intuint 表示未签名
如果您有BIGINT则使用 longulong 表示未签名

找出答案的最好方法是做一个tableName["tokens"].GetType()

如果您没有将其转换为正确的类型,您将获得InvalidCast异常

编辑:

根据您的评论,它是一个varchar列,这意味着它是一个字符串。 如果你想让它成为一个整数,那么你需要做

int.Parse((string) tableName["tokens"]);  

long.Parse((string) tableName["tokens"]);  

如果是 64 位 int

但是以字符串格式存储数字并在以后再次解析它确实是一个糟糕的设计。

最新更新