敲完七层登陆之后,让我认识到所谓的七层就是在三层的基础上添加了两个模式和一个SqlHelper。外观模式完美的体现了依赖倒转原则和迪米特法则的思想,降低了耦合性;反射+配置文件+抽象工厂模式,用于实现数据的访问,它让具体的创建实例的过程与B层分离,B层通过它们的抽象接口操纵实例,同样也降低了耦合性。

这张图是我对七层登陆的理解。在这个流程中,比较复杂的是B层,现在我就写一写我对它的理解。可以分为三个步骤:

一、

声明一个登陆工厂loginFactory和一个登陆接口IUser,IUser = loginFactory.Function。这里的Function定义为接口类型,其作用是链接DAL;DAL的作用是从数据库中查找相关的数据,然后返回数据表。它只是给出查询的方法和要查询什么,但实际的操作却不是它,而是另有“蹊跷”。

SqlHelper是我们自行定义个一个类,它的作用就是数据库的连接与关闭,以及查询相关数据的具体化,是真正与数据库打交道的类。设计SqlHelper会使我们更方便、安全的对数据库进行操作,减少耦合性,可以使SqlHelper以外的所有类不用引用数据库操作的任何类与语句,也无须担心数据库的连接与关闭问题。说了这么多,还是看看具体的代码吧!

Factory:方法为接口类型,链接DAL

'********************************
'作者:郭贤达
'小组:个人
'说明:用于引用D层
'日期:2015.5.16
'版本号:V1.00
'********************************''添加反射的引用
Imports System.Reflection
''添加对配置文件的引用
Imports System.Configuration
Imports IDALPublic Class LoginFacotry''定义数据程序集名称Private Shared ReadOnly AssemblyName As String = "DAL"'表示读配置文件,如果配置文件中是sqlserver就访问sqlserver数据库Private Shared db As String = System.Configuration.ConfigurationManager.AppSettings("DB")''property用于存储和检索属性值的属性名称和过程'Private Property assemblyName As String = AssemlyName''' <summary>''' 创建用户表的工厂,实际上是在定义IDAL的方法''' </summary>''' <remarks></remarks>Public Function UserFactory() As IDAL.IUserDAL''AssemblyName是程序集的名称,db+“UserDAL”是DAL层中的sqlServerUserDAL 如果不用SQLserver数据库,那么我们''再建一个类 比如我们访问access数据库 那么类名称就叫accessUserDal,把配置文件''中Value值改为Access 这样就是扩展而不是修改Dim name As String = AssemblyName + "." + db + "UserDAL"''实例化接口Dim ICheckUser As IUserDAL''反射的应用。(Assembly.Load(当前程序集名称).CreateInstance(当前命名空间名称), 要实例化的类名)''将实例化的D层通过向上转型转换成接口类,然后通过调用接口类中的函数来调用D层中实现该接口的函数''ctype返回表达式显示转换为指定的数据类型/对象/结构/类或接口的结果ICheckUser = CType(Assembly.Load(AssemblyName).CreateInstance(name), IUserDAL)Return ICheckUserEnd FunctionEnd Class

DAL层

'*******************************
'作者:郭贤达
'小组:个人
'说明:接收数据库T_User传回的数据
'日期:2015.5.13
'版本号:V1.00
'**********************************''SQL Server的.NET Framework数据提供程序描述了一个类集合,访问托管空间中的数据库,用于查询和更新数据库
Imports System.Data.SqlClient
''提供对表示ADO.NET结构的类的访问,通过ADO.NET可以生成一些组件,用于有效管理多个数据源的数据
Imports System.Data
Imports System.Configuration
Imports Models
Imports IDAL''实现接口中的方法
Public Class SqlServerUserDAL : Implements IDAL.IUserDAL''' <summary>''' 调用数据库中的数据.implements指示某一类或结构成员为借口中定义的成员提供实现''' </summary>''' <param name="user"></param>''' <returns></returns>''' <remarks></remarks>Public Function CheckUser(user As UserEntity) As DataTable Implements IDAL.IUserDAL.CheckUserDim sqlHelper As New sqlHelper()Dim sql As String''中间变量,用于存储从数据库中查询到的信息Dim users As DataTable''表示system.data.sqlclient.sqlcommand的参数,也可以是它到system.data.dataset列的映射,此类不能被继承Dim sqlParams As SqlParameter() = {New SqlParameter("@UserID", user.UserID), New SqlParameter("@Password", user.Password)}sql = "select * from T_User where UserID=@UserID and Password=@Password"''调用SqlHelper类中的GetDataTable()方法来执行,并获取返回值users = sqlHelper.ExecSelect(sql, CommandType.Text, sqlParams)Return usersEnd FunctionEnd Class

SqlHelper

    'shared是指定与某一类或结构的所有实例关联的一个或多个所声明的编程元素''定义全局变量,获取数据库的连接字符串Private Shared ConnectionString As String = ConfigurationManager.AppSettings("ConnString")''建立数据库连接Shared conn As SqlConnection = New SqlConnection(ConnectionString)''定义命令变量.sqlcommand表示要对sqlserver数据库执行的一个T-SQL语句或存储过程Shared cmd As SqlCommand''' <summary>''' 执行查询的操作,有参''' </summary>''' <param name="sql">执行增删改查SQL语句或存储过程</param>''' <param name="cmdType">命令类型文本或存储过程</param>''' <param name="sqlparams">参数数组</param>''' <returns></returns>''' <remarks></remarks>Public Shared Function ExecSelect(ByVal sql As String, ByVal cmdType As CommandType, ByVal sqlparams As SqlParameter()) As DataTable''定义数据适配器.用于填充dataset和更新sqlserver数据库的一组数据命令和一个数据库连接,不能被继承Dim adapter As SqlDataAdapter''定义并实例化数据缓冲对象,即从数据库传入的对象Dim adataset As New DataSet''在conn上面执行实例化命令变量,并执行语句cmdTypecmd = New SqlCommand(sql, conn)''commandtype表示获取或设置一个值,该值指示如何解释commandText的属性cmd.CommandType = cmdType''addrange表示添加parameter值的数组cmd.Parameters.AddRange(sqlparams)''将结果绑定到数据适配器变量adaptor上面adapter = New SqlDataAdapter(cmd)Try''如果数据库连接状态为关闭则将其打开If conn.State = ConnectionState.Closed Thenconn.Open()End If''向adaptor对象中填充查询的数据adapter.Fill(adataset)''清除参数cmd.Parameters.Clear()Catch ex As Exception''错误处理的程序,出错则提示MsgBox(ex.Message, , "数据库操作")Finally''如果连接状态为打开则将其关闭,释放内存If conn.State = ConnectionState.Open Thenconn.Close()End IfEnd Try''tables获取包含在dataset中的表的集合Return adataset.Tables(0)End Function

二、

声明一个DataTable类型的变量users,users = IUser.CheckUser(user)。users是一个中间变量,IUser将数据库返回的数据赋值给users,users用于存储查询出来的相关数据。

三、

声明一个Boolean类型的变量flag,用于判断users.Rows.Count 。如果Count =1,说明登陆用户存在,并且密码正确。

以上三个步骤的说明,使我七层登陆有了一种豁然开朗的感觉,那么B层的具体代码如下:

'******************************
'作者:郭贤达
'小组:个人
'说明:创建登陆类,实现登录过程的逻辑处理
'日期:2015.5.13
'版本号:V1.00
'*****************************
Imports Factory
Imports IDAL
Imports Models
Public Class LoginBLL''' <summary>''' 检查用户是否存在''' </summary>''' <remarks></remarks>Function CheckUser(ByVal user As Models.UserEntity) As Boolean''引用Factory层,声明必要类Dim loginFactory As New Factory.LoginFacotry''引用接口层Dim IUser As IDAL.IUserDAL''中间变量Dim users As DataTable''用于判断该用户是否存在Dim flag As Boolean''调用创建用户的工厂方法IUser = loginFactory.UserFactory()'由于在sqlHelper中返回的形式为表格形式(adataset.Tables(0))users = IUser.CheckUser(user)If users.Rows.Count = 1 Thenflag = FalseElseflag = TrueEnd IfReturn flagEnd FunctionEnd Class

总结

通过对机房登陆三个步骤的讲解,我们可以可以总结出,七层登陆是处于查询——返值——判断的一个流程。那么,机房收费系统的其他功能都处于什么样的一个流程?!这需要我继续从实践中总结。接下来的任务就是在七层基础上探索机房的其他功能、提升自身对代码的亲和力、解决问题的能力以及培养自身的专业水平!下一篇博文《【机房收费个人版】SqlHelper》

【机房收费个人版】七层登陆相关推荐

  1. 【机房收费个人版】SqlHelper

    之前敲完七层登陆之后,我天真的认为Sqlhelper就只是由一个function组成!!后来看到大家的博客,原来是由好几个function组成的,每个function都对应特定的数据库增删改查!现在想 ...

  2. VB.NET版机房收费系统---七仙女之系统登录

    VB.NET第一版机房收费系统,告一段落,验收的时候,问题也是大大的存在,没有用上设计模式,什么触发器,存储过程,都没有用上,看看其她小伙伴的,七层实现登录?那是什么东东,相比较我的三层而言,多了两倍 ...

  3. 【机房收费个人版】DataTable 与泛型集合的较量

    将近三周的时间,我学到了很多知识,让我受益匪浅!也通过这三周的积累和整理,现在是时候写博客分享我的所知所得了..下面主要写DataTable.泛型集合以及它们之间的比较.. DataTable     ...

  4. 【机房收费个人版】触发器与存储过程

    这篇博客主要写的是触发器和存储过程的应用.实例.优点.不同及弊端,最后通过总的分析,总结出谁更胜一筹.. 触发器 定义      触发器是一种机制,用来强制业务规则和数据完整性,当指定表中的数据发生变 ...

  5. 【机房收费系统个人版】三层登陆

    机房收费个人版这个项目,很早就开始进行了,但是直到现在还没有完成..原因有两方面,首先是自身的个人管理不到位.做事拖拖拉拉,没有很好的节制自身的不良习惯:其次是思想价值观极端化.世界上没有谁能将所有事 ...

  6. vb.net机房收费系统重构——存储过程的使用

    在敲写七层登陆过程中,接触了存储过程的概念,但当时还没使用.在正式的重构过程中,一点点添加,将存储过程也添加到了重构中.才正式了解了存储过程. 首先 [存储过程的概念] 存储过程Procedure是一 ...

  7. 机房收费系统重构(五)—登陆窗口完整版

         在上上篇.<机房收费系统重构(3)>.中主要是介绍了自己关于DAL层,工厂层.以及接口层,还有实体层的理解.可是好多读者再问我.你的代码呢,我在这解释一下.就是我仅仅是写出关于那 ...

  8. .NET分层登陆——机房收费系统再总结

    去年的时候,我写过一篇机房收费系统登陆的总结文章,那是站在VB的基础上,直接查询数据库实现的登陆.是非常初期的知识.假设想了解详情,请看VB查询数据库之登陆窗口--机房收费系统总结(一). 今天.我要 ...

  9. 【C#】七层登录机房重构

    前言 终于开始机房重构了,在此之前,我用三层敲了机房的部分功能,感觉还不错,现在真正到了七层,还是蛮紧张的.话不多说,开始机房的七层登录. 包图 我发现好多伙伴写七层登录的时候,都喜欢分析一下包图,那 ...

最新文章

  1. kali2018.2安装配置OpenVAS-9及错误处置
  2. Django 之Form
  3. UVA 10405 - Longest Common Subsequence
  4. LINQPad学习与验证工具
  5. brew install php55 报错 clang: error
  6. 机器学习工程师 - Udacity 癌症检测深度学习
  7. 80. 删除排序数组中的重复项 II golang
  8. linux java 进程内存_linux – 在java进程中消耗内存的是什么?
  9. web开发快餐式入门指南 0. 写在前面
  10. 9-Mybatis 多表查询之一对多
  11. C++ STL unordered_map按照value排序
  12. JAVA的Random类(转)
  13. java web程序设计与..._Java Web程序设计
  14. CAPL学习之路-诊断函数
  15. 非常全面详细的Sklearn介绍
  16. QQ “安全检查未通过,禁止下载该文件” 解决方法
  17. application实现一个简单的网页计数器
  18. java开发 三年经验
  19. 打通课堂课外芝士笔记开辟K12教育领域下一个时间战场
  20. 如何进行强制类型转换?

热门文章

  1. android 信号研究(包括信号图标和信号优化)
  2. Episode II 计算机病毒概论
  3. Excel.Application使用手册(API)
  4. 求生之路怎么显示所有服务器,求生之路2怎么屏蔽rpg服务器 求生之路2屏蔽rpg服务器方法_游侠网...
  5. 2018世界人工智能蓝皮书:看中国到底有多强!
  6. 浏览器禁用cookie后session还能用吗?cookie与session区别
  7. NI LabVIEW 2014SP1视觉开发必备软件和工具包
  8. Domino Web网页中更改密码比你想得简单得多
  9. NPDP知识推送-第七章产品生周期管理(3)
  10. 高斯-约当消元法(转)