分层式结构是最广大,三层构造啊

明天大家的话说三层,首先我们来看一下百度宏观对于三层架构的表达:三层架构(3-tier
architecture) 经常意义上的三层架构就是将全体业务应用细分为:界面层(User
Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data
access
layer)。区分层次的目标即为了“高内聚低耦合”的沉思。在软件连串架构设计中,分层式结构是最普遍,也是最重大的一种结构。微软引荐的分层式结构相似分为三层,从下至上个别为:数据访问层、业务逻辑层(又或称为世界层)、表示层。

在网上收集的可比好的讲解三层架构的知情,我搜集两片段,第一片段不难明了,第二部分可比详细。也有局地再次的地方

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using DAL;
 6 using Entery;
 7 
 8 namespace BLL
 9 {
10     /// <summary>
11     /// 这是BLL 业务逻辑层,此层被表现层(UI)调用,同时它自己调用DAL
12     /// </summary>
13     public class PeopleBLL
14     {
15         PeopleDAL dal = new PeopleDAL();
16 
17         public bool Add(People p){
18             //添加一个用户
19             return dal.Insert(p);
20         }
21 
22         public bool Del(People p) {
23             //删除一个用户
24             return dal.Delete(p);
25         }
26 
27         public bool Sel(People p) {
28             //查询用户
29             return dal.Select(p);
30         }
31 
32         public List<People> ShowAll()
33         {
34             return dal.SelectAll();
35         }
36     }
37 }

数值重临:数据层再次回到给工作逻辑层,在由工作逻辑层重临给表示层,然后由表示层举办展现;


===============================================================================================================================

View Code

3,与两层的分裂??

两层:

 图片 1

 

(当其余一个地方暴发变化时,都急需重新开发总种类统。“多层”放在一层,分工不强烈耦合度高——难以适应要求转变,可有限接济性低、可扩展性低)

 

三层:

 图片 2

 

 

(爆发在哪一层的变通,只需变更该层,不要求转移所有系统。层次明显,分工明确,每层之间耦合度低——进步了频率,适应须要转变,可维护性高,可增加性高)

 

综上:三层架构的

优势:1,结构清晰、耦合度低,2,可维护性高,可增加性高;3,利于开发职务同步进行;简单适应要求变化

 

劣势:1、下降了系统的属性。那是明显的。如若不使用分层式结构,很多工作可以一向访问数据库,以此博得相应的多寡,近日却必须透过中间层来完结。

2、有时会导致级联的修改。那种修改更加体现在自上而下的方向。假设在表示层中需求追加一个效应,为力保其陈设符合分层式结构,可能需求在对应的业务逻辑层和数码访问层中都平添对应的代码

3、扩展了代码量,增添了工作量

 

 

 图片 3

1  public bool Insert(People p)
2          {
3              return SQLServerDALHelper.ExecuteNonQuery(
4                  "insert into Users(Name,Pass) values(N'"
5                 + p.Name
6                 + "',N'"
7                 + p.Password
8                 + "')");
9          }

1,什么是三层?

UI(表现层):重若是指与用户交互的界面。用于收纳用户输入的数据和显示处理后用户须求的数量。

 

BLL:(业务逻辑层):UI层和DAL层之间的大桥。完结业务逻辑。业务逻辑具体包括:验证、总计、业务规则等等。

 

DAL:(数据访问层):与数据库争执。主要落成对数据的增、删、改、查。将积存在数据库中的数据交到给业务层,同时将业务层处理的数码保存到数据库。(当然那一个操作都是基于UI层的。用户的急需反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL举行数据的操作,操作后再一一再次回到,直到将用户所需数据反映给用户)

 图片 4

每一层都担当,那么该什么样将三层关系起来呢?

1>单项引用(见下图)

2>那时候实体层(Entity)来了。(注:当然,实体层的作用持续这么些)

 

Entity(实体层):它不属于三层中的任何一层,可是它是必不可少的一层。

 

Entity在三层架构中的作用:

1,完毕面向对象思想中的”封装”;

