我一直收到错误,这些错误很糟糕: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
假设它是数字列。
如果您有TINYINT
则使用 byte
,如果它没有符号,则使用 ubyte
如果您有SMALLINT
则使用 short
,或者如果它未签名
,则使用 ushort
如果您有MEDIUMINT/INT
请使用 int
或 uint
表示未签名
如果您有BIGINT
则使用 long
或 ulong
表示未签名
找出答案的最好方法是做一个tableName["tokens"].GetType()
。
如果您没有将其转换为正确的类型,您将获得InvalidCast
异常
编辑:
根据您的评论,它是一个varchar
列,这意味着它是一个字符串。 如果你想让它成为一个整数,那么你需要做
int.Parse((string) tableName["tokens"]);
或
long.Parse((string) tableName["tokens"]);
如果是 64 位 int
但是以字符串格式存储数字并在以后再次解析它确实是一个糟糕的设计。