第2天接触ADO.NET,我想写了一个登录页面,账户和密码在数据库的ZhuCe这个表里,数据库连接成功,但是我让用户输入的密码和我数据库里存的密码对比时,即使用户输入正确的也不能正确登录,为什么?我把密码验证写成,当用户输入密码不等于数据库里密码时可以登录,他就正常运行了~帮我看看,在线等,谢谢各位大侠~~    protected void BtnLogin_Click(object sender, EventArgs e)
    {
        if (this.TextBox1.Text.Trim() == "" || this.TextBox2.Text.Trim() == "")
        {
            this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('用户名和密码不能为空')</script>");
            return;
        }
        if (TextBox3.Text!=LabCode.Text)
        {
            this.ClientScript.RegisterStartupScript(this.GetType(),"","<script>alert('验证码不匹配请重新填写')</script>");
            return;
        }
        string UserName = TextBox1.Text.Trim().ToString();
        string Password = TextBox2.Text.Trim();
        string strConn = ConfigurationManager.ConnectionStrings["ZhuCe"].ConnectionString;
        SqlConnection con = new SqlConnection(strConn);
        try
        {
            con.Open();
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = "select * from [ZhuBiao] where 用户名='" + UserName + "'";
            SqlDataReader reader = cmd.ExecuteReader();
            if (reader.Read())
                    {
                        string dbpassword = reader.GetString(reader.GetOrdinal("密码"));   
                        if (Password == dbpassword)    //这样可以么?为什么我输入正确的密码却不能登录?
                        {
                            Response.Redirect("Index.aspx?userName=" + TextBox1.Text.Trim().ToString() + "");
                        }
                        else
                        {
                            this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('你输入的用户和密码不匹配请重新输入!')</script>");
                        }
                    }
                    else
                    {
                        this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('你输入的用户不存在!')</script>");
                    }
        }
        finally
        {
            if (con != null)
            {
                con.Close();
                con.Dispose();
            }
        }
    }

解决方案 »

  1.   

    SqlDataReader reader = cmd.ExecuteReader();
    这句后面改下可能会更好点。
    cmd.ExecuteReader(CommandBehavior.CloseConnection);
    最好设下断点,看你从数据库取出来的密码是什么
    就是这句
    string dbpassword = reader.GetString(reader.GetOrdinal("密码"));   
    看下执行结果
      

  2.   

    reader.GetString(reader.GetOrdinal("密码"));   
    这句也改下:
    前面改成select password from [ZhuBiao] where 用户名='" + UserName + "'";
    假定密码字段是password
    取的时候
    SqlDataReader reader=cmd.ExecuteReader(CommandBehavior.CloseConnection);
    if(reader.Read())
    {
      string dbpassword=reader.GetString(0);  //后面再去比较
    }
    还有存入数据库的密码最好都加密的
      

  3.   

    string dbpassword = reader.GetString(reader.GetOrdinal("密码"));   断点看看dbpassword 的值是什么
      

  4.   

    string dbpassword = reader.GetString(reader.GetOrdinal("密码"));dbpassword = dbpassword.Trim();Response.Write(dbpassword);看一下输入的结果。
      

  5.   

    谢谢你们! 特别是1,2楼,我认真看了你的回答,但还没试之前发现6楼的方法容易些,我一试问题就解决了,也就是string dbpassword = reader.GetString(reader.GetOrdinal("密码"));后面加dbpassword = dbpassword.Trim();就好了。
    但还有2个问题:1,为什么加那句就好了?
    2.我这样写登录代码是不是太粗糙了?你们一般是怎么写的?我想养个好习惯!
    再次谢谢大家~~
      

  6.   

    Trim()是去除字符串两边的空格 比如123 和 123+空格 至少看起来是一样的
      

  7.   

    dbpassword = dbpassword.Trim();因为你保存的数据后面有空格,Trim()是去掉字符后面的空格2,分层的做法比较多,极少在页面上写数据库的代码。
      

  8.   

    我在数据库里,把密码的存储类型设为 nchar(20),这样有没问题? 密码一般用什么类型存啊?用户名呢?刚接触这些常识都不知道,麻烦告诉我一下~
      

  9.   

    但是我数据库里的密码没有输入空格额?是不是跟 nchar(20)这个存储类型有关系?
    怎么分层?跟老师说过的三层架构有关系么?
    我这代码是写在网页的.cs中的,这也算是页面吗?不是.aspx那个才是页面吗? 还是我没贴全,你们看错了?
      

  10.   

    nchar是固定长度Unicode字符串...nchar(20)表示长度为20字符,不足20字符则以空格补齐...可以改成nvarchar,但是...现在没有商用系统会存明文密码...
      

  11.   

    以本人经验,建议 使用 varchar  或者  nvarchar 。