2,贯穿于三层,在三层之间传递数据;

注:方便的说实体层贯穿于三层之间,来一连三层)

3,对于初学者的话,可以这么敞亮:每张数据表对应一个实体,即每个数据表中的字段对应实体中的属性(注:当然,事实上不是这么。为什么?1>,可能大家要求的实体在数据表对应的实业中并不设有;2>,我们全然可以将有着数据表中的享有字段都放在一个实体里)

4,每一层(UI—>BLL—>DAL)之间的数量传递(单向)是靠变量或实体作为参数来传递的,那样就协会了三层之间的牵连,达成了功能的贯彻。

然则对于大气的数额的话,用变量做参数有些复杂,因为参数量太多,容易搞混。比如:我要把职工音讯传递到下层,新闻包罗:员工号、姓名、年龄、性别、薪俸....用变量做参数的话,那么大家的不二法门中的参数就会众多,极有可能在运用时,将参数匹配搞混。这时候,借使用实体做参数,就会很有利,不用考虑参数匹配的题材,用到实体中哪些属性拿来直接用就可以,很便利。那样做也坚实了效能。

 

注:此地怎么说可以临时通晓为各类数据表对应一个实体??答:我们都知晓,大家做系统的目标,是为用户提供劳动,用户可不关切你的连串后台是怎么工作的,用户只关怀软件是还是不是好用,界面是还是不是符合自己意志。用户在界面上轻松的增、删、改、查,那么数据库中也要有照应的增、删、改、查,而增删改查具体操作对象就是数据库中的数据,说白了就是表中的字段。所以,将每个数据表作为一个实体类,实体类封装的习性对应到表中的字段,那样的话,实体在贯穿于三层之间时,就可以完成增删改查数据了)

 

综合:三层及实体层之间的看重关系:

 图片 5

 

考虑根源生活:

 图片 6

 

 

服务员:只管接待客人;

厨师:纵然做客人点的菜;

采购员:只管按客人点菜的渴求采购食材;

 

她俩各负其职,服务员不要了然厨神咋办菜,不用驾驭采购员怎样购得食材;大厨不用知道服务员接待了哪位客人,不用知道采购员如何购得食材;同样,采购员不用知道服务员接待了哪位客人,不用知道厨子如何是好菜。

 

她俩三者是怎样联系的?

诸如:厨神会做:炒茄子、炒鸡蛋、炒粉——此时创设七个法子( cookEggplant()、cookEgg()、cookNoodle())

 

消费者一直和服务员打交道,顾客和服务员(UI层)说:我要一个炒茄子,而服务员不担负炒茄子,她就把请求往上递交,传递给厨子(BLL层),厨子要求茄子,就把请求往上递交,传递给采购员(DAL层),采购员从仓库里取来茄子传回给厨子,大厨响应cookEggplant()方法,做好炒茄子后,又流传给侍者,服务员把茄子突显给买主。

诸如此类就完事了一个完好无损的操作。

 

在此进程中,茄子作为参数在三层中传递,如果消费者点炒鸡蛋,则鸡蛋作为参数(那是变量做参数)。若是,用户增加须要,大家还得在措施中增加参数,一个办法添加一个,一个主意设计到三层;何况实际中并不止设计到一个艺术的改动。所以,为了缓解这些问题,我们可以把茄子、鸡蛋、面条作为品质定义到消费者实体中,一旦消费者增添了炒鸡蛋须要,直接把鸡蛋属性拿出去用即可,不用再去考虑去每层的办法中加上参数了,更不要考虑参数的格外难点。

 

如此那般讲,不知情大家是不是可以知晓。(待会实例解释啊)

 

图片 7

表示层(UI),这么些最简单明白,就是用户看到的主界面。

 1   public static List<People> ConvertReaderToTicketList(SqlDataReader dr)
 2          {
 3              List<People> ts = new List<People>();
 4 
 5              if (dr.HasRows)
 6              {
 7                  while (dr.Read())
 8                  {
 9                      ts.Add(new People(dr[0].ToString(), dr[1].ToString(),dr[2].ToString()));
10                  }
11              }
12 
13              return ts;
14          }

