登录Form
frmLogin.cs
两个Textbox控件:tbUserID, tbPassword
一个按钮:btnLogin
双击登录按钮,进入代码编辑界面:
用如下代码覆盖当前界面代码:
using System;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace SSMS
{
public partial class frmLogin : Form
{
public frmLogin()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(Data.connectionString);
con.Open();
MessageBox.Show(con.State.ToString());
}
}
}
注:Sqlconnection 对应的程序包是 System.Data.SqlClient。
先用这个代码测试一下数据库连接是否成功,运行程序,点击登录按钮,如果显示如下,就说明连接成功了:
如果失败了的话,原因只可能是connectionString不正确,参考我前面的说明。
成功了的话,继续,修改btnLogin_Click事件如下:
private void btnLogin_Click(object sender, EventArgs e)
{
if (tbUserID.Text == "" || tbPassword.Text == "")
{
MessageBox.Show("用户名或密码不能为空");
}
else
{
SqlConnection con = new SqlConnection(Data.connectionString);
con.Open();
string sqlStr = @"select * from {0}
where {1}='{2}' and {3}='{4}'";
sqlStr = String.Format(sqlStr, Data.t_login, Data.c_login_username, tbUserID.Text, Data.c_login_password, tbPassword.Text);
SqlCommand cmd = new SqlCommand(sqlStr, con);
SqlDataReader dataReader = cmd.ExecuteReader();
if (dataReader.HasRows)
{
MessageBox.Show("登录成功");
}
else
{
MessageBox.Show("登录失败");
}
con.Close();
}
}
运行程序,用我们之前往Login表里添加的数据测试,
用户名:1 密码:1 点击登录,弹出一个登录成功的提示。
sqlStr:一个简单的SQL查询语句,之所以用这种传参数的办法填充这个语句,是为了避免SQL注入。将输入的用户名、密码放到Login表中去比对,有的话就登录成功了。
下面再进一步完善,登陆成功直接跳转到相应界面。
private void btnLogin_Click(object sender, EventArgs e)
{
...前面代码省略
if (dataReader.HasRows)
{
dataReader.Read();
string role = dataReader[Data.c_login_role].ToString().Trim();
Data.loginID = tbUserID.Text;
switch (role)
{
case "admin":
frmAdmin afrmAdmin = new frmAdmin();
afrmAdmin.Show();
this.Hide();
break;
case "teacher":
frmTeacher afrmTeacher = new frmTeacher();
afrmTeacher.Show();
this.Hide();
break;
case "student":
frmStudent afrmStudent = new frmStudent();
afrmStudent.Show();
this.Hide();
break;
default:
break;
}
}
else
{
MessageBox.Show("登录失败");
}
con.Close();
...后面大括号自己补全注意匹配
}
运行,用户名、密码还是1,登录,跳转到管理员界面,一个还没有添加内容的form:
关闭这个form。似乎我们成功实现了跳转。但其实这个进程根本没有彻底结束,它依然潜伏在后台运行着,不行我们打开任务管理器>进程,找到这个进程:
为了进一步验证我们的猜想,我么 再运行一次程序,然后再关掉,此时又会多了一个SSMS的进程:
为什么会这样呢?原因其实很简单,this.Hide(); 而不是this.close()。由于程序是从frmLogin这个form启动的,所以要结束整个Application,必须彻底关闭frmLogn才行。解决办法如下(先在任务管理器结束SSMS.exe进程):
第一步:修改frmLogin的btnLogin_Click事件:
private void btnLogin_Click(object sender, EventArgs e)
{
...
if (dataReader.HasRows)
{
dataReader.Read();
string role = dataReader[Data.c_login_role].ToString().Trim();
Data.loginID = tbUserID.Text;
switch (role)
{
case "admin":
frmAdmin afrmAdmin = new frmAdmin(this);
afrmAdmin.Show();
this.Hide();
break;
case "teacher":
frmTeacher afrmTeacher = new frmTeacher(this);
afrmTeacher.Show();
this.Hide();
break;
case "student":
frmStudent afrmStudent = new frmStudent(this);
afrmStudent.Show();
this.Hide();
break;
default:
break;
}
}
else
{
MessageBox.Show("登录失败");
}
con.Close();
...
}
第二步:修改frmAdmin.cs
首先用如下代码覆盖原有代码,然后在
选中frmAdmin的设计界面,右键>属性>事件>FormClosing事件:
然后绑定frmAdmin_FormClosing方法。
using System.Windows.Forms;
namespace SSMS
{
public partial class frmAdmin : Form
{
frmLogin myLoginForm;
public frmAdmin(frmLogin afrmLogin = null)
{
myLoginForm = afrmLogin;
InitializeComponent();
}
private void frmAdmin_FormClosing(object sender, FormClosingEventArgs e)
{
if (myLoginForm != null)
{
myLoginForm.Close();
}
}
}
}
第三步:修改frmStudent.cs 原理同上
using System.Windows.Forms;
namespace SSMS
{
public partial class frmStudent : Form
{
frmLogin myLoginForm;
public frmStudent(frmLogin afrmLogin = null)
{
myLoginForm = afrmLogin;
InitializeComponent();
}
private void frmStudent_FormClosing(object sender, FormClosingEventArgs e)
{
if (myLoginForm != null)
{
myLoginForm.Close();
}
}
}
}