机房重构七层之登录

   七层听起来是不是很高大尚那,其实七层就是在三层的基础上加了Entity实体层Facade外观层,Factory工厂层,IDAL层,

Entity实体层:就是存储数据的,方便在各个层之间传递数据,多数作为类中方法的参数

Facade外观层:其实就是用了一个外观模式,作用就是接触B层与U层之间的耦合

Factory工厂层:就是用到了抽象共产+反射+配置文件,作用是灵活的实现数据库的连接,方便换数据库

IDAL层::就是提供接口

配置文件:写在U层的App.config里面

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
  <appSettings>
    <add key="SqlConnStr" value="server=.;database=charge_sys;User ID=sa;Password=1"/>
    <add key="DB" value="Login.DAL"/>
    </appSettings>
</configuration>

U层:(怎样在加载窗体时就让指定文本框获得焦点可以看一下)

Public Class Form1
    Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click
        '实例化实体层UserInfo对象,用于在各层之间进行传递数据
        Dim entigyObject As New Login.Entity.UserInfo
        
        '定义变量接受Facade层的返回值
        Dim facadeReturn As Boolean
        
        Dim facadeObject As New Login.Facade.IsUserOk

        '判断用户名或密码是否输入
        If (txtPassword.Text = "" Or txtUsername.Text = "") Then
            MessageBox.Show("请输入用户名或密码")
            Exit Sub
        End If

        '将文本框的内容传递给dataUser对象
        entigyObject.UserId = txtUsername.Text.Trim()
        entigyObject.PWD = txtPassword.Text.Trim()

        '通过U层将entigyObject传递给Facade层
        facadeReturn = facadeObject.OneInterfaceUser(entigyObject)

        '判断是否存在输入的用户
        Try
            If facadeReturn = False Then
                MessageBox.Show("用户名或密码错误!", "温馨提示")
                txtUsername.Text = ""
                txtPassword.Text = ""
                txtUsername.Focus()
            Else
                MessageBox.Show("登录成功", "恭喜你")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
            txtUsername.Text = ""
            txtPassword.Text = ""
            txtUsername.Focus()
        End Try
    End Sub
    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        Me.Close()
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'txtUsername.Focus()
        Me.ActiveControl = Me.txtUsername '使文本框获得焦点
    End Sub
Public Class IsUserOk '是否存在该用户
    Public Function OneInterfaceUser(ByVal entigyObject As Login.Entity.UserInfo) As Boolean
        '实例化B层对象
        Dim bllObject As New Login.BLL.HaveLoginUser
        '定义变量接受bllObject返回值
        Dim bllReturn As Boolean

        '通过Facade层将entity传递给B层
        bllReturn = bllObject.isUserExist(entigyObject)
        Return bllReturn
    End Function
End Class

Private Sub txtUsername_KeyDown(sender As Object, e As KeyEventArgs) Handles txtUsername.KeyDown If e.KeyCode = Keys.Enter Then txtPassword.Focus() End If End Sub Private Sub txtPassword_KeyDown(sender As Object, e As KeyEventArgs) Handles txtPassword.KeyDown If e.KeyCode = Keys.Enter Then btnOk.Focus() End If End SubEnd Class


Facade层

Public Class IsUserOk '是否存在该用户
    Public Function OneInterfaceUser(ByVal entigyObject As Login.Entity.UserInfo) As Boolean
        '实例化B层对象
        Dim bllObject As New Login.BLL.HaveLoginUser
        '定义变量接受bllObject返回值
        Dim bllReturn As Boolean

        '通过Facade层将entity传递给B层
        bllReturn = bllObject.isUserExist(entigyObject)
        Return bllReturn
    End Function
End Class

B层