4,三层的具体表现方式??

 图片 8

 

UI:

 图片 9

(大家不用误会,UI层不只是一个个用户界面,也是必要有代码的)

 图片 10

 

(1,作用:用户输入数据、反馈给用户数量;2,大家观看代码:没有关联到工作逻辑,直接传参、函数、方法调用,没有涉嫌到与数据库打交道的SQL语句和ADO.NET)

 

BLL:

 图片 11

 

(1,BLL是表示层与数码访问层之间的桥梁,负责数据处理、传递;2,大家观望代码,没有涉及到界面上的控件,没有关联到SQL语句和ADO.Net

 

DAL:

 图片 12

 

 图片 13

 

 图片 14

 

 图片 15

 

(1,以上是DAL层中DbUtil类、user_DA类和workRecord_DA类中的代码;2,我们观望代码,没有关联到界面控件,没有关系到事情逻辑;唯有与数据库打交道的SQL语句和ADO.net)

 

Entity(Model)层:

 图片 16

(定义了实体类user)

考察以上三层:

1,实体类user作为参数贯穿于三层之间;

2,通过传参、方法调用来落到实处效益;

3,各层之间负担;互不影响

 

相比较之下两层社团,让大家深入体会三层的高大好处:

或者以机房收费系统的登陆为例:

 图片 17

(观看地方的两层的代码:将业务逻辑、数据访问都展现在用户展现层,当必要须要改变时,须要改变一切种类。比如,我把公文框txtPassWord的名号改为txtPwd的话,大家观察一下得须要改变多少地点。那样的更动算是小的,假如真的有事情须要上的变动才叫麻烦复杂,程序员不跳楼才怪。呵呵、、开个玩笑)

与那样为难适应需要变化的两层相比较,我们再也考察三层代码,再度思考,三层架构有怎么样便宜呢?自己思想。。。。。

 

友善去挖掘吧!!!

 

 1 private void button3_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10 
11                 //调用bll的添加业务
12                 string message = bll.Del(p) ? "删除成功" : "删除失败";
13 
14                 MessageBox.Show(message);
15             }
16             catch
17             {
18                 throw;
19             }
20         }

举一个例证,三层协会得以用餐饮店的实例来驾驭。

图片 18图片 19

 

俺们在写完业务逻辑层之后将要考虑表现层的难题了,为了将增删改查都在一个页面上显现出来,WinForm那样设计

 ————————————————————————————————————————-

俺们利用三层架构就是为了让总体程序可以尤其不难维护,业务逻辑和显现格局还有数据库操做都可以分离来写,那样开发职员也可以更好的分工。而且便于增加,倘诺假若事情必要增添活着要去除某个须要,也易于修改。

很早以前,就听说过三层结构了。当时只知道
三层构造 是把 系统的 界面 跟 数据库操作等不相干的主次分别开来。原来这么简单的贯彻,确实神话中的
三层构造啊。

近期安顿数据格式难点也化解了。图片 20

 图片 21

View Code

 

图片 22所需控件,lable textbox
button dataGridView。

Entity类:

图片 23图片 24

 图片 25

 1  private void button1_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10                 p.Password = textBox2.Text.ToString();
11                 
12                 //调用bll的添加业务
13                 string message = bll.Sel(p) ? "登陆成功" : "登陆失败";
14 
15                 MessageBox.Show(message);
16             }
17             catch
18             {
19                 throw;
20                 //如果出错,可能是数据转换出错或者数据库里已经存在相同的票号
21                // MessageBox.Show("输入数据形式错误,或主键重复");
22             }
23         }

  【数据访问层】

    数据访问层为系统提供了正式,统一数据的拜访入口,保险工作逻辑层对系统数据访问层的业内和便捷,从而已毕数据被急速、安全的造访

    该层会基于工作逻辑层的哀求去处理和数据库之间的交互,不对数据做其余业务上的加工

图片 26图片 27

 

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;

 

