前言
三层登录顺序:数据从U层获取,传给B层,D层去执行操作,回到B层进行判断,结果返回U层
U层
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
//获取用户输入的账号与密码,赋值给userName,password
string userName = txtUserName.Text.Trim();
string password = txtPassword.Text;
//实例化B层LoginManager
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
//mgr调用userlogin方法,将获取的用户名和密码封装,准备传数据。此时转跳到B层
Login.Model.UserInfo user = mgr.UserLogin(userName, password);
MessageBox.Show("登录用户:" + user.UserName);
}
}
}
- 拿出你好看的小手在btnLogin按钮的Click事件前设置一个断点,然后按F11开始逐步调试
- 在上述代码中,用你好看的小手输入的账号密码数据被传送到了B层
B层
namespace Login.BLL
{
//LoginManager类
public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName, string password)
{
//throw new NotImplementedException();
//实例化D层
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
//跳转到D层,把当前userName,password传给实体层
Login.Model.UserInfo user = uDao.SelectUser(userName, password);
//——————————————————————————————————————————————————————————————————————————
//如果user不为空值
if (user != null) //登陆成功
{
//实例化D层ScoreDao
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
//更新用户积分
sDao.UpdateScore(userName, 10);
//返回user到U层
return user;
}
else
{
throw new Exception("登录失败");
}
}
}
}
- 分割线上面会跳转到D层的UserDAO中
- 下面为D层返回user,再跳转到D层的ScoreDAO中加用户的积分
D层
UserDAO
namespace Login.DAL
{
public class UserDAO
{
//设定了两个参数[据说是个很厉害的想法],返回类型为Login.Model.UserInfo
public Login.Model.UserInfo SelectUser(string userName, string password)
{
//链接数据库,有了using,数据库会自动关闭
using(SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
//建立一个查询,利用一个现有连接conn创建一个Command,用于执行SQL指令
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID, UserName, Password,Email
FROM USERS WHERE UserName=@UserName AND Password=@Password AND Password=@Password";
//将SQL语句赋值给cmd.commandtext
cmd.CommandType = System.Data.CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@UserName",userName));
cmd.Parameters.Add(new SqlParameter("@Password",password));
//打开查询 连接
conn.Open();
//逐条的读取数据 使用ExecuteReader()方法返回一个对象用reader接收
SqlDataReader reader = cmd.ExecuteReader();
//定义user为Null
Login.Model.UserInfo user = null;
//循环,把值传给user
while (reader.Read())
{
if (user ==null)
{
user = new Login.Model.UserInfo();
}
//ID UserName Password不为空的情况下赋值给user
user.ID = reader.GetInt32(0);
user.UserName = reader.GetString(1);
user.Password = reader.GetString(2);
if (!reader.IsDBNull(3))
{
user.Email = reader.GetString(3);
}
}
//返回user到B层
return user;
}
}
}
}
- 上面已经来过了「你说你刚刚看B层的时候没下来看,额,那还不回去看!」
ScoreDAO
namespace Login.DAL
{
public class ScoreDAO
{
//UpdateScore方法需要传入userName和value两个参数
public void UpdateScore(string userName, int value)
{
//实例化数据库连接conn
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
//利用现有连接conn创建一个Command,用于执行SQL指令
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values (@UserName,@Score)";
//数据库中增加新的数据,Score+10
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Score",value));
conn.Open();
//执行SQL指令
cmd.ExecuteNonQuery();
}
}
}
}
- 为用户加完积分,返回B层之后回到U层,弹出你最想看到的小框「登录成功」