登录存储过程编码的问题

时间:2009-02-14 08:29:28

标签: stored-procedures

有人请通过修改此代码来帮助我。当我通过存储过程调用检索Login值时,虽然我给出了正确的用户名和密码我收到错误消息“无效的用户名或密码”意味着始终检查错误的条件only.pls帮助我某人......这是我的代码。

Login.cs:

 public int GetLogin(string UserName, string Password)
    {
        SqlConnection con = new SqlConnection(str);     
        SqlDataAdapter da = new SqlDataAdapter("GetUserLogin", con);
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
        da.SelectCommand.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = UserName;
        da.SelectCommand.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = Password;      
        DataSet ds = new DataSet();
        da.Fill(ds);
        if (ds.Tables[0].Rows.Count > 0)
        {
            if ((ds.Tables[0].Rows[0].ItemArray[1].ToString() == UserName) && (ds.Tables[0].Rows[0].ItemArray[2].ToString() == Password))
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        else
        {
            return -1;
        }
    }

存储过程:

CREATE PROCEDURE GetUserLogin( @UserName varchar(50),@Password varchar(50))   
AS
select UserName, Password
From Login where UserName=@UserName and Password=@Password
RETURN

Login.aspx.cs:

protected void BtnLogin_Click(object sender, EventArgs e)
    {
        Session["UserName"] = TxtUserName.Text;    
        Login lg = new Login();    
        if ((lg.GetLogin(TxtUserName.Text, TxtPassword.Text) == 1)&&(DropDownList1.SelectedIndex == 1))
        {                      
                Response.Redirect("c1.aspx");        
        }
        else if ((lg.GetAdminLogin(TxtUserName.Text, TxtPassword.Text) == 1) && (DropDownList1.SelectedValue == 0))
        {
            Response.Redirect("Admin.aspx");
        }
        else
        {
            Lbl1.Text = "<b>Sorry,Invalid UserName or Password</b>";
        }             

    }

虽然我给出了正确的输入,但突出显示的条件总是会转到其他条件。

4 个答案:

答案 0 :(得分:2)

首先,这看起来可能是一个区分大小写的问题;即使TSQL不区分大小写,C#也是如此。但是为什么要返回密码(事实上,你甚至不能存储密码 - 只有一个哈希)。

就个人而言,我只是:

CREATE PROCEDURE GetUserLogin( @UserName varchar(50),@Password varchar(50))   
AS
select UserName
From Login where UserName=@UserName
and Password=@Password -- yeuch (should compare **hash**)

然后检查行的存在;如果ds.Tables[0].Rows.Count > 0,则验证它们。当然,DataTable在这里也有些过分,但它应该有效。

答案 1 :(得分:0)

 Session["UserName"] = TxtUserName.Text; 
    Login lg = new Login();    
    if ((lg.GetLogin(TxtUserName.Text, **TxtPassword.Text**)

您在哪里声明或分配了TxtPassword.Text?当您将其传递给GetLogin函数时,没有为TxtPassword.Text设置值。也许这就是为什么它总是会转到最后一个其他块,因为它失败了两次(没有TxtPassword.Text的值)。

Session["UserName"] = TxtUserName.Text; 
Session["Password"] = TxtPassword.Text;      
    Login lg = new Login();    
    if ((lg.GetLogin(TxtUserName.Text, **TxtPassword.Text**)

我猜您的代码应该添加该行。

    Session["Password"] = TxtPassword.Text;      

验证;)

答案 2 :(得分:0)

你一定要检查ItemArray [0]和ItemArray [1]而不是ItemArray [1]和ItemArray [2]。

答案 3 :(得分:0)

或者这只是SelectedValue 1 vs“1”,0 vs“0”???