2016-08-18 13 views
-1

この関数を実行しようとすると、エラーが発生します。 "System.InvalidCastException:指定されたキャストは無効です。C#要求ハンドラエラーSystem.InvalidCastException:指定されたキャストが無効です

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パラメータでそれを実行してみてください。

私はそれを修正するために一日中努力してきました。あなたが提供した限られた情報に基づいて

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

どのラインが例外を投げていますか?私はそれらを数えるつもりはありません:) – SledgeHammer

+0

それは確かにボックス化されたint場合@ LaneLすることができます。 OPがどんな行に例外をスローするかを教えてもらうことができない場合、問題が何であるかを推測することはありません。 – Jakotheshadows

答えて

1

それはキャストを持つ唯一のラインであるなどの問題が、ラインcmd.Parameters.AddWithValue("@accId", (int) id);であるように、それが見えます。

データベース内のaccounts.id列のタイプを確認してください。INTではないと思われますので、キャスト(括弧内のタイプ)をどのタイプに変更する必要があります。 SMALLINTは、BIGINT C#でshortあるTINYINTbyte(またはsbyte)で、あなたは何MEDIUMINTマップに、そのおそらくintを見るためにドキュメントを見て必要があると思い、longです。

1

私はIDの前に(int)気付いたが、IDの前に(int)だけを削除する必要はない。

ので、私はこのエラーを投げされているライン推測してい

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

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

この行を置き換えることができます。

id変数を使用して、オブジェクトから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型NULL可能にするあなたの問題を示すことができましたか?オブジェクトの価値が本当に何であるか見ることができます。

これが役に立ちます。

関連する問題