2016-08-18 3 views
-1

Wenn ich versuche, diese Funktion auszuführen, bekomme ich den Fehler "System.InvalidCastException: Angegebene Cast ist nicht gültig."C# REQUEST HANDLER-FEHLER System.InvalidCastException: Angegebener Cast ist nicht gültig

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 

Dies ist die Funktion: Ich versuche es guid als meine E-Mail-Adresse und Parameter-Hilfe mit der Nummer eins in es mit Parametern auszuführen.

Bitte helfen Sie mir, ich habe den ganzen Tag versucht, es zu beheben.

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 [email protected]"; 
     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 [email protected]"; 
       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); 
    } 
} 
+2

In welcher Zeile wirft es die Ausnahme? Ich werde sie nicht zählen :) – SledgeHammer

+0

@LaneL Sie können, wenn es in der Tat eine boxed int ist. Es macht keinen Sinn zu erraten, um welches Problem es sich handelt, wenn das OP sich nicht die Mühe machen kann, uns zu sagen, welche Zeile die Ausnahme auslöst. – Jakotheshadows

Antwort

1

Basierend auf den begrenzten Informationen, die Sie zur Verfügung gestellt haben, sieht es aus wie das Problem mit der Linie ist cmd.Parameters.AddWithValue("@accId", (int) id);, da dies die einzige Linie, mit einer Besetzung ist.

Überprüfen Sie den Typ der accounts.id Spalte in Ihrer Datenbank, vermute ich es nicht ein INT ist, so dass Sie die Besetzung (der Typ in den Klammern) zu welcher Art auch immer es ist, ändern müssen. Ein SMALLINT ist ein short in C#, BIGINTlong ist, TINYINT ist byte (oder sbyte), und Sie würden in der Dokumentation suchen müssen, um zu sehen, was MEDIUMINT Karten, aber es ist wahrscheinlich int.

1

Ich bemerkte, dass ich (int) vor ID habe, aber es ist nicht erforderlich, also entfernte ich nur die (int) vor ID.

So kann ich diese Zeile ersetzen

cmd.Parameters.AddWithValue("@accId", (int) id); 

mit

cmd.Parameters.AddWithValue("@accId", id); 
0

Ich vermute, ich, welche Linie diesen Fehler zu werfen.

Ich kann eine Umwandlung von Objekt zu Int mit Ihrer ID-Variable passieren.

Nachfolgend konnten zeigen, Ihr Problem

[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; 
    } 

Vielleicht ist der int NULL festlegbare mit int machen? oder sehen, was der Wert des Objekts wirklich ist.

Hoffe, das hilft.

Verwandte Themen