1

源代码:

SqlConnection con = new SqlConnection("Data Source=ANIRUDH;Initial Catalog=DB1;Integrated Security=True");
con.Open();

protected void Login_Click(object sender, EventArgs e)
{
    SqlCommand cmd = new SqlCommand("SELECT * FROM USER_LOGIN WHERE USERID='" + txtUserName.Text + "' AND PASSWORD='" + txtPassword.Text + "'", con);
    SqlDataReader dr = cmd.ExecuteReader();

    string userid = txtUserName.Text;
    string password = txtPassword.Text;
    dr.Read();

    if((dr["USERID"].ToString() == userid) && (dr["PASSWORD"].ToString() == password))
    {
        Response.Redirect("/WebForm1.aspx", true);
    }
    else
    { 
        Response.Write("Invalid");
    }

}

问题:

这总是给出......当我输入正确的用户名和密码时,因为它在数据库中......当我使用标签来显示来自数据库的值时......它们正确并显示......但是在比较时总是显示 INVALID

4

1 回答 1

0

除了人们在评论中所做的所有常见的 SQL 注入等之外,您实际上是在测试两次。我不会责备你在做什么,而是试图帮助“为什么”它不起作用。

首先,您选择用户和密码输入相等的行,然后您正在测试数据读取器的内容。

而不是这样,只需检查您的数据读取器是否实际包含任何内容。如果不是,则根据您的选择未选择任何内容,因此用户和密码不正确。

一个简单dr.HasRows的会让你知道读者是否包含任何东西。

当然,这可能无法治愈为什么 SQL 没有选择任何东西。

可能会引起您注意的一件事是区分大小写。(dr["USERID"].ToString() == userid区分大小写很重要,因为字符串“a”不等于字符串“A” 。

更新

为了演示我对 HasRows 的意思,请尝试使用此方法 - 之后您不需要所有附加if语句。如果 SQL 没有找到包含该where子句的行,那么很明显该行不存在用户和密码组合。

    SqlCommand cmd = new SqlCommand("SELECT * FROM USER_LOGIN WHERE USERID='" + txtUserName.Text + "' AND PASSWORD='" + txtPassword.Text + "'", con);
    SqlDataReader dr = cmd.ExecuteReader();
    if (dr.HasRows){
          Response.Redirect("/WebForm1.aspx", true);
    }else{
          Response.Write("Invalid");
    }
于 2013-05-01T18:24:04.613 回答