三层结构即: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表设计如下:
再来一张图~
感谢您的阅读~