c#system.invalidcastexception:'指定的强制转换无效'将mysql与discord.net一起使用时

c9x0cxw0  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(343)

我一直在犯一些很糟糕的错误: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);

我什么都试过了请帮帮我。我试过很多东西。没有什么能帮助我寻求帮助,因为我的想法和在互联网上没有任何修复我把//看看哪里是错误。我希望我能很快得到帮助!:)

dgsult0t

dgsult0t1#

所以问题是:

var currentTokens = (int)tableName["tokens"];
``` `InvalidCastException` 表示中包含的类型 `tableName["tokens"]` 不是 `int` . 例如,要获取实际类型,可以删除强制转换,在该行上放置一个断点,然后使用调试器进行检查。
从您的注解中,我们知道数据库类型是varchar,这意味着您需要在.net中使用字符串:

var currentTokens = (string)tableName["tokens"];

mepcadol

mepcadol2#

因为你是在向 int 我假设它是一个数字列。
如果你有 TINYINT 然后使用 byte ,如果其未签名,则使用 ubyte 如果你有 SMALLINT 然后使用 short ,或 ushort 如果它是未签名的
如果你有 MEDIUMINT/INT 然后使用 int 或者 uint 对于未签名
如果你有 BIGINT 然后使用 long 或者 ulong 对于未签名
最好的办法是做一个 tableName["tokens"].GetType() .
如果你不把它投到正确的类型,你会得到它 InvalidCast 例外
编辑:
根据你的评论,这是 varchar 列,表示它是一个字符串。如果你想把它变成int,那么你需要

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

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

如果是64位int
但以字符串格式存储数值,然后再对其进行解析,这确实是一个糟糕的设计。

相关问题