三层登录实例总结

三层结构即:UI(显示层)、BLL(业务逻辑层)、DAL(数据访问层)

UI的作用:

(1)向用户展现特定业务数据;

(2)采集用户的输入信息和操作。

BLL的作用:

(1)从DAL中获取数据,以供UI显示用;

(2)从UI中获取用户指令和数据,执行业务逻辑;

(3)从UI中获取用户指令和数据,通过DAL写入数据源。

DAL的作用:

(1)从数据源加载数据(Select);

(2)向数据源写入数据(Insert / Update);

(3)从数据源删除数据(Delete)。

三层之间的引用关系:UI -> BLL -> DAL

具体应用原则:

(1)DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理;

(2)UI只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理;

(3)BLL负责处理业务逻辑,通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要数据给UI。

使用VS编程具体实现如下:

创建一个名为“LoginSolution”的解决方案,然后添加项目,项目名称分别为LoginUI、LoginBLL、LoginDAL、LoginModel,在各个项目下添加类。LoginUI引用LoginBLL和LoginModel,LoginBLL引用LoginDAL和LoginModel,LoginDAL引用LoginModel。效果如下图:


用户界面如下图:


LoginUI的代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
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 btnLogin_Click(object sender, EventArgs e)
        {
            try
            {
                //取出用户界面的数据
                string userName = txtUserName.Text.Trim();
                string password = txtPassword.Text;

                //需要调用BLL层,实例化一个对象:
                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();

                //调用BLL层的方法,将用户输入的信息作为参数传入该方法:
                Login.Model.UserInfo user = mgr.UserLogin(userName, password);

                //登录成功则显示用户名:
                MessageBox.Show("登录用户:" + user.UserName);
            }
            catch (Exception ex)  //如有登录异常,则提示登录失败
            {
                MessageBox.Show(ex.Message);
            }
            
        }
   

LoginBLL的代码如下:

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)
        {
            Login.DAL.UserDAO uDao = new DAL.UserDAO();
            Login.Model .UserInfo user= uDao.SelectUser(userName, password);
            if (user != null)
            {
                Login.DAL.ScoreDAO sDao = new DAL.ScoreDAO();
                sDao.UpdateScore(userName, 10);
                return user;
            }
            else
            {
                throw new Exception("登录失败。");
            }   
        }
    }
}

LoginDAL的代码如下:

(1)UserDAO代码:

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)
        {
            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))
                    {
                        user.Email = reader.GetString(3);
                    }
                }
                return user;
            }
        }
    }
}

(2)ScoreDAO代码:

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
    {
        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)";
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Score", value));
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }
    }
}

(3)Dbutil代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.DAL
{
    class Dbutil
    {
        //创建数据库连接字符串:
        public static string ConnString = @"Server=DESKTOP-GUV4MCR;Database=Login;User ID=sa;Password=123";
    }
}

LoginModel的代码如下:

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; }
    }
}

数据库中Scores表和Users表设计如下:

     


再来一张图~





感谢您的阅读~



评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值