Public Class HaveLoginUser
    '判断用户是否存在
    Public Function isUserExist(ByVal entityObject As Login.Entity.UserInfo) As Boolean
        '定义接口
        Dim iDalObject As Login.IDAL.ISelectUserAccess

        '实例化工厂
        Dim factoryObject As New Login.Factory.DataAccess
        '调用工厂方法,创建接口
        iDalObject = factoryObject.CreatUser()

        '定义数据库表变量,接受IDAL接口层返回值
        Dim table As New DataTable

        Dim inflence As New Integer
        '实现接口的方法
        table = iDalObject.SelectUser(entityObject)

        '判断是否有记录,有返回true,否则返回false
        If Not table Is Nothing Then  '首先判断是否为空,不为空的情况下才能判断是否有记录
            If table.Rows.Count = 0 Then
                Return False
            Else
                inflence = iDalObject.OnWorkInfo(entityObject)
                Return True
            End If
        Else
            Return False
        End If
    End Function
End Class

Factory层

Public Class DataAccess
    Private Shared ReadOnly AssemblyName As String = "LoginDAL" '为什么用shared,参数代码什么
    '读配置文件
    Dim db As String = System.Configuration.ConfigurationSettings.AppSettings("DB")
    'System.Configuration.ConfigurationManager.AppSettings("DB")
    Public Function CreatUser() As Login.IDAL.ISelectUserAccess
        Dim className As String = db + "." + "UserData"
        Return CType(Assembly.Load(AssemblyName).CreateInstance(className), Login.IDAL.ISelectUserAccess)
    End Function
End Class

IDAL层

Public Interface ISelectUserAccess
    '定义方法,看数据库中是否有该用户,D层实现IDal层
    Function SelectUser(ByVal selectuserInfo As Login.Entity.UserInfo) As DataTable
End Interface

D层

Public Class UserData : Implements Login.IDAL.ISelectUserAccess '实现IDal层的接口
    '在数据库表User中查找有登录界面的用户,
    Public Function SelectUser(ByVal selectuserInfo As Login.Entity.UserInfo) As DataTable Implements Login.IDAL.ISelectUserAccess.SelectUser
        '实例化SQLHelper对象
        Dim sqlHelperObject As New SQLHelper

        Dim sql As String
        '定义变量,接受数据库返回的数据
        Dim table As New DataTable

        '实例化参数数组,赋值
        Dim sqlParams As SqlParameter() = {New SqlParameter("@UserID", selectuserInfo.UserId), New SqlParameter("@Password", selectuserInfo.PWD)}

        'sql语句执行查询
        sql = "select * from User_Info where userId=@UserID and PWD=@Password"

        '调用SQLHelper类中的ExecSqlSelect方法执行select语句查询
        table = sqlHelperObject.ExecSqlSelect(sql, CommandType.Text, sqlParams)
        Return table
    End Function

SqlServer类:因为会涉及到很多连接数据库的时候,为防止连接数据库部分代码重复编写,把该部分代码抽象出来,形成一个单独的类,可以放到D层,也可另建一层,那这样就是所谓的8层了

    Public Function ExecSqlSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable

        '创建数据库连接,并用using及时关闭,用到配置文件连接数据库
        Using conn As New SqlConnection(strConnection)
            '创建command命令,目的执行命令(增删改查)
            Dim cmd As SqlCommand = conn.CreateCommand()
            '定义适配器(相当于稳压器),面对的是个庞大的数据库系统,而你只需要其中的几张表,挑选作用
            '(包括select,inset,update,deletecommand),与sqlconnection和sqlcommand一起使用,提高连接数据库的性能
            '目的就是填充DataSet
            Dim adp As SqlDataAdapter
            '定义数据集对象,用于存储临时数据表
            Dim ds As New DataSet
            '命令是文本形式
            cmd.CommandText = cmdText
            '命令执行的类型
            cmd.CommandType = cmdType
            '命令执行的参数
            cmd.Parameters.AddRange(paras)
            '初始化适配器,
            adp = New SqlDataAdapter(cmd)
            Try
                '重新打开数据库
                conn.Open()
                '向Adapter体重查询的结果
                adp.Fill(ds)
                '返回包含在DataSet中表集合中的第一张表
                Return ds.Tables(0)
            Catch ex As Exception
                Return Nothing
                Throw ex
            End Try
        End Using
    End Function

【总结】

本文章有待完善,先仅供代码。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值