C# 请求处理程序错误 System.InvalidCastException: 指定的转换无效
C# REQUEST HANDLER ERROR System.InvalidCastException: Specified cast is not valid
当我尝试执行此功能时出现错误
"System.InvalidCastException: Specified cast is not valid."
System.InvalidCastException: Specified cast is not valid.
at server.mihail.credits.HandleRequest() in F:\Users\Mihail\Documents\new-sentients-2016\server\mihail\credits.cs:line 34
at server.RequestHandler.HandleRequest(HttpListenerContext context) in F:\Users\Mihail\Documents\new-sentients-2016\server\RequestHandlers.cs:line 37
at server.Program.ProcessRequest(HttpListenerContext context) in F:\Users\Mihail\Documents\new-sentients-2016\server\Program.cs:line 156
这是函数:
我尝试使用参数 guid 作为我的电子邮件地址和参数 aid 来执行它。
请帮助我,我一整天都在尝试修复它。
class credits : RequestHandler
{
protected override void HandleRequest()
{
string status = "403";
using (Database db = new Database())
{
NameValueCollection query = HttpUtility.ParseQueryString(Context.Request.Url.Query);
MySqlCommand cmd = db.CreateQuery();
cmd.CommandText = "SELECT id FROM accounts WHERE uuid=@uuid";
cmd.Parameters.AddWithValue("@uuid", query["guid"]);
object id = cmd.ExecuteScalar();
if (id != null)
{
int amount = int.Parse(query["aid"]);
cmd = db.CreateQuery();
cmd.CommandText = "UPDATE stats SET credits = credits + @amount WHERE accId=@accId";
cmd.Parameters.AddWithValue("@accId", (int) id);
cmd.Parameters.AddWithValue("@amount", amount);
int result = cmd.ExecuteNonQuery();
if (result > 0)
status = "400";
else
status = "500";
}
else
status = "404";
}
byte[] res = Encoding.UTF8.GetBytes(
status);
Context.Response.OutputStream.Write(res, 0, res.Length);
}
}
根据您提供的有限信息,问题似乎出在第 cmd.Parameters.AddWithValue("@accId", (int) id);
行,因为这是唯一带有强制转换的行。
检查数据库中 accounts.id
列的类型,我怀疑它不是 INT
,因此您需要将转换(括号中的类型)更改为任何类型这是。 SMALLINT
在 C# 中是 short
,BIGINT
是 long
,TINYINT
是 byte
(或 sbyte
),而你需要查看文档以了解 MEDIUMINT
映射到什么,但可能是 int
.
我注意到我在 id 之前有 (int) 但不需要它,所以我只删除了 ID 之前的 (int)。
所以我可以替换这条线
cmd.Parameters.AddWithValue("@accId", (int) id);
和
cmd.Parameters.AddWithValue("@accId", id);
我猜是哪一行抛出了这个错误。
我可以看到使用您的 id 变量从 object 转换为 int。
以下可以说明您的问题
[TestMethod]
public void ObjectToInt()
{
object a = 2;
object b = "3";
int aa = (int)a;
int bb = (int)b; // this throws the same error
var x = 1;
}
也许可以使用 int 使 int 为空?或者看看 object 的真正价值是什么。
希望对您有所帮助。
当我尝试执行此功能时出现错误 "System.InvalidCastException: Specified cast is not valid."
System.InvalidCastException: Specified cast is not valid.
at server.mihail.credits.HandleRequest() in F:\Users\Mihail\Documents\new-sentients-2016\server\mihail\credits.cs:line 34
at server.RequestHandler.HandleRequest(HttpListenerContext context) in F:\Users\Mihail\Documents\new-sentients-2016\server\RequestHandlers.cs:line 37
at server.Program.ProcessRequest(HttpListenerContext context) in F:\Users\Mihail\Documents\new-sentients-2016\server\Program.cs:line 156
这是函数: 我尝试使用参数 guid 作为我的电子邮件地址和参数 aid 来执行它。
请帮助我,我一整天都在尝试修复它。
class credits : RequestHandler
{
protected override void HandleRequest()
{
string status = "403";
using (Database db = new Database())
{
NameValueCollection query = HttpUtility.ParseQueryString(Context.Request.Url.Query);
MySqlCommand cmd = db.CreateQuery();
cmd.CommandText = "SELECT id FROM accounts WHERE uuid=@uuid";
cmd.Parameters.AddWithValue("@uuid", query["guid"]);
object id = cmd.ExecuteScalar();
if (id != null)
{
int amount = int.Parse(query["aid"]);
cmd = db.CreateQuery();
cmd.CommandText = "UPDATE stats SET credits = credits + @amount WHERE accId=@accId";
cmd.Parameters.AddWithValue("@accId", (int) id);
cmd.Parameters.AddWithValue("@amount", amount);
int result = cmd.ExecuteNonQuery();
if (result > 0)
status = "400";
else
status = "500";
}
else
status = "404";
}
byte[] res = Encoding.UTF8.GetBytes(
status);
Context.Response.OutputStream.Write(res, 0, res.Length);
}
}
根据您提供的有限信息,问题似乎出在第 cmd.Parameters.AddWithValue("@accId", (int) id);
行,因为这是唯一带有强制转换的行。
检查数据库中 accounts.id
列的类型,我怀疑它不是 INT
,因此您需要将转换(括号中的类型)更改为任何类型这是。 SMALLINT
在 C# 中是 short
,BIGINT
是 long
,TINYINT
是 byte
(或 sbyte
),而你需要查看文档以了解 MEDIUMINT
映射到什么,但可能是 int
.
我注意到我在 id 之前有 (int) 但不需要它,所以我只删除了 ID 之前的 (int)。
所以我可以替换这条线
cmd.Parameters.AddWithValue("@accId", (int) id);
和
cmd.Parameters.AddWithValue("@accId", id);
我猜是哪一行抛出了这个错误。
我可以看到使用您的 id 变量从 object 转换为 int。
以下可以说明您的问题
[TestMethod]
public void ObjectToInt()
{
object a = 2;
object b = "3";
int aa = (int)a;
int bb = (int)b; // this throws the same error
var x = 1;
}
也许可以使用 int 使 int 为空?或者看看 object 的真正价值是什么。
希望对您有所帮助。