繁体   English   中英

C#System.InvalidCastException:'指定的转换无效。' 将MySQL与Discord.Net一起使用时

[英]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则将intuint用作未签名
如果您有BIGINT则将longulong用于未签名

找出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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM