请告诉我为什么这个查询不起作用

时间:2014-09-10 10:12:52

标签: c# login

我有DB Sid和密码,它包含Sid = senan和密码= pass1234 当我将此详细信息输入我的登录屏幕时,我总是收到消息消息框

SqlDataAdapter cmd = new SqlDataAdapter("select Count(*) from [user] where Sid=' " + textBox1.Text + " ' and password='" + textBox2.Text + "'", cnn);
DataTable dt = new DataTable();
cmd.Fill(dt);
if (dt.Rows[0][0].ToString() == "1")
    MessageBox.Show("pass");
else
    MessageBox.Show("fail");

1 个答案:

答案 0 :(得分:0)

错误源于一个简单的拼写错误。您为Sid条件传递的值添加了空格 但是,您的查询应该以这种方式重写

string cmdText = "select Count(*) from [user] where Sid=@sid and password=@pwd";
SqlCommand cmd = new SqlCommand(cmdText, cnn)
cmd.Parameters.AddWithValue("@sid", textBox1.Text);
cmd.Parameters.AddWithValue("@pwd", textBox2.Text);
int count = Convert.ToInt32(cmd.ExecuteScalar());
if (count > 0)
    MessageBox.Show("pass");
else
    MessageBox.Show("fail");

此方法使用参数化查询来避免Sql Injection,并直接使用SqlCommand而不构建SqlDataAdapterDataTable。当您需要仅检索单行的第一列或调用标量T-SQL函数(COUNT()

时,SqlCommand.ExecuteScalar是正确的方法。

作为旁注,请记住,在数据库中以明文形式存储密码是一个很大的安全问题。有权访问数据库的人将能够读取每个用户的密码。密码应为stored as a computed hash,并检查用户输入数据上的重复哈希算法。