很早之前,就听说过三层结构了。当时只知道 三层结构 是把 系统的 界面  跟 数据库操作等不相关的程序分别开来。原来这么简单的实现,确实传说中的 三层结构啊。

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

表示层(UI),这个最容易理解,就是用户看到的主界面。

数据访问层(DAL),也不难理解,主要是负责数据的增删改查。

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

举一个例子,三层结构可以用饭店的实例来理解。

UI 指的是服务员, BLL 是厨师, DAL 是采购员。

在顾客的眼里,只能看到服务员为他们服务。并不知道后台厨师和采购员 是如何做的。对于上述三种不同的角色来说,无论哪个环节出了问题,只需要更换一个员工就可以照常营业的。

三层架构的优势,还是职责分离,降低耦合。

接下来,看一个使用三层结构的登陆实例。首先,需要声明一下。这个实例中有很多 bug 需要优化。不过对于展示三层的主要思想足够了。仅仅是一个实例而已。

数据库表:

这是数据模块图:

细心的读者肯定会发现,除了 UI,BLL,DAL 这三个之外还有一个 Moudel 存在,这个 Moudel 不属于任何一层,只是为了更好地链接三层而存在的。这个类只存储,与以上三类共同使用的东西。起一个 协调的作用。 Moudel 类,也就是实体类。

下面是这几个层次的关系。

接下来需要看一下,他们分别是如何实现各自的分工的。

UserModel类:

namespace LoginModel
{
/// <summary>
/// 实体类,用于保存用户信息
/// </summary>
public class UserModel
{
public int Id { get; set; }
public string UserName { get; set; }
public string UserPwd { get; set; }
}
}

UI层:

private void btnLogin_Click(object sender, EventArgs e)
{
try
{
////取出用户界面的数据
string userName = txtUserName.Text.Trim();
string userPwd = txtUserPwd.Text;
UserBLL userBll = new UserBLL();//实例化一个业务逻辑层BLL
UserModel userModel = userBll.UserLogin(userName, userPwd);//使用用户界面数据,进行查找BLL数据
MessageBox.Show("登陆用户:" + userModel.UserName);
}
catch (Exception ex) //如果登陆有异常 则登陆失败
{
MessageBox.Show(ex.Message);
}
}

BLL层:

namespace LoginBLL
{
/// <summary>
/// //业务逻辑层
/// </summary>
public class UserBLL
{
public UserModel UserLogin(string userName, string userPwd)
{
UserDAL userDal = new UserDAL();//实例化一个数据访问层
UserModel user = userDal.SelectUser(userName, userPwd);////通过ui中填写的内容 返回来相应的数据
if (user != null)
{
return user;//如果数据库中有数据,则返回一个实体类
}
else
{
throw new Exception("登陆失败");
}
}
}
}

DAL层:

UserDAL类:

namespace LoginDAL
{
public class UserDAL
{
////根据 ui 选择返回一个user
public UserModel SelectUser(string userName, string userPwd)
{
using (SqlConnection conn = new SqlConnection(DbUtil.connString))
{
//创建一个命令对象,并添加命令
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"select Id,UserName,UserPwd from T_UserInfo where UserName=@UserName and UserPwd=@UserPwd";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@UserName",userName);
cmd.Parameters.AddWithValue("@UserPwd", userPwd);
conn.Open();//打开数据链接
SqlDataReader reader = cmd.ExecuteReader();
UserModel user = null; //用于保存读取的数据
while (reader.Read()) //开始读取数据
{
if (user == null) //如果没有,则重新生成一个
{
user = new UserModel();
}
user.Id = reader.GetInt32();
user.UserName = reader.GetString();
user.UserPwd = reader.GetString();
}
return user;
}
}
}
}

DbUtil类:

namespace LoginDAL
{
/// <summary>
/// //数据访问层,用于保存 链接服务器的sql语句
/// </summary>
class DbUtil
{
public static string connString = @"Server=xxx;Database=xx;User ID=sa; Password=123";
}
}

