Я получаю ошибки, которые ужасны: 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
, если его 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
Но это действительно плохой дизайн для хранения чисел в строчном формате, а затем для его повторного анализа.