namespace LoginUI

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void label1_Click(object sender, EventArgs e)

        {

 

        }

 

        private void btnLogin_Click(object sender, EventArgs e)

        {

            try

            {

                string userName = txtUserName.Text.Trim();   //取出用户界面的数据

                string password = txtPassword.Text;

                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();

                Login.Model.UserInfo user = mgr.UserLogin(userName, password);   //使用用户界面数据 进行查找

 

                //如果没有问题,则登陆成功

                MessageBox.Show("登陆用户:" + user.UserName);

            }

            catch (Exception ex)   //如果登陆有异常 则登陆失败

            {

                MessageBox.Show(ex.Message);

            }

        }

    }

}

首先步大家创造一个缓解方案,里面添加三个类库,如下图所示:

这是数量模块图:

View Code

 

图片 28图片 29缘何dataGridView会突显那么些样子吧?为什么添加的汉语用户名会出现??这一个标记呢?大家有没有遇到过那种气象

上面是那多少个层次的关联。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Data.SqlClient;
 5 using System.Data;
 6 using System.Text;
 7 
 8 namespace DAL
 9 {
10     public static class SQLServerDALHelper
11     {
12         //integrated security=true 的意思是集成验证,也就是说使用Windows验证的方式去连接到数据库服务器。
13         public static string Consql = @"Data Source=PC-201610212048;Initial Catalog=People_Data_System;Integrated Security=True";
14 
15         public static bool ExecuteNonQuery(string sql)
16         {
17             try
18             {
19                 using (SqlConnection conn = new SqlConnection(Consql))
20                 {
21                     conn.Open();//打开数据库
22 
23                    using( SqlCommand com = new SqlCommand(sql, conn)){
24                     return com.ExecuteNonQuery() > 0;
25                        //通过cmd对象对数据库进行操作,执行非查询
26                    }
27                 }
28             }
29             catch
30             {
31                 throw;
32             }
33         }
34 
35         public static Object ExecuteScalar(string sql)
36         {
37             try
38             {
39                 using (SqlConnection conn = new SqlConnection(Consql))
40                 {
41                     conn.Open();//打开数据库
42 
43                     using( SqlCommand com = new SqlCommand(sql, conn))
44                     {
45                         return com.ExecuteScalar();
46                     }
47                 }
48             }
49             catch
50             {
51                 throw;
52             }
53         }
54 
55         public static SqlDataReader GetDataReader(string sql)
56         {
57             try
58             {
59                 SqlConnection conn = new SqlConnection(Consql);
60 
61                 conn.Open();
62 
63                 using (SqlCommand com = new SqlCommand(sql, conn))
64                 {
65                     return com.ExecuteReader(CommandBehavior.CloseConnection);
66                 }
67             }
68             catch
69             {
70                 throw;
71             }
72         }
73     }
74 }

2,为啥选择三层?

行使三层架构的目标:解耦!!!

一致拿地点饭馆的事例来讲:

(1)服务员(UI层)请假——另找服务员;厨子(BLL层)辞职——招聘另一个大厨;采购员(DAL)辞职——招聘另一个采购员;

(2)顾客反映:1>你们店服务态度不好——服务员的题材。开除服务员;

2>你们店菜里有虫子——厨子的题材。换厨子;

 

其它一层暴发变化都不会影响到其它一层!!!

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Entery
 7 {
 8     public class People
 9     {
10         private string name;
11         private string password;
12 
13         public string Name
14         {
15             get { return name; }
16             set { name = value; }
17         }
18 
19         public string Password
20         {
21             get { return password; }
22             set { password = value; }
23         }
24 
25         public People()
26         { 
27         
28         }
29         public People( string name,string password)
30         {
31             this.name = name;
32             this.password = password;
33         }
34     }
35 }

 

 

项目信赖方向:先从表示层传递到业务层再到数据层;

图片 30图片 31

在消费者的眼里,只能看看服务员为她们服务。并不知道后台大厨和采购员是何许做的。对于上述三种分化的角色的话,无论哪个环节出了难题,只必要更换一个职工就足以照常营业的。