c#三层架构登陆实例的更多相关文章

  1. [转]C#三层架构登陆实例

    很早之前,就听说过三层结构了.当时只知道 三层结构 是把 系统的 界面  跟 数据库操作等不相关的程序分别开来.原来这么简单的实现,确实传说中的 三层结构啊. 首先,先来看一下是哪三层.表示层(UI, ...

  2. 31、三层架构、AJAX+FormsAuthentication实现登陆

    三层架构 前段时间公司要求修改一个网站,打开后我疯了,一层没有都是调用的DB接口,遍地的SQL语句,非常杂乱. 什么是三层架构? 三层架构是将整个项目划分为三个层次:表现层.业务逻辑层.数据访问层.目 ...

  3. JavaWeb学习之三层架构实例(三)

    引言 通过上一篇博客JavaWeb学习之三层架构实例(二)我们基本上已经实现了对学生信息列表的增删改查操作(UI除外),但是不难看出,代码冗余度太高了,尤其是StudentDao这个类,其中的增删改查 ...

  4. JavaWeb学习之三层架构实例(二)

    引言 这个实例是上一个实例JavaWeb学习 三层架构实例(一)的加强版,实现的是在前端对数据库中student表的 增.删.改.查 操作.关于三层组成云云,这里就不再叙述. 实例 效果图 先来看一下 ...

  5. C#三层架构实例

    对于三层的概念查也查了,看也看了,下面是我找的一个关于三层的简单实例,真正看一下它是如何具体实现的. 我们先来一起看看 实体类-Model 实质:实体类就是在完成数据库与实体类对应的功能,一个类是一张 ...

  6. 三层架构(MVC)实现简单登陆注册验证(含验证码)

    前言在我的上一篇微博里我已经提出了登陆的方法,当时我采取的是纯servlet方式,因为当时刚接触到servlet,正好网上没有这方面的全面讲解,所以我就发飙了.不过在现实生产中我们大多采用的三层架构. ...

  7. java:Session(概述,三层架构实例(实现接口封装JDBC),Session实现简单购物车实例)

    1.Session概述: Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存 ...

  8. C# 使用三层架构实例演示-winForm 窗体登录功能

    ---------------------------------------------------------------------------------------------------华 ...

  9. 新闻公布系统 (Asp.net 三层架构 )

    2012年度课程设计---新闻公布系统(小结)                                                                             ...

随机推荐

  1. java遍历map的四种方式

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  2. iOS中AOP与Method Swizzling 项目中的应用

    引子:项目中需要对按钮点击事件进行统计分析,现在项目中就是在按钮的响应代码中添加点击事件,非常繁琐.所以使用了AOP(面向切面编程),将统计的业务逻辑统一抽离出来. 项目中添加的开源库:https:/ ...

  3. 安卓手机当Mac、Win和Linux外置WIFI网卡

    Android手机都有USB共享网络的功能 ,利用此功能可以将网络共享给电脑 基本原理: 手机连接WIFI,开启USB网络共享,mac笔记本上网 (两款手机示意图) 博主实践证明: win10与Ubu ...

  4. 深入理解Java虚拟机之读书笔记二 垃圾收集器

    1.对象已死? a.引用计数算法:缺点是它很难解决对象之间的相互循环引用的问题,Java语言中没有选用它. b.根搜索算法(GC Roots Tracing):通过一系列的名为"GC Roo ...

  5. iOS开发——项目篇—高仿百思不得姐

    01 一.包装为导航控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewControll ...

  6. Unity3D游戏制作(四)——Asset Server搭建

    本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处. http://blog.csdn.net/amazonzx/article/details/7980117 Asset Server是 ...

  7. python 字典 注意点

    dict()构造函数直接从键-值对序列创建字典: >>> >>> dict([('sape', 4139), ('guido', 4127), ('jack', 4 ...

  8. 获取SHA1和MD5

    首先:1.我们进入到通过cmd打开控制台,进入cmd定位到.android文件夹下.如下图: 2.输入keytool -list -v -keystore debug.keystore得到三种指纹证书 ...

  9. centos7 python3.5 下安装paramiko

    centos7 python3.5 下安装paramiko 安装开发包 yum install openssl openssl-devel python-dev -y 安装pip前需要前置安装setu ...

  10. ubuntu安装文件比较工具Meld

    Meld是一款可视化的文件及目录对比(diff) / 合并 (merge) 工具,通过它你可以对两个或三个文件/目录进行对比,并以图形化的方式显示出它们的不同之处,同时还提供编辑及合并功能,另外还支持 ...