登录代码适用于管理员和用户,但当使用错误的id或密码登录时不会显示错误



我正在为我的最后一个项目创建一个程序,我已经建立了一个数据库,一切都很好,但我唯一无法完成的是登录系统。

用户和管理员都将通过相同的表格登录。

当我输入一个管理员id时,它会登录并说"你好,管理员",用户也是如此。但是当我输入一个不存在的id时,它不会显示错误。。

这是我的代码-

private void button1_Click(object sender, EventArgs e)
{
try
{
    string userNameText = txtUser.Text;
    string passwordText = txtPass.Text;
    string isAdmin = "yes";
    string isNotAdmin = "no";
    if (!(string.IsNullOrEmpty(txtUser.Text)) && !(string.IsNullOrEmpty(txtPass.Text)))
    {
        SqlConnection SCScon = new SqlConnection();
        SCScon.ConnectionString = "Data Source=PEWPEWDIEPIE\SQLEXPRESS;Initial Catalog=master;Integrated Security=True";
        SqlCommand cmd = new SqlCommand("SELECT ISNULL(SCSID, '') AS SCSID, ISNULL(SCSPass,'') AS SCSPass, ISNULL(isAdmin,'') AS isAdmin FROM SCSID WHERE SCSID='" + txtUser.Text + "' and SCSPass='" + txtPass.Text + "'", SCScon);
        SCScon.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
                {
                    if (this.CompareStrings(dr["SCSID"].ToString(), txtUser.Text) &&
                        this.CompareStrings(dr["SCSPass"].ToString(), txtPass.Text) &&
                        this.CompareStrings(dr["isAdmin"].ToString(), isAdmin))
                    {
                        MessageBox.Show("Hello " +txtUser.Text , "Admin" , MessageBoxButtons.OK , MessageBoxIcon.Information);
                        _Adminform.Show();
                        this.Hide();
                    }
                    else if (this.CompareStrings(dr["SCSID"].ToString(), txtUser.Text) &&
                        this.CompareStrings(dr["SCSPass"].ToString(), txtPass.Text) &&
                        this.CompareStrings(dr["isAdmin"].ToString(), isNotAdmin))
                    {
                        MessageBox.Show("Welcome " + txtUser.Text , "User");
                        _userform.Show();
                        this.Hide();
                    }
                    else
                    {
                        MessageBox.Show("Wrong ID/Pass");
                    }
                }'
    }
}
catch (Exception ex)
        {
            MessageBox.Show("error2" + ex);
        }

}

问题:您在whle循环中检查无效用户。当只匹配所需用户时,循环进入。因此,如果提供了无效的用户凭据,它将不会进入循环,因此您无法看到Invalid User MessageBox。

解决方案:您可以检查dr.Read()返回值,如果是true,则表示它与用户(管理员或普通用户)有行。

if(dr.Read())
{
                if (this.CompareStrings(dr["SCSID"].ToString(), txtUser.Text) &&
                    this.CompareStrings(dr["SCSPass"].ToString(), txtPass.Text) &&
                    this.CompareStrings(dr["isAdmin"].ToString(), isAdmin))
                {
                    MessageBox.Show("Hello " +txtUser.Text , "Admin" , MessageBoxButtons.OK , MessageBoxIcon.Information);
                    _Adminform.Show();
                    this.Hide();
                }
                else if (this.CompareStrings(dr["SCSID"].ToString(), txtUser.Text) &&
                    this.CompareStrings(dr["SCSPass"].ToString(), txtPass.Text) &&
                    this.CompareStrings(dr["isAdmin"].ToString(), isNotAdmin))
                {
                    MessageBox.Show("Welcome " + txtUser.Text , "User");
                    _userform.Show();
                    this.Hide();
                }
}
else
{
 MessageBox.Show("Wrong ID/Pass");
}

如果用户名和密码不匹配,则行SqlDataReader dr = cmd.ExecuteReader();不返回任何行,因此它不会输入while(dr.Read()),因此也不会在while(dr.Read())中输入else

您需要将MessageBox.Show("Wrong ID/Pass");放在while循环之外。

这是表单中的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace LoginDialogForm
{
    public partial class Login_Dialog_Form1 : Form
    {
        public Login_Dialog_Form1()
        {
            InitializeComponent();
        }
        private bool ValidateUsername()
        {
            //TODO: add code to validate User Name.
            return true;
        }
        private bool ValidatePassword()
        {
            if (!ValidateUsername())
            {
                MessageBox.Show("Wrong Username", "Invalid Username", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
            {
                //TODO: add code to validate password.
                if (false)
                {
                    MessageBox.Show("Wrong Password", "Invalid Password", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
                else
                    return true;
            }
        }
    }
    private void btnOk_Click(object sender, EventArgs e)
    {
        if (!ValidatePassword())
        {
            txtUserName.Clear();
            txtPassword.Clear();
            return;
        }
        else
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
    }
    private void btnCancel_Click(object sender, EventArgs e)
    {
        txtUserName.Clear();
        txtPassword.Clear();
        this.Close();
    }
}

这是控件及其相关属性:

//
// btnOk
//
Name = "btnOk";
Text = "&Ok";
btnOk.Click += new System.EventHandler(this.btnOk_Click);
//
// btnCancel
//
DialogResult = System.Windows.Forms.DialogResult.Cancel;
Name = "btnCancel";
Text = "&Cancel";
btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
// txtUserName
//
Name = "txtUserName";
//
// txtPassword
//
PasswordChar = '*';
Name = "txtPassword";
//
// label1
//
Name = "label1";
Text = "Username";
//
// label2
//
Name = "label2";
Text = "Password";
//
// LogoPictureBox
//
LogoPictureBox.Name = "LogoPictureBox";
LogoPictureBox.TabStop = false;
//
// LoginForm1
//
AcceptButton = this.btnOk;
CancelButton = this.btnCancel;
ControlBox = false;
FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
Name = "LoginForm1";
ShowInTaskbar = false;
StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
Text = "Login Form";

这是调用表单的代码:

private void Form1_Load(object sender, EventArgs e)
{
    Login_Dialog_Form1 NewLogin = new Login_Dialog_Form1();
    DialogResult Result = NewLogin.ShowDialog();
    switch (Result)
    {
    case DialogResult.OK:
        //do stuff
        break;
    case DialogResult.Cancel:
        this.Close();
        break;
    }
}

最新更新