0

我创建了表 user_info,其中包含 2 个用户名和密码。当我执行下面的代码时,即使我输入正确的用户名和密码,它也总是进入“else”状态。

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string v = System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString;
    con = new OracleConnection(v);
    con.Open();

    cmd = new OracleCommand("select * from user_info where username='" + Login1.UserName.Trim() + "' and password='" + Login1.Password + "'", con);
    dr = cmd.ExecuteReader();
    dr.Read();
    if (dr.HasRows)
    {
        Response.Redirect("Default2.aspx");
    }
    else
    {
        Response.Redirect("Default.aspx");
    }


    con.Close();
    dr.Close();
}
4

2 回答 2

1

它进入 else 因为 dr 没有行。要找出原因,请在

dr = cmd.ExecuteReader();

然后使用带有参数的实际 sql select 命令并将其作为针对 db 的 sql 语句运行,以查看它是否返回行。我的怀疑是,您认为输入 Login1.Username 和/或 Login1.Password 的任何内容都没有传递,但在不知道如何填充 Login1 的情况下很难说。

顺便说一句,如果这些是网页上的文本框,那么您需要使用 Login1.Username.Text 和 Login1.Password.Text 来获取文本框中的实际字符串。

于 2012-06-07T17:51:59.410 回答
0

首先,您至少应该对密码进行哈希处理。此外,最好不要将您的联系留在课堂上。当您使用它们时,它们应该被创建、打开和关闭。与命令、阅读器等相同...这可以通过using块轻松完成。

接下来,确保在使用 Login1.UserName 和 Login1.Password 时访问的是实际字符串值而不是控件。如果您使用控件,则需要使用 Login1.UserName.Text.Trim() 和 Login1.Password.Text.Trim()。您可以通过将构建的查询存储到本地字符串值并查看实际构建的内容来确保这一点。

不要将 DataReader 用于您正在做的事情。而是使用 ExecuteScalar 方法:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string v = System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString;
    con = new OracleConnection(v);
    con.Open();

    cmd = new OracleCommand("select * from user_info where username='" + Login1.UserName.Trim() + "' and password='" + Login1.Password + "'", con);
    int count = Convert.ToInt32(cmd.ExecuteScalar());
    if (count > 0)
    {
        Response.Redirect("Default2.aspx");
    }
    else
    {
        Response.Redirect("Default.aspx");
    }

    con.Close();
}

完成此设置后,在if (count > 0)行上放置一个断点。检查存储在本地 var 中的查询并检查计数。这应该为您提供所需的一切。

于 2012-06-07T18:08:28.500 回答