VB.NET三层练习---登录实例

上一篇博客写了三层的基础知识,这一篇写写我实践了的一个登录实例。

1.实例业务描述:

一个登录界面,通过输入用户名和密码实现登录。如果用户名、密码在数据库Login中的Users表中存在,则表明登录成功,然后在相应的Scores表中增加10个积分;如果登录不成功,则显示“登录失败”。可参考图:

登录界面:

users表:

scores表:

2.实现过程
配置文件

配置文件是可以按需要更改的 XML 文件。 开发人员可以使用配置文件来更改设置,而不必重编译应用程序。 管理员可以使用配置文件来设置策略,以便影响应用程序在计算机上运行的方式。这里不多叙述关于配置文件的详细内容,仅给出此实例中应用到的配置文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <clear />
    <add  key="connString" value="Data Source=192.168.**.**;Initial Catalog=Login;User ID=sa;Password=123456"/>
  </appSettings>
</configuration>
Model(实体类)

Model对应于users表,用来封装数据,在三层之间传送数据也就是各层之间的函数调用返回值都是user对象。Model独立于其他三个层次,不会引用其他三个程序集,而其他都引用Model。

Public Class UserInfo
    Private ID As Integer
    Private UserName As String
    Private Password As String
    Private Email As String

    Public Property _ID As Integer
        Get
            Return ID
        End Get
        Set(value As Integer)
            ID = value
        End Set
    End Property

    Public Property _UserName As String
        Get
            Return UserName
        End Get
        Set(value As String)
            UserName = value
        End Set
    End Property

    Public Property _Password As String
        Get
            Return Password
        End Get
        Set(value As String)
            Password = value
        End Set
    End Property

    Public Property _Email As String
        Get
            Return Email
        End Get
        Set(value As String)
            Email = value
        End Set
    End Property
End Class
D层

D层中包含了三个类:DBUtil类、UserDAO类、ScoreDAO类。提供基本的数据访问,不包含任何相关的业务处理。

DBUtil类中调用了配置文件:

Public Class DBUtil
    '读取配置文件。
    Public Shared strConnection As String = System.Configuration.ConfigurationManager.AppSettings("connString")
End Class

UserDAO类实现了查询该用户和密码是否存在的功能。

Imports System.Data.SqlClient
Imports System.Data

Public Class UserDAO
    Public Function SelectUser(ByVal UserName As String, ByVal Password As String) As LoginModel.UserInfo

        Using conn As New SqlConnection(DBUtil.strConnection)       'using语句可以确保在范围结束时调动dispose方法释放对象。

            Dim cmd As SqlCommand = conn.CreateCommand()        '通过Connection的CreateCommand方法创建Command对象
            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))         '添加参数@UserName
            cmd.Parameters.Add(New SqlParameter("@Password", Password))           '添加参数@Password

            conn.Open()

            Dim user As LoginModel.UserInfo = Nothing
            Dim reader As SqlDataReader = cmd.ExecuteReader()        '通过Command对象的ExecuteReader方法创建sqlDataReader对象
            While (reader.Read())        '若reader中没有记录返回false则退出循环,若有记录则读入user内。
                If user Is Nothing Then
                    user = New LoginModel.UserInfo
                End If

                user._ID = reader.GetInt32(0)              '将字段依次读入user的属性中。
                user._UserName = reader.GetString(1)
                user._Password = reader.GetString(2)

                If user._Email Is DBNull.Value = False Then          'DBNUll函数可以判断读出的是否为空。
                    user._Email = reader.GetString(3)
                End If
            End While

            Return user
        End Using

    End Function
End Class

ScoreDAO类实现了增加积分的功能。

Imports System.Data.SqlClient
Public Class ScoreDAO
    Public Sub UpdateScore(ByVal UserName As String, ByVal value As Integer)

        Using conn As New SqlConnection(DBUtil.strConnection)     'using语句可以确保在范围结束时调动dispose方法释放对象。
            Dim cmd As SqlCommand = conn.CreateCommand()      '通过Connection的CreateCommand方法创建Command对象
            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()            '执行TSQL语句。

        End Using
    End Sub
End Class
B层

负责处理业务逻辑。通过获取UI传来的指令,决定执行业务逻辑UserLogin,在需要访问数据源的时候(Select和Update)直接交给DAL处理,处理完成后,返回必要数据给UI。

Public Class LoginManager
    Public Function UserLogin(ByVal UserName As String, ByVal Password As String) As LoginModel.UserInfo
        Dim uDao As New LoginDAL.UserDAO
        Dim user As New LoginModel.UserInfo
        user = uDao.SelectUser(UserName, Password)

        If user IsNot Nothing Then     'user不为空说明查询到用户存在,登录成功。
            Dim sDao As New LoginDAL.ScoreDAO
            sDao.UpdateScore(UserName, 10)
        End If

        Return user

    End Function
End Class
U层

主要就是界面,以及负责采集和显示用户操作

Public Class Form1

    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        Dim userName As String = txtUserName.Text.Trim()
        Dim password As String = txtPassword.Text

        Dim user As New LoginModel.UserInfo
        Dim mgr As New LoginBLL.LoginManager
        user = mgr.UserLogin(userName, password)

        If user IsNot Nothing Then
            MsgBox("登录成功:" + userName)
        Else
            MsgBox("登录失败")
        End If

    End Sub
End Class
3.总结

通过几遍实践这个小例子,对三层的架构思想理解更进了一步。当然我觉得要是再深入理解,还得需要再实践其他项目。期待下一个项目机房收费系统个人重构的开始。

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值