簡體   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