三层登录实现
2016-02-01 14:57
183 查看
引言:
上篇博客说到三层的四个问题(what、why、when、how),how部分没有说,这篇博客以登录为例,用C#实现三层登录,了解它的运行过程以及代码详解。时序图:
下面这张图是通过vs生成的时序图,详细地讲述了登录的整个过程。上面这张图有些繁琐,其实简单地说,就是UI层采集用户的用户名和密码,然后传递给B层,B层获取指令和数据后进行逻辑判断,这时需要与数据库中的数据进行判断,因此通过D层进行数据访问,将数据返回到B层,判断完后,将结果在UI层进行展示。
代码展示:
UI层://单击登录 private void btnLogin_Click(object sender, EventArgs e) { string userName = txtUserName.Text.Trim(); string password = txtPassWord.Text; //取出用户界面的数据 Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); Login.Modle.UserInfo user=mgr.UserLogin(userName, password); //使用用户界面的数据,进行查找 //如果没有问题,则登陆成功 MessageBox.Show("登录用户:" + user.UserName); }B层:
public Login.Modle.UserInfo UserLogin(string UserName, string password) { Login.DAL.UserDAO uDao = new Login.DAL.UserDAO(); //创建一个user Login.Modle .UserInfo user=uDao.SelectUser(UserName, password); //通过UI中填写的内容,返回来响应的数据 if (user != null) //如果数据库中没有数据,即为首次登陆了,增加10积分 { Login.DAL.ScoreDAO sDao= new Login.DAL.ScoreDAO() ; sDao.UpdateScore(UserName, 10); return user; } else //如果数据库中没有该用户名,则登陆失败 { throw new Exception("登录失败"); } }D层:
public class UserDAO { public Login.Modle .UserInfo SelectUser(string userName,string Password) // 根据UI,选择返回一个user { using (SqlConnection conn = new SqlConnection(Dbutil.Connstring)) { //创建一个命令对象,并添加命令 SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @"select ID,UserName,Password,Email from users where UserName=@UserName and PassWord =@password"; cmd.CommandType =CommandType.Text ; cmd.Parameters.Add(new SqlParameter("@UserName", userName)); cmd.Parameters.Add(new SqlParameter("@Password", Password )); conn.Open();//打开数据连接 SqlDataReader reader = cmd.ExecuteReader(); Login.Modle.UserInfo user = null;//用于保存读取的数据 while (reader.Read()) //开始读取数据 { if (user == null) //如果没有,则重新生成一个 { user = new Login.Modle.UserInfo(); } user.ID = reader.GetInt32(0); user.UserName = reader.GetString(1); user.PassWord = reader.GetString(2); if (!reader.IsDBNull(3)) // 不要去一定要有email,也可以返回 { user.Email = reader.GetString(3); } } return user; } } }
public class ScoreDAO { public void UpdateScore(string userName, int value) //首次登陆,增加10积分 { using (SqlConnection conn = new SqlConnection(Dbutil.Connstring)) { SqlCommand cmd = conn.CreateCommand();//创建一个命名对象 cmd.CommandText = @"insert into scores(UserName,Score) values(@UserName,@Score)"; //修改Score表数据 cmd.Parameters.Add(new SqlParameter("@UserName", userName)); cmd.Parameters.Add(new SqlParameter("@Score", value)); conn.Open(); cmd.ExecuteNonQuery(); } } }实体:
namespace Login.Modle { public class UserInfo { public int ID { get; set; } public string UserName { get; set; } public string PassWord { get; set; } public string Email { get; set; } } }
总结:
对大概的一个过程有了了解,但对于实体层部分还是有点迷糊,对于各层和实体层间的关系是在怎么样的还有待研究。里面有写的不对的地方,还请多多指教!
相关文章推荐
- Android串口操作,简化android-serialport-api的demo(附源码)
- shell 判读
- maven模组化建项目
- 《数据库索引设计优化》读书笔记(一)
- 概率论与数理统计
- iOS横竖屏
- ubuntu15.10 下refind的安装
- 获取系统相册图片路径
- Nginx+Lua服务端合并静态文件
- 自定义按钮 文字在左图片在右
- 记录sqoop同步失败问题解决过程,过程真的是很崎岖。(1月6日解决)
- <iOS> 谈谈iOS Animation
- Xcode常用的快捷键
- AES128的加密解密学习总结
- OK6410-A开发板学习-①准备工作
- java版,实现人民币的大小写转换
- android处理crash程序崩溃异常
- POJ1511 SPFA水题
- 黑马程序员-----------2.1所感
- android真机 usb调试 访问电脑本地web服务地址