现在登记一个用户然后看看展现的功用。

数量访问层(DAL),也简单了解,首假如承受数据的增删改查。

 1 public string Id
 2         {
 3             get;
 4             set;
 5         }
 6 public People( string id,string name,string password)
 7         {
 8             this.id = id;
 9             this.name = name;
10             this.password = password;
11         }

三层架构(我的了解及详细分析)

率先先表达第二个难点,大家的Name显示的真正ID编号,那一个就是大家的实体类缺失Id那几个特性,但是在查询的时候查询的缺失所有的性质,那样子就涌出了这么些显示没有对齐的场景,怎么解决吗,三个方法,第一改动查询条件,只询问Name和Pass,第二我们添加实体ID,大家就用第两种艺术吗。

接下去,看一个用到三层社团的登陆实例。首先,要求讲明一下。那么些实例中有许多bug要求优化。然则对于体现三层的机要思想丰富了。仅仅是一个实例而已。

图片 32图片 33

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data;

using System.Data.SqlClient;

 

namespace Login.DAL

{

    public class UserDAO

    {

        public Login.Model.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.Model.UserInfo user=null;     //用于保存读取的数据

 

                while (reader.Read())       //开始读取数据

                {

                    if (user==null)     //如果没有,则重新生成一个

                    {

                        user=new Login.Model.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;

            }

             

        }

    }

}

View Code

理解C#中得三层架构

       

  • 表示层
  • 作业逻辑层(BLL)
  • 数码访问层(DAL)

关联:暴发着重关系

描述:三层连串布局就是在客户端和数据库之间加一个中间层,寻常状态下客户端不能一向和数据库进行交互,而是通过中间层和数据层举行互动的。

修改实体代码如下

图片 34

只这样修改依然不行的,因为大家在询问方式上还有错误,接着在修改一下DAL层

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Login.BLL    //业务逻辑层

{

    public class LoginManager

    {

        public Login.Model.UserInfo UserLogin(string userName, string Password)

        {

            ///throw new NotImplementedException();

            Login.DAL.UserDAO uDAO = new Login.DAL.UserDAO();  //创建一个user

            Login.Model.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("登陆失败");

            }

        }

    }

}

图片 35图片 36

 图片 37

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Login.DAL     //数据访问层

{

    class DbUtil        //用于保存 链接服务器的sql语句

    {

        public static string ConnString = @"Server=zc-pc;Database=Login;User ID=sa; Password=123456";

    }

}

第一注册一个admin
密码也为admin,用来测试登陆和删除,然后完成dataGridView显示所有数据。

U层:

下边大家就来用三层构造已毕用户登录:

三层架构的优势,仍然职务分开,下降耦合。

View Code

【本人见解】

  表示层接受用户的乞求,依据用户的呼吁去通告工作逻辑层,业务逻辑层收到请求,首先对请求进行审批,然后将请求发给数据访问层或者直接回到到表示层,数据访问层收到请求后就起来访问数据库,数据访问层通过数据库的造访获得请求的结果,并把结果布告工作逻辑层,业务逻辑层收到请求结果将呼吁结果通报表示层,表示层收到请求结果,然后把结果展现给用户;

  ps:用户登录系统就是这一使用的实例。

    用户输入账号密码—->表示层先判断,符合—–>业务逻辑层进行封装———>数据访问层举行越发安全、高效的判断——->结果给业务逻辑层——->表示层呈现结果

    这种传递是一步一步的进展下去,一步一步的归来,不可以当先传递。

View Code

UI指的是服务生,BLL是炊事员,DAL是采购员。

前日我们所急需的增删查问题都早已达成了,但是还有难题,什么难点啊,大家在运作程序的时候会发先dataGridView显示数据在执行增删之后都不开展刷新,所以在实施那八个操做的时候工作执行了而是多少却无力回天刷新到dataGridView控件中,大家应该用如何方法化解呢?我们不是写了一个shows()方法用来展现数据吧,我们只要在急需多少刷新的地点调用那几个主意就行了,已毕很简短,我就不具体改了,大家下来自己要兑现的改一下就好了。明天的情节早已写完了,希望大家辅助,文中有荒唐希望大家能够提出来,让自家读书核对。

