我正在为我的最后一个项目创建一个程序,我已经建立了一个数据库,一切都很好,但我唯一无法完成的是登录系统。
用户和管理员都将通过相同的表格登录。
当我输入一个管理员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;
}
}