三层架构
...O(∩_∩)O...Happy New Year!!...O(∩_∩)O ...好久没写博客了,因为漏掉了很多的知识没有总结,所以不知道该从哪写起了,刚好今天是元旦假期后的第一天,所以还是把之前学的一个重点写一下吧。
三层架构理论:
三层架构就是将整个业务应用划分为:表现层(UI层)、业务逻辑层(BLL层)、数据访问层(DAL层),微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
各层的作用
1:数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务.
2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。
3:表示层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。主要对用户的 请求接受,以及数据的返回,为客户端提供应用程序的访问。
三层架构实操(增删改查的一个小程序)
首先搭建三层架构,在解决方案中添加UI层,BLL业务逻辑层,DAL数据访问层,以及它们公用的MODEL层。它们之间的关系是UI层引用MODEL层,BLL层;BLL层引用MODEL层,DAL层;DAL层引用MODEL层。
* 在UI层下的App.config配置文件下添加数据库连接
<connectionStrings>
<add name="sql" connectionString="Data Source=.;Initial Catalog=UserInfo;Integrated Security=True"/>
</connectionStrings>
*Model层里放置的是属性。
namespace Model { public class Tmodel { //属性名和数据库中表的字段名相对 public Guid Id { set; get; } public string Pname { set; get; } public string Pwd { set; get; } public int Pheight{ set; get; } public bool Pgender{ set; get; } public string Padderss{ set; get; } public DateTime Pbirthday{ set; get; } } }
*DAL层中添加两个类,一个DBHelper,一个Tdal
DBHelper类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace DAL { static public class DBHerper { public static string connstr = ConfigurationManager.ConnectionStrings["sql"].ToString(); //添加链接字符串 //除了select查询外用于执行对数据表内容的操作 public static int ExecuteNunQuery(string cmdtext, CommandType type,params SqlParameter[]parms) { using (SqlConnection conn=new SqlConnection (connstr)) { conn.Open(); using (SqlCommand comm=new SqlCommand (cmdtext,conn)) { comm.CommandType = type; comm.Parameters.AddRange(parms); return comm.ExecuteNonQuery(); } } } //用于执行查询语句(一)首行首列 public static int ExecuteScalar(string cmdtext, CommandType type, params SqlParameter[] parms) { using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); using (SqlCommand comm = new SqlCommand(cmdtext, conn)) { comm.CommandType = type; comm.Parameters.AddRange(parms); return (int)comm.ExecuteScalar(); } } } //用于执行查询语句(二)一条一条读取 static public SqlDataReader ExecuteDataReader(string cmdText, CommandType type, params SqlParameter[] parms) { SqlConnection conn = new SqlConnection(connstr); conn.Open(); using (SqlCommand cmd = new SqlCommand(cmdText,conn)) { cmd.Parameters.AddRange(parms); cmd.CommandType = type; return cmd.ExecuteReader(CommandBehavior.CloseConnection); } } //用于执行查询语句(三)全部读取 static public DataTable ExecuteTable(string cmdText, CommandType ctype, params SqlParameter[] parms) { using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); using (SqlDataAdapter sda = new SqlDataAdapter(cmdText, conn)) { sda.SelectCommand.Parameters.AddRange(parms); DataTable dt = new DataTable(); sda.Fill(dt); return dt; } } } } }
TDal层
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Model; using System.Data; using System.Data.SqlClient; namespace DAL { public class Tdal { public int ADD(Tmodel model) { //添加语句(注册) string sqltext = "insert into Text(Id,Pname,Pwd,Pheight,Pgender,Paddress,Pbirthday) values(@id,@pname,@pwd,@pheight,@gender,@paddress,@pbirthday)"; SqlParameter[] parms = { new SqlParameter("@id",model.Id), new SqlParameter("@pname",model.Pname), new SqlParameter("@pwd",model.Pwd), new SqlParameter("@pheight",model.Pheight), new SqlParameter("@gender",model.Pgender), new SqlParameter("@paddress",model.Padderss), new SqlParameter("@pbirthday",model.Pbirthday) }; return DBHerper.ExecuteNunQuery(sqltext,CommandType.Text,parms); } //查询语句(登录) public int LoginByName(string name,string pwd) { string sqltext = "select count(*) from Text where pname=@name,pwd=@pwd"; SqlParameter[] parms = { new SqlParameter("@name", name), new SqlParameter("@pwd", pwd) }; return DBHerper.ExecuteScalar(sqltext,CommandType.Text,parms); } //删除语句(删除) public int DeleteId(Guid id) { string sqltext = "delete from Text where Id=@id"; SqlParameter parms = new SqlParameter("@id",id); return DBHerper.ExecuteNunQuery(sqltext,CommandType.Text,parms); } //查询语句(读取信息) public DataTable SelecteByName() { string sqltext = "select * from Text"; return DBHerper.ExecuteTable(sqltext,CommandType.Text); } //修改语句(先查询) public SqlDataReader SUpdate(Guid id) { string sqlse = "select * from Text where Id=@id"; SqlParameter parms = new SqlParameter("@id",id); return DBHerper.ExecuteDataReader(sqlse,CommandType.Text,parms); } //修改语句(后修改) public int Update(Tmodel model) { string sqlxg = "update Text set Pname=@name,Pwd=@pwd,Pheight=@height,Pgender=@gender,Paddress=@address,pbirthday=@birthday where Id=@id"; SqlParameter[] parms = { new SqlParameter("@name",model.Pname), new SqlParameter("@pwd",model.Pwd), new SqlParameter("@height",model.Pheight), new SqlParameter("@gender",model.Pgender), new SqlParameter("@address",model.Padderss), new SqlParameter("@birthday",model.Pbirthday), new SqlParameter("@id",model.Id) }; return DBHerper.ExecuteNunQuery(sqlxg,CommandType.Text,parms); } } }
TBLL层
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DAL; using Model; using System.Data; using System.Data.SqlClient; namespace BLL { public class Tbll { Tdal dal = new Tdal(); public bool ADD(Tmodel model) //添加 { if (dal.ADD(model)>0) { return true; } else { return false; } } public bool LoginByName(string name, string pwd) //通过用户名查询 { if (dal.LoginByName(name,pwd)>0) { return true; } else { return false; } } public bool DeleteId(Guid id) //删除 { if (dal.DeleteId(id)>0) { return true; } else { return false; } } public DataTable SelecteByName() //查询语句 { return dal.SelecteByName(); } public SqlDataReader SUpdate(Guid id) //先根据id查询 { return dal.SUpdate(id); } public int Update(Tmodel model) //在修改 { return dal.Update(model); } } }
UI层主界面
主要代码(窗体加载数据,删除数据):
using BLL; using Model; using System.Data.SqlClient; namespace UI { public partial class Select : Form { public Select() { InitializeComponent(); } //实例化Tbll,Tmodel Tbll bll = new Tbll(); Tmodel model = new Tmodel(); private void Select_Load(object sender, EventArgs e)//窗体加载事件 { //加载所有的数据 DataTable dt = bll.SelecteByName();//调用bll层里的SelecteByName方法 foreach (DataRow item in dt.Rows) { string format = string.Format("{0},{1},{2},{3},{4},{5},{6}", item[0], item[1], item[2], item[3], item[4], item[5], item[6]); listBox1.Items.Add(format); } } private void button3_Click(object sender, EventArgs e) //增加按钮事件 { //注册窗体 Regist r = new Regist(); r.Show(); this.Hide(); } private void button1_Click(object sender, EventArgs e) //删除按钮的单击事件 { string seid =listBox1.Items[0].ToString();//获取选中的项 string[] str = seid.Split(','); //分割 string ids = str[0]; Guid idid = Guid.Parse(ids); if (bll.DeleteId(idid)) //根据ID删除 { MessageBox.Show("删除成功!"); Select s = new Select(); s.Show(); this.Hide(); } else { MessageBox.Show("删除失败!"); } } private void button2_Click(object sender, EventArgs e) //修改按钮事件 { string ss = listBox1.SelectedItem.ToString(); string[] str = ss.Split(','); string ids = str[0]; Guid idid = Guid.Parse(ids);//选中列表的项 SqlDataReader sda=bll.SUpdate(idid); if (sda.Read()) { //从sda获取各项值 string name = sda[1].ToString(); string pwd = sda[2].ToString(); int height = Convert.ToInt32(sda[3]); bool gender = Convert.ToBoolean(sda[4]); string address = sda[5].ToString(); DateTime birthday = Convert.ToDateTime(sda[6]); Updates up = new Updates(idid,name,pwd,height,gender,address,birthday);//将sda中的值使用构造函数传参 up.Show(); this.Hide(); } else { MessageBox.Show("传参失败!"); } } private void button4_Click(object sender, EventArgs e) //查询按钮事件 { //登录窗体 Login l = new Login(); l.Show(); this.Hide(); } } }
窗体加载运行效果:
删除效果:
增加事件(注册)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Model; using BLL; using System.Security.Cryptography; namespace UI { public partial class Regist : Form { public Regist() { InitializeComponent(); } Tbll bll = new Tbll(); Tmodel model = new Tmodel(); private void button1_Click(object sender, EventArgs e) //注册按钮事件 { //定义变量 Guid id = Guid.NewGuid(); string name = this.txtname.Text.Trim(); string pwd = this.txtpwd.Text.Trim(); int heighter = Convert.ToInt32( this.txtheight.Text.Trim()); string birthday = this.dateTimePicker1.Text.Trim(); string address = this.txtaddress.Text.Trim(); bool gender = this.rbman.Checked ? true : false; //判断是否为空 if (string.IsNullOrEmpty(name) && string.IsNullOrEmpty(pwd)) { MessageBox.Show("用户名和密码不能为空!"); return; } else { model.Id = id; model.Pname = name; //为密码进行MD5加密 MD5 md5 = new MD5CryptoServiceProvider(); byte[] bytes = Encoding.Default.GetBytes(pwd); byte[] bste = md5.ComputeHash(bytes); pwd = BitConverter.ToString(bste).Replace("-", ""); model.Padderss = address; model.Pgender = gender; model.Pbirthday = Convert.ToDateTime(birthday); model.Pheight = heighter; model.Pwd = pwd; if (bll.ADD(model)) { MessageBox.Show("注册成功"); } else { MessageBox.Show("注册失败!"); } } } private void button2_Click(object sender, EventArgs e) //返回按钮事件 { Select s = new Select(); s.Show(); this.Hide(); } } }
运行效果:
修改事件代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Model; using BLL; namespace UI { public partial class Updates : Form { Tmodel model = new Tmodel(); Tbll bll = new Tbll(); string idid = string.Empty; public Updates(Guid id,string name,string pwd,int height,bool gender,string address,DateTime birthday) { InitializeComponent(); this.idid=id.ToString(); this.txtname.Text=name; this.txtpwd.Text = pwd; this.txtheight.Text = Convert.ToString(height); this.txtaddress.Text = address; this.dateTimePicker1.Text = birthday.ToString(); ; gender = this.rbman.Checked ? true : false; } private void button1_Click(object sender, EventArgs e) //保存事件 { //定义变量获取值 string name = this.txtname.Text.Trim(); string pwd = this.txtpwd.Text.Trim(); int height = Convert.ToInt32(this.txtheight.Text.Trim()); string address = this.txtaddress.Text.Trim(); DateTime birthday = Convert.ToDateTime(this.dateTimePicker1.Text.Trim()); bool gender = this.rbman.Checked ? true : false; if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(pwd)) { model.Id = Guid.Parse(idid); model.Pname = name; model.Pwd = pwd; model.Pheight = height; model.Pgender = gender; model.Padderss = address; model.Pbirthday = birthday; if (bll.Update(model) > 0) { MessageBox.Show("修改成功!"); } else { MessageBox.Show("修改失败!"); } } } private void button2_Click(object sender, EventArgs e) { Select s = new Select(); s.Show(); this.Hide(); } } }
运行结果:
查询事件(登录)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Model; using BLL; using System.Security.Cryptography; namespace UI { public partial class Login : Form { public Login() { InitializeComponent(); } Tmodel model = new Tmodel(); Tbll bll = new Tbll(); private void btnlogin_Click(object sender, EventArgs e) //登录按钮事件 { string name = this.textBox1.Text.Trim(); string pwd = this.textBox2.Text.Trim(); if (!string.IsNullOrEmpty(name)&& !string.IsNullOrEmpty(pwd)) { model.Pname = name; #region 加密 MD5 md5 = new MD5CryptoServiceProvider(); byte[] bytes = Encoding.Default.GetBytes(pwd); byte[] bste = md5.ComputeHash(bytes); pwd = BitConverter.ToString(bste).Replace("-", ""); #endregion model.Pwd = pwd; MessageBox.Show("登陆成功!"); Select s = new Select(); s.Show(); this.Hide(); } else { MessageBox.Show("用户名和密码不能为空!"); } } private void btnre_Click(object sender, EventArgs e)//跳转到注册页面 { Regist r = new Regist(); r.Show(); this.Hide(); } private void button1_Click(object sender, EventArgs e)//跳转到主界面 { Select s = new Select(); s.Show(); this.Hide(); } } }
运行结果:
三层架构终于写完了,在写的过程中,发现还是有很多地方不太熟练,所以还得要多加练习。。。接下来的几天将会学习并总结JavaScript。。。呵呵,继续加油了!O(∩_∩)O....不管我写的好不好,我都会微笑面对,勇敢的走下去!加油!