二、

 

 

 

View Code

 图片 38

View Code

 

接下去就是事情逻辑层了,那些层就需求引用DAL层和Entityc层了,

小结:对于利用三层架构的次第来说,哪层出错改哪个地方。极大程度的降落了系统的耦合性。当然,具有层次的先后,维护起来自然要便宜广大。

 1      private void button2_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10                 p.Password = textBox2.Text.ToString();
11 
12                 //调用bll的添加业务
13                 string message = bll.Add(p) ? "添加成功" : "添加失败";
14 
15                 MessageBox.Show(message);
16             }
17             catch
18             {
19                 throw;
20             }
21         }

就算那是一个很小的实例,不过用来学学三层却丰富了。有写的不得了的地点可以知道。

登陆代码落成之后就是去除数据的落成了,

多少库表:

图片 39图片 40

一、

开创数据库我就不详细介绍了,只贴出代码就好了

有心人的读者必定会意识,除了UI,BLL,DAL那五个之外还有一个Moudel存在,那几个Moudel不属于其它一层,只是为着更好地链接三层而留存的。那些类只存储,与上述三类共同利用的事物。起一个协调的机能。Moudel类,也就是实体类。

今昔就是考虑已毕的时候了。首先写注册,

实施成功的情状:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using Entery;
 5 using System.Data.SqlClient;
 6 using System.Text;
 7 
 8 namespace DAL
 9 {
10      public class PeopleDAL
11     {
12          public bool Insert(People p)
13          {
14              return SQLServerDALHelper.ExecuteNonQuery(
15                  "insert into Users(Name,Pass) values('"
16                 + p.Name
17                 + "','"
18                 + p.Password
19                 + "')");
20          }
21          public bool Delete(People p) {
22              return SQLServerDALHelper.ExecuteNonQuery(
23                  "delete from Users"
24                 + " where Name = '"
25                 + p.Name
26                 + "'"
27                  );
28          }
29 
30          public bool Select(People p) {
31              return SQLServerDALHelper.ExecuteScalar(
32                  "select Pass from Users where Name = '"
33                  + p.Name
34                  + "'").ToString() == p.Password;                
35          }
36          /// <summary>
37          /// 返回数据集
38          /// </summary>
39          /// <returns></returns>
40          public List<People> SelectAll()
41          {
42              return ConvertReaderToTicketList(SQLServerDALHelper.GetDataReader(
43                     "select * from Users"
44                  )
45              );
46          }
47 
48          public static List<People> ConvertReaderToTicketList(SqlDataReader dr)
49          {
50              List<People> ts = new List<People>();
51 
52              if (dr.HasRows)
53              {
54                  while (dr.Read())
55                  {
56                      ts.Add(new People(dr[0].ToString(), dr[1].ToString()));
57                  }
58              }
59 
60              return ts;
61          }
62     }
63 }

接下去须求看一下,他们分别是什么兑现各自的分工的。

帮忙类写完之后就起来写数据库操做业务了,在此地说一下,接济类微软专门有友好包装的类,能够直接下载使用。数据访问代码如下:那里有大致的增删查方法

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Login.Model

{

    public class UserInfo       //实体类,用于保存用户信息

    {

        public int ID { get; set; }

        public string UserName { get; set; }

        public string Password { get; set; }

        public string Email { get; set; }

    }

}

诸如此类第四个冒出的难题就缓解了,下来大家的话第三个难题,这么些题材是因为数量格式难点,大家string格式对应的是Varchar()不过大家用的是Nvarchar(),所以大家应该在插入数据那块添加一个N,修改代码如下:

  【业务逻辑层】

    接收表示层传来的多寡,以参数的花样传给数据访问层;然后接受数据层发来的处理好的数量,传给表示层。

    该层所做的行事比较复杂,如:已毕业务流程、业务的多司令员验

    是表示层和数据层之间的桥梁,都急需通过作业逻辑层来成功音讯数据的收发

