三层结构

    xiaoxiao2022-07-05  171

    什么是三层结构呢?

    其实分为物理上的三层结构和逻辑上的三层结构。 物理上的三层结构:显示层/业务层/数据层 逻辑行的三层结构:UI(显示层)、BLL(业务逻辑层)、DAL(数据访问层)

    那么DAL(数据访问层)的具体工作都有什么呢?

    DAL的作用:其实就是和数据源打交道 从数据源加载数据(Select) 向数据源写入数据(Insert/Update) 从数据源删除数据(Delete)

    那么UI(显示层)的具体工作都有什么呢?

    UI的作用: 向用户展现特定业务数据 采集用户的输入信息和操作

    UI设计的原则:用户至上,兼顾简洁

    那么BLL(业务逻辑层)的具体工作都有什么呢?

    BLL的作用: 从DAL中获取数据,以供UI显示用 从UI中获取用户指令和数据,执行业务逻辑 从UI中获取用户指令和数据,通过DAL写入数据源

    BLL的职责: ① UI->BLL->UI(UI发出业务请求到BLL,BLL处理完后将结果返回给UI层) ② UI->BLL->DAL->BLL->UI(UI发送业务请求到BLL,然后BLL想DAL发送数据请求,DAL将查到的数据返回给BLL层,BLL层处理完后在将结果返回给UI层)

    那么三个层之间的联系是什么样子的呢?

    其中的业务数据模型:其实就是需要在三个层之间都用的一些数据 从这个图就可以看出,我们首先就要做在各个层之间引用他的下一层和公用的业务数据模型,但是通过个人的实践,提示大家不用轻易去改命名空间,因为很多地方都很出错。

    业务数据模型层代码实现

    public class UserInfo//设置在三层之间传参的一些变量 { public int ID { get; set; } public string UserName { get; set; } public string PassWord { get; set; } public string Email { get; set; } }

    UI层代码实现

    string username = txtUserName.Text.Trim();//获取用户输入的姓名 string password = txtPassword.Text; //获取用户输入的密码 string msg = "";//获取从BLL层返回的登录提示 Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();//实例化一个BLL层的对象 Login.Model.UserInfo user= mgr.UserLogin(username, password,out msg);//建立一个通用的对象user接受数据链路层产生的user信息 if(user!=null)//如果有该用户的信息 { MessageBox.Show(user.UserName+msg);//显示该用户登录成功 } else//如果没有该用户的信息 { MessageBox.Show(msg);//提示登录失败 }

    BLL层代码实现

    public Login.Model.UserInfo UserLogin(string userName,string password,out string msg) { //throw new NotImplementedException(); Login.DAL.UserDAO uDAO = new Login.DAL.UserDAO();//建立一个DAL的用户表对象 Login.Model.UserInfo user= uDAO.SelectUser(userName, password);//建立一个用户,接受数据链路层查到的用户信息 if(user!=null)//如果查到用户信息 { Login.DAL.ScoreDAO sDAO = new Login.DAL.ScoreDAO();//建立一个DAL层的分数表对象 sDAO.UpdateScore(userName, 10);//将用户名和分数添加更新一下 msg = "登录成功";//返回登录成功的信息给UI层 } else//如果没有查到用户信息 { msg = "登录失败";//返回登录失败的信息给UI层 } return user;//返回用户的信息 }

    DAL层的代码实现

    先建立一个DbUtil类,里面写上要连接数据所用的字符串

    public static string ConnString = @"Server=DESKTOP-3C5TOKF; Database=Login; User ID=sa; Password=123456";//创建一个字符串,里面写上连接数据库的信息

    在建立一个UserDAO类,用于对users表的操作

    using System.Data.SqlClient;//引入对SQL server操作的命名空间 public Login.Model.UserInfo SelectUser(string userName,string passWord) { using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//实例化一个数据库打开连接的对象cnn { SqlCommand cmd = conn.CreateCommand();//实例化一个对SQL执行操作的对象 cmd.CommandText =@"select id,username,password,email from users where UserName=@UserName AND Password=@Password";//设置执行的SQL语句 cmd.CommandType = System.Data.CommandType.Text;//表示commandtext执行的是文本形式的 cmd.Parameters.Add(new SqlParameter("@UserName", userName));//对sql执行语句里面的参数赋值,并添加到字符串上 cmd.Parameters.Add(new SqlParameter("@Password", passWord)); conn.Open();//打开连接 //ExecuteReader()方法返回类型返回类型为SqlDataReader。用于用户进行的查询操作 //要使用SqlDataReader对象的Read();方法进行逐行读取。 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);//get**(a)——**表示返回指定值的类型,a表示返回值的列数 user.UserName = reader.GetString(1); user.PassWord = reader.GetString(2); if(!reader.IsDBNull(3))//如果第三列的值不为空 { user.Email = reader.GetString(3); } } return user;//将用户信息返回给BLL层 } }

    在建立一个UserDAO类,用于对users表的操作

    using System.Data.SqlClient;//添加连接数据库的引用 public void UpdateScore(string userName,int value)//更新分数的函数 { using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//实例化数据库的打开连接cnn,使用using会自动关闭连接 { SqlCommand cmd = conn.CreateCommand();//创建一个执行数据库操作的对象,然后利用上面打开连接,连接到数据库 cmd.CommandText = @"Insert into scores(ID,UserName,Score) values(1,@UserName,@Score)";//然后执行对数据库的操作语句 cmd.Parameters.Add(new SqlParameter("@UserName", userName));//将SQL语句的参数赋值,并添加到字符串上 cmd.Parameters.Add(new SqlParameter("@Score", value)); conn.Open();//将连接打开 cmd.ExecuteNonQuery();//执行SQL语句,并会返回受影响的行数 } }

    我们来说一下DAL层所涉及到的关于连接数据库的知识点(请点击查看)

    1、SqlConnection类和SqlCommand类

    2、SqlDataReader类和Parameters的Add方法

    最新回复(0)