C # System.InvalidCastException: «Указанное приведение недействительно.» При использовании MySQL с Discord.Net

0

Я получаю ошибки, которые ужасны: 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);

Я пробовал все, пожалуйста, помогите. Я много пробовал. Ничто не помогло просить помощи, потому что из идей и в Интернете есть какие-либо исправления, которые я поставил//Чтобы узнать, где ошибки. Надеюсь, мне скоро поможет! :)

  • 0
    какой тип столбца токенов?
  • 0
    Какие ошибки вы получаете?
Показать ещё 1 комментарий
Теги:
discord.net

2 ответа

1

Поэтому проблема заключается в следующем:

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

InvalidCastException означает, что тип, содержащийся в tableName["tokens"] не является int. Чтобы получить фактический тип, вы можете, например, удалить бросок, поставить точку останова на эту строку и проверить с помощью отладчика.

Из вашего комментария мы знаем, что тип базы данных является varchar, что означает, что вам нужно использовать строку в.NET:

var currentTokens = (string)tableName["tokens"];
  • 0
    Если это так, это звучит как довольно плохой дизайн БД. Строка как первичный ключ не подходит. И если вы ожидаете, что Integer в этот момент, вероятно, он мог бы быть в этом месте.
  • 0
    @Christopher: Из того, что я догадался, это может быть схема, используемая discordapp , который использует тип снежинки Twitter. Этот тип, вероятно, представлен в виде строки в API .NET.
Показать ещё 1 комментарий
0

так как вы бросаете токены в int im, принимая его числовую колонку.

Если у вас есть TINYINT тогда используйте byte, если его unsigned, то используйте ubyte
если у вас есть SMALLINT то используйте short или ushort если его неподписанный
если у вас есть MEDIUMINT/INT тогда используйте int или uint для unsigned
если у вас есть BIGINT то используйте long или ulong для unsigned

лучший способ узнать это сделать tableName["tokens"].GetType().

Если вы не InvalidCast его к правильному типу, вы получите это исключение InvalidCast

Редактировать:

На основе вашего комментария это столбец varchar который означает его строку. если вы хотите сделать это int, вам нужно сделать

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

или же

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

если его 64-битный int

Но это действительно плохой дизайн для хранения чисел в строчном формате, а затем для его повторного анализа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню