0

我已经创建了一个函数来返回执行的 SQL 查询的结果,如下所示:

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。您不能将 a 分配给MySqlDataReadertype 的变量int

我怀疑你想要:

chip = temp.GetInt32(0);

请注意,您应该使用using语句来释放所有资源,而不是仅仅显式关闭连接。如果有多个结果(或没有结果),您还应该考虑想要发生的事情。

此外,除非用户将其用户名放在引号中,否则您的代码将在执行时失败。不要通过在 SQL 中添加引号来解决此问题 - 改用参数化查询。否则你很容易受到SQL 注入攻击。基本上,您几乎不应该使用这样的值动态构建 SQL - 始终将它们参数化。

于 2012-05-17T10:10:44.853 回答
1

对您编辑的问题的回答:

您确定 select 语句完全返回任何值吗?您的内部有一个空间' "" '"因此它将寻找而' Rohan '不是'Rohan'. 尝试

UserName ='" + username + "'"

或者更好的是,就像 Jon 建议的那样,使用参数化查询!

于 2012-05-17T11:07:28.037 回答
1

temp是一个MySqlDataReader而是chip一个int。当然,您不能将一个分配给另一个。

于 2012-05-17T10:10:30.610 回答
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 回答