如果SqlReader.Read()内部的Condition不执行循环

时间:2019-12-03 10:01:35

标签: c# asp.net sql-server sqldatareader

我正在尝试验证由管理员注册的登录用户,默认情况下,为用户提供LoginID和密码@passwordLoginCount为0 。如果用户最终登录并更新了它的哈希密码,则loginCount更新为1。-请参见下图。

enter image description here

所以我试图在用户首次登录时执行多个if语句,它应该检查字符串密码

if (loginCount < 1 && password == "@password") { 

,如果用户已经登录,则应使用具有密码的类来检查散列密码

if(loginCount > 0 && PasswordHasher.Verify(password, hashed))

所有这些操作都是在使用LoginID从数据库中过滤掉用户之后完成的

select * from cor_usersetup where LoginID = @LoginID

但无法正常工作...

 public bool GetAuthentication(string loginId, string password) {
            var connection = System.Configuration.ConfigurationManager.ConnectionStrings["FCoreDBConnection"].ConnectionString;
            SqlConnection cn = new SqlConnection(connection);
            string sql = "select * from cor_usersetup where LoginID = @LoginID";  // and Password = @Password 
            SqlCommand cmd = new SqlCommand(sql,cn);            
            cmd.Parameters.AddWithValue("@LoginID", loginId);            
            cn.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
            int counter = 0;     
            while (rdr.Read()) {  
                var hashed = rdr["Password"].ToString().Trim();
                var loginCount = int.Parse(rdr["LoginCount"].ToString());                
                if (loginCount < 1 && password == "@password") {            //if the user hasnt changed his/her password yet......
                    counter = counter + 1;
                }                
                if(loginCount > 0 && PasswordHasher.Verify(password, hashed)) {     //after password confirmation..
                    counter = counter + 1;
                }
            }
            rdr.Close();
            cn.Close();
            if (counter != 0) {
                success = true;
            }            
            return success;
        }

我设置的断点参考下图,但未触及if语句

enter image description here

请有人能帮助我告诉我我出了什么问题吗...如果我将if条件正确放置在正确的位置,请提前致谢。

1 个答案:

答案 0 :(得分:-1)

首先,请检查“异常窗口”(Ctrl + Alt + E),并设置所有异常(如果没有抛出)。然后再次调试。 您的

    int.Parse(rdr["LoginCount"]

引发ArgumentException。实际上,您可以使用

    bool isConvertable = int.TryParse(rdr["LoginCount"], out int loginCount);
    if (!isConvertable)
            Console.WriteLine(rdr["LoginCount"]); //To see what you got 
    if (loginCount < 1 && password == "@password") {           
                counter = counter + 1;
            }                

代替int.Parse或添加try / catch块