1 CREATE TABLE [dbo].[Users]
2 (
3     [Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
4     [Name] NVARCHAR(50) NOT NULL, 
5     [Pass] NVARCHAR(50) NOT NULL
6 )

D层:

今昔我们先来开头写多少访问层,在数码访问层里,大家首先创建一个帮扶类SQLServerDALHelper,完结多少连接,代码如下:

1什么是三层

  1. 2为啥使用三层
  2. 3与两层的区分
  3. 4三层的具体表现形式 

三层架构现已学了一段时间,一向想做一个相比较完好、比较完美的下结论。然而苦思苦想,不精通怎么下笔。都说整个开首难嘛,先天整治了刹那间杂乱的思路,哎,如故没整理好,想到哪就说到哪呢。

 

初学者很不明了:

1,什么是三层?

2,为何接纳三层?

3,三层与往常应用的两层比较有如何两样?它的优势在哪个地方?

4,如何学好三层?怎样使用三层?

……

那篇博客里我会给大家逐一解释一下,略懂皮毛忘大家见谅!!!

米先生一贯强调:让学习和生活结合,把学习和生存关系,那样的求学才叫会学习,会生活。

对此三层我千方百计,怎么样与实际相挂钩。好嘛,明儿晚上黑马有了“灵感”。还记得大话设计方式里第23章大鸟和菜肴吃羊肉串的故事——由在小摊吃到饭店吃引来的一个下令格局(当然明日不是探究命令方式)。服务员、厨子、采购员。

那不就是个卓越的三层架构吗???(⊙ o
⊙ )啊!哈哈(那些前面再做解释)

 图片 41

 

 

先了解:

 

接下去大家先写实体类,实体类映射的是数额库表,所以实体类里面的属性一定要对应数据库中的表。

三层构造各层之间的的数据传递情势分为请求和响应七个方式;

这边我添加了一个构造函数,对于可能必要落成的效益来说,重载构造函数就多了一种已毕形式,所以随便有用没用,先写上加以。

第一,先来看一下是哪三层。表示层(UI,User
Interface),业务逻辑层(BLL BusinessLogicLayer),数据访问层(DAL Data
Access Layer)。三层的划分是物理上的分割。

咱们的多少访问层那就已经写完了,那里究竟也都只是套路而已,通晓了套路,所有的事物等于都控制了。

输入错误新闻:

那多少个类库分别表示的是事情逻辑层BLL,数据访问层DAL,还有实体Entity,下一步就是添加你要求的显现层,我为了表示知道直接使用了UI命名。图片 42

 

 1 这里先自定义一个shows()方法,然后在Form_Load里调用shows()方法 
 2 private void shows()
 3         {
 4             try
 5             {
 6                 dataGridView1.DataSource = bll.ShowAll();
 7             }
 8             catch {
 9                 MessageBox.Show("链接数据库出错");
10             }
11         }

三层之间的松耦合互不惊动,之间的关联是由此自己提供的接口来走访;

紧接着我们先导要贯彻登陆难题了。代码如下:

 

图片 43图片 44

C#三层架构登陆实例

事务逻辑层(BLL),算是表示层和多少访问层的桥梁吧。里面根本存放在一些业务流程。也就是逻辑。主要功用就是从DAL中获取数据,然后突显到UI上。

 

接下去,看一下实施结果:

B层:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data.SqlClient;

 

namespace Login.DAL

{

    public class ScoreDAO     //首次登陆,增加10积分

    {

        public void UpdateScore(string userName, int value)

        {

            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();

            }

        }

    }

}

  【表示层】

    首要担负落成用户和种类的相互。

    它接受用户输入的音信,并把上边传来的处理结果表示给用户。盖层有时候兼容一小部分作业逻辑层的效率(验证用户输入的数量及其合法性)

    一般作为Windows或者Web应用程序

在三层之间,各层之间是互相信赖的关联的,表示层看重业务层逻辑,业务层重视数据访问层,三层之间通过我提供的对外方法来传递访问

 

相关文章