我创建了一个函数来返回执行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'状态。
可能是什么问题?
我该如何解决这个问题?
答案 0 :(得分:3)
是的... temp
是MySqlDataReader
,而不是int
。您无法将MySqlDataReader
分配给int
类型的变量。
我怀疑你想要:
chip = temp.GetInt32(0);
请注意,您应该使用using
语句来释放所有资源,而不是仅显式关闭连接。如果有多个结果(或没有结果),您还应该考虑要发生的事情。
此外,除非用户将其用户名放在引号中,否则您的代码将在执行时失败。 不要通过向SQL添加引号来修复此问题 - 而是使用参数化查询。否则你很容易受到SQL injection attacks的攻击。基本上,你几乎不应该使用这样的值动态地构建SQL - 总是参数化它们。
答案 1 :(得分:1)
temp
是MySqlDataReader
而chip
是int
。当然你不能把一个分配给另一个。
答案 2 :(得分:1)
对您编辑过的问题的回答:
您确定select语句是否返回任何值?您的' "
和" '"
中有空格,因此它会查找' Rohan '
而不是'Rohan'
。尝试
UserName ='" + username + "'"
或者更好,就像Jon建议的那样,使用参数化查询!
答案 3 :(得分:0)
因为您的查询只返回一个值,所以您可以使用它:
chip = (int)(command.ExecuteScalar() ?? 0);
请查看以下链接以获取更多详细信息:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx