0

次のように、実行されたSQLクエリの結果を返す1つの関数を作成しました。

EDITED :

 public int GetChips(int points, string username)
    {
        int chip = 0;
        string getChips = "SELECT  Chips from tbl_UserInfo where UserName =' " + username + " '";
        con = new MySqlConnection(conString);
        con.Open();
        MySqlCommand cmd = new MySqlCommand(getChips, con);
        MySqlDataReader chips = cmd.ExecuteReader();

        while (chips.Read())
        {
            chip = chips.GetInt32(0);
            if (chip > points)
            {
                if (points == 5000)
                {
                    chip = chip - 5000;
                }
                else if (points == 10000)
                {
                    chip = chip - 10000;
                }
            }


        }
        con.Close();

        return chip;
    }

チップの値を0として返します。このコードは「while」状態にはなりません。

何が問題になる可能性がありますか?

どうすればこれを解決できますか?

4

4 に答える 4

3

ええ、そうです...tempは、MySqlDataReaderではなくintです。MySqlDataReaderタイプの変数にを割り当てることはできませんint

私はあなたが欲しいと思う:

chip = temp.GetInt32(0);

using接続を明示的に閉じるのではなく、ステートメントを使用してすべてのリソースを解放する必要があることに注意してください。また、結果が複数ある(または結果がない)場合に何をしたいかを検討する必要があります。

さらに、ユーザーがユーザー名を引用符で囲まない限り、現時点ではコードは実行時に失敗します。SQLに引用符を追加してこれを修正しないでください。代わりに、パラメーター化されたクエリを使用してください。そうしないと、SQLインジェクション攻撃に対して脆弱になります。基本的に、このような値を使用してSQLを動的に構築することはほとんどありません。代わりに、常にパラメーター化してください。

于 2012-05-17T10:10:44.853 に答える
1

tempはですがMySqlDataReaderchipintです。もちろん、一方を他方に割り当てることはできません。

于 2012-05-17T10:10:30.610 に答える
1

編集した質問への回答:

selectステートメントが値を返していることを確認しますか?' "中にスペースがあるので、の代わりに" '"検索します。試す' Rohan ''Rohan'

UserName ='" + username + "'"

または、Jonが提案したように、パラメーター化されたクエリを使用することもできます。

于 2012-05-17T11:07:28.037 に答える
0

クエリは値を返すだけなので、これを使用できます。

chip  = (int)(command.ExecuteScalar() ?? 0);

詳細については、次のリンクをご覧ください。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

于 2012-05-17T10:25:42.583 に答える