C# Windows窗体登录

C# Windows窗体登录,c#,windows,forms,C#,Windows,Forms,当我使用以下代码时,如果用户名和密码相同,则可以正常工作;如果我提供了错误的用户名和密码,则是nether向我发送消息或登录: private void btnSubmit_Click(object sender, EventArgs e) { try { SqlConnection con = Helper.getconnection(); con.Open();

当我使用以下代码时,如果用户名和密码相同,则可以正常工作;如果我提供了错误的用户名和密码,则是nether向我发送消息或登录:

 private void btnSubmit_Click(object sender, EventArgs e)
        {
            try
            {
                SqlConnection con = Helper.getconnection();
                con.Open();
                SqlCommand cmd = new SqlCommand("select SupportName, Password from Logins where SupportName='" + txtSupportName.Text + "' and Password='" + txtPassword.Text + "'", con);
                SqlDataReader dr = cmd.ExecuteReader(); 
                string Name = txtSupportName.Text;
                string Pwd = txtPassword.Text;
                while (dr.Read())
                {
                    if ((dr["SupportName"].ToString() == Name) && (dr["Password"].ToString() == Pwd))
                    {
                       // MessageBox.Show("welcome");
                        Form Support = new Support();
                        Support.ShowDialog();

                }
                else
                {
                    MessageBox.Show("SupportName and password are invalid");
                }
            }

            dr.Close();

            con.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        if (txtSupportName.Text == string.Empty)
        {
            MessageBox.Show("Please enter a value to Support Name!");
            txtSupportName.Focus();
            return;
        }

        if (txtPassword.Text == string.Empty)
        {
            MessageBox.Show("Please enter a value to Description!");
            txtPassword.Focus();
            return;
        }
    }

您的代码似乎存在一些问题:

  • 您应该在运行查询之前验证输入

  • 您应该参数化查询(上面有很多示例),而不是使用字符串连接

  • 您似乎假设您将从SQL查询中得到一个结果。您可能应该检查
    dr.HasRows
    以查看详细信息是否正确,或者检查
    dr.Read()
    是否返回true以确定是否显示消息框

  • 您应该使用
    块处置数据库对象。例如(不确定为什么格式化不起作用):

    使用(SqlConnection con=Helper.getconnection()) { ... }


  • 而不是显式调用
    Dispose
    Close
    。即使您确实想显式地调用
    Dispose
    Close
    ,您也应该在
    finally
    块中这样做。

    代码中存在问题。您忘记检查数据读取器是否有行

    if (dr.HasRows)
        {
            while (dr.Read())
            {
                if ((dr["SupportName"].ToString() == Name) && (dr["Password"].ToString() == Pwd))
                {
                    // MessageBox.Show("welcome");
                    Form Support = new Support();
                    Support.ShowDialog();
                }
                else
                {
                    MessageBox.Show("SupportName and password are invalid");
                }
            }
        }
        else
        {
            MessageBox.Show("SupportName and password are invalid");
        }
    

    只需添加
    HasRows
    ,检查您的表中是否存在用户名和密码,即可检索数据库中的数据

    if(dr.HasRows)
    {
      //username and password exists
    
      while (dr.Read())
            {
                if ((dr["SupportName"].ToString() == Name) && (dr["Password"].ToString() == Pwd))
                {
                    // MessageBox.Show("welcome");
                    Form Support = new Support();
                    Support.ShowDialog();
                }
    
            }
    }
    else
    {
    //username and password not exists
    
    MessageBox.Show("SupportName and password are invalid");
    
    }
    

    致以最良好的祝愿

    丹尼尔·凯利写了一个很好的答案,我只是实施了它,并添加了单独的方法来划分责任

    private bool Login(string supportName, string password)
    {
       if(string.IsNullOrEmpty(supportName) || string.IsNullOrEmpty(password))
       {
          throw new ArgumentException();
       }
    
       using(var connection = Helper.getconnection())
       using(var command = connection.CreateCommand())
       {
          conmmand.CommandText = "SELECT 1 FROM Logins WHERE SupportName=@SupportName AND Password=@Password";
          command.Parameters.AddWithValue("@SupportName", supportName);
          command.Parameters.AddWithValue("@Password", password);
    
          return command.ExecuteScalar() != null;
       }
    }
    
    private void ShowSupportForm()
    {
       var supportName = txtSupportName.Text;
       var password = txtPassword.Text;
    
       if (string.IsNullOrEmpty(supportName))
       {
          MessageBox.Show("Please enter a value to Support Name!");
          txtSupportName.Focus();
          return;
       }
    
       if (string.IsNullOrEmpty(password))
       {
          MessageBox.Show("Please enter a value to Passwod!");
          txtPassword.Focus();
          return;
       }
    
       if(Login(supportName, password))
       {
          using(var form = new Support())
          {
             form.ShowDialog(this);
          }
       }
       else
       {
          MessageBox.Show("SupportName and password are invalid");
       }
    }
    
    private void btnSubmit_Click(object sender, EventArgs e)
    {
        ShowSupportForm();
    }
    

    您是否尝试过单步执行代码?如果是这样,会发生什么。如果没有,为什么没有?while循环正在执行?如果您在查询中检查用户名和密码,那么在while循环中再次检查它有什么意义?如果不正确,您会得到任何行吗?仅供参考,您的代码不受保护!使用参数化查询防止SQL注入。在while循环中放置断点并观察发生了什么??查看是否滑到其他部分..检查变量状态..如果我输入了错误的用户名和密码,我希望它显示消息“SupportName和密码无效”,但在这里什么都没有发生,即使我输入了错误的详细信息,它也是空闲的。缺少指向的链接!是的,我将使用您提供的代码,所有您帮助我使用代码的工作,我将永远感谢您。