【机房收费个人版】七层登陆

     敲完七层登陆之后,让我认识到所谓的七层就是在三层的基础上添加了两个模式和一个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 IDAL

Public 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 ICheckUser

    End Function

End 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.CheckUser

        Dim 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 users

    End Function

End 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上面执行实例化命令变量,并执行语句cmdType
        cmd = 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 Then
                conn.Open()
            End If

            ''向adaptor对象中填充查询的数据
            adapter.Fill(adataset)
            ''清除参数
            cmd.Parameters.Clear()

        Catch ex As Exception
            ''错误处理的程序,出错则提示
            MsgBox(ex.Message, , "数据库操作")
        Finally
            ''如果连接状态为打开则将其关闭,释放内存
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End 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 Then
            flag = False
        Else
            flag = True
        End If

        Return flag

    End Function

End Class

总结

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

你可能感兴趣的:(.net,数据库,架构设计,framework,sqlserver,dataset)