VB.net版机房收费系统——三层登录

  年后开学这几天,一直在整VB.net版的机房收费系统,设计了数据库,画了ER图,把相关的文档更新了一丁点儿,接下来,就开始了三层之旅。

  虽说看了王继彬老师讲的三层视频后,也用C# 代码实现了三层登陆,但是理解得还是不深刻,实战的时候就看出了自己的不足。于是,看了好多博客,最后一句简单的代码让我瞬间明白了全局,终于实现了登录,这也让我对七层登录的实现满怀信心~

  首先看一下相关的解决方案:

VB.net版机房收费系统——三层登录_第1张图片

  下面是相关的代码,写了好多注释,从代码中可以看出我的学习过程和理解~

Entity层

<span style="font-size:18px;">Public Class eUserLogin
    '定义属性变量
    Private e_UserID As String
    Private e_PassWord As String
    '用户名
    Public Property UserID() As String
        Get
            Return e_UserID
        End Get
        Set(value As String)
            e_UserID = value
        End Set
    End Property
    '密码
    Public Property PassWord() As String
        Get
            Return e_PassWord
        End Get
        Set(value As String)
            e_PassWord = value
        End Set
    End Property
End Class</span>
  如果把实体层比作一辆车的话,里边定义的属性变量就是乘客,而且是VIP级的,因为若是没有提前报名,他是不会搭理你的~

UI层

<span style="font-size:18px;">Public Class frmLogin
    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        Try   
            '定义的UserInfo算是全局实体,很像是直达的列车,中途不倒车
            Dim UserInfo As New Entity.eUserLogin
            '将用户名和密码放入实体
            UserInfo.UserID = txtUserName.Text.Trim()
            UserInfo.PassWord = txtPassword.Text.Trim()

            '判断输入是否正确  
            If txtUserName.Text = "" Then
                MsgBox("用户名不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
                Return
            End If

            If txtPassword.Text = "" Then
                MsgBox("密码不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
                Return
            End If

            '实例化BLL实体,用来对传入的登录信息实体做判断
            Dim bLogin As New BLL.bUserLogin
            '定义一个最终的返回实体returnUserInfo,承接经过D层查询,B层判断的登录信息
            Dim returnUserInfo As New Entity.eUserLogin
            '调用B层中的方法CheckUserInfo
            returnUserInfo = bLogin.CheckUserInfo(UserInfo)

        Catch ex As Exception
            '错误提示
            MessageBox.Show(ex.Message.ToString())
        End Try
    End Sub</span>

  实体的命名思路:U层实例化一个接收实体,用来存放登录时输入的用户名和密码;由于这个实体承载的信息是全局(我称它为全局实体)故命名上没加前缀,别的层定义实体时,命名规则是:在哪个层定义,前缀就是那个层的首字母。

BLL层

<span style="font-size:18px;">Public Class bUserLogin
    'UserInfo用来承载用户登录时输入的用户名和密码,全局实体

    Public Function CheckUserInfo(ByVal UserInfo As Entity.eUserLogin) As Entity.eUserLogin
        '实例化D层
        Dim dLogin As New DAL.dUserLogin
        '定义B层的返回实体
        Dim bUserInfo As New Entity.eUserLogin
        '调用D层中的SelectUserInfo方法
        bUserInfo = dLogin.SelectUserInfo(UserInfo)

        'If IsNothing(bUserInfo.UserID) Then
        '    Throw New Exception("登录信息有误,请核实~")
        If (bUserInfo.UserID Is Nothing Or bUserInfo.PassWord Is Nothing) Then
            Throw New Exception("用户名或密码错误,请核实~")
        Else
            'MsgBox("登录成功,正在登录系统……")

            '这样写标签名字就不是BLL了,效果见下图
            MsgBox("登录成功,正在登录系统……", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
            Return bUserInfo
        End If
    End Function
End Class</span>

VB.net版机房收费系统——三层登录_第2张图片

VB.net版机房收费系统——三层登录_第3张图片

DAL层

  SqlHelper,连接数据库的公用字符串:

<span style="font-size:18px;">Imports System.Data
Imports System.Data.SqlClient
Public Class dSqlHelper
    Public Shared Function connstring() As String
        '连接数据库的字符串
        connstring = "server=SUN;database=ComputerCharge_sys;uid=sa;pwd=1"
    End Function
End Class</span>
数据表T_User_Info如下展示:

VB.net版机房收费系统——三层登录_第4张图片

  正式和数据库打交道

<span style="font-size:18px;">Imports System.Data
Imports System.Data.SqlClient
Public Class dUserLogin

    Public Function SelectUserInfo(UserInfo As Entity.eUserLogin) As Entity.eUserLogin
        '实例化dSqlHelper中的返回字符串,定义连接打开数据库
        Dim conn As New SqlConnection(dSqlHelper.connstring)
        '打开数据库
        conn.Open()
        'DataReader是一行一行的读取记录的,当记录中有数据时Read(返回True, 当到记录集底部时返回False)
        Dim reader As SqlDataReader
        'D层实例化执行查询后的返回实体
        Dim dUserInfo As New Entity.eUserLogin
        '查询语句
        Dim sql As String = "Select * from T_User_Info where UserID= @UserID and PassWord=@PassWord"
        '定义数据库命令,获得SQL语句的具体命令
        Dim cmd As New SqlCommand(sql, conn)
        '**********************************************
        '这段代码注释了也可以执行
        ''获取SQL语句的具体内容()
        'cmd.CommandText = sql
        ''获取上述SQL语句的具体类型, 在此为Select
        'cmd.CommandType = CommandType.Text
        '**********************************************
        cmd.Parameters.Add(New SqlParameter("@UserID", UserInfo.UserID))
        cmd.Parameters.Add(New SqlParameter("@PassWord", UserInfo.PassWord))


        '执行查询语句,并返回DataReader对象
        reader = cmd.ExecuteReader()

        '读取查询的数据,并返回给相应的属性
        While (reader.Read())
            '获取数据库中相应字段的数据
            dUserInfo.UserID = reader.GetString(0)
            dUserInfo.PassWord = reader.GetString(1)
            '下面的代码同功能
            'dUserInfo.UserID = reader.GetString(reader.GetOrdinal("UserID"))
            'dUserInfo.PassWord = reader.GetString(reader.GetOrdinal("PassWord"))
        End While
        '返回查询到的实体
        Return dUserInfo
        '关闭数据库
        conn.Close()
    End Function
End Class</span>

总结

  本人菜鸟一枚,看别人博客的时候,被各种命名整的思维混乱,于是花了点时间构思了一下自己的命名规范,从代码的注释中相信读者可以看出来。

  开篇提到,由于对一句代码恍然大悟,所以在原有的三层皮毛知识上树立了自己敲三层的信心,那么是哪句代码呢?这是从UI层摘出来的一句代码:returnUserInfo = bLogin.CheckUserInfo(UserInfo),就是这样的一句,让我瞬间明白了博客中的时序图到底是怎么玩的,同时感慨于实体的伟大之处,真的很像是一辆车,带我们去上学,往返都是它,而且中途不用倒车,贯穿始终~

  PS:Demo已经上传到CSDN资源(VB.net版机房收费系统三层登录源代码)上,以飨读者~

  好了,就说到这里,俺老孙去也~

  


你可能感兴趣的:(机房收费系统,实体层的作用,VB.net三层登录)