zoukankan      html  css  js  c++  java
  • 三层架构实例—用户登录窗体


    前面我们对三层结构有一个简单的认知,明白了三层结构包括的内容以及各层之间的关系,下面在VS2010中创建一个三层架构的项目。

    此例子以vb.net 为例,因为是写给初接触三层的人看的,我会尽量的将过程写的详细一些,有什么不对或遗漏的敬请指正。

    1、建立数据库

    数据库是基础,我是以sql2008创建的一个最基础数据库,数据库名为jin,表名为Login,数据表结构之有用户名和密码两项



    2、创建项目

    首先打开VS2010,新建项目,在弹出的“新建项目”对话框项目类型中选择“Visual Basic”选项,模板选择Windows窗体应用程序,填写项目名称“StudentInfo”,并选中“创建解决方案的目录”前的复选框,



    3、创建业务逻辑层(BLL)

    在创建好的解决方案名称上右击,选择“添加”→“新建项目”选项,打开“添加新项目”对话框,在模板中选择“类库”选项,填写名称“BLL”





    4、创建数据访问层(DAL)


    在创建好的解决方案名称上右击,选择“添加”→“新建项目”选项,打开“添加新项目”对话框,在模板中选择“类库”选项,填写名称“DAL”




    5、添加实体层


    在创建好的解决方案名称上右击,选择“添加”→“新建项目”选项,打开“添加新项目”对话框,在模板中选择“类库”选项,填写名称“Model”

    6、添加各层之间的依赖关系

    a、各层关系如图所示




    b、添加引用方法(以表示层为例)

    在“解决方案资源管理器”面板,右击表示层(StudentInfo),选择“引用”,选择“添加引用”选项,,打开“添加引用”对话框,在“添加引用”对话框中选择“项目”选项卡,选中名称“BLL”,单击“确定”按钮即可。再以同样方法引用Model层,结果如图。



    其他各层以同样方法引用,在此不赘述。



    7、设计UI层界面



    8、添加各层代码

    根据引用顺序依次添加实体层——数据访问层——业务逻辑层——表现层。

    a、实体层代码

    Public Class login
        Private _username As String
        Public Property UserName As String
            Get
                Return _username
            End Get
            Set(ByVal value As String)
                _username = value
            End Set
        End Property
    
        Private _pwd As String
        Public Property Pwd As String
            Get
                Return _pwd
            End Get
    
            Set(ByVal value As String)
                _pwd = value
            End Set
        End Property
    End Class
    



    b、DAL层代码

    Imports System.Data
    Imports System.Data.SqlClient
    Imports Model
    
    Public Class UserDAO
    
        '创建数据库连接
        Public conn As New SqlConnection("server=localhost; database=jin;user id=sa;password=123456")
        'Public conn As New SqlConnection("server=localhost; database=连接的数据库名;user id=sa;password=123456")
        'Public conn As New SqlConnection("Data Source=(local);Initial Catalog=Login;Persist Security Info=True;User ID=sa;Password=123456")
    
        Public Function SelectUser(ByVal User As login) As Model.login             '传实体UserInfo,而不是参数ID、UserName等,这样可方便对实体中的参数进行调用
    
            Dim reader As SqlDataReader                                                                     '定义类型为sqlDatareader的变量reader
            Dim eUser As New Model.login                                                               '实例化新的UserInfo
    
            '其实下面的这段程序就相当于dim sql as string ="select  ID,UserName,PWD From Users Where UserName='"User.UserName"' And PWD='"User.PWD"'"
            '而写成这个程序块是为了防止Sql注入,即安全性考虑。
            '@UserName相当于传了一个参数,("@UserName", User.UserName)相当于给参数名字传递了参数。
            Dim sql As String = "Select  UserName,PWD From Login Where UserName=@UserName And PWD=@PWD"
            ' Dim sql As String
            ' sql = "select * from Login where UserName='jin' & PWD='jin'"
            Dim cmd As New SqlCommand(Sql, conn)                                                  '创建sqlCommand对象
            cmd.CommandText = sql                                                                           '获取SQL语句的具体内容
            cmd.CommandType = CommandType.Text                                                '获取上述SQL语句的具体类型,在此为Select
            cmd.Parameters.Add(New SqlParameter("@UserName", User.UserName))  '若用成eUser.UserName则会出现参数未传递的错误提示
            cmd.Parameters.Add(New SqlParameter("@PWD", User.Pwd))
    
            conn.Open()                                                                                               '打开数据连接
            reader = cmd.ExecuteReader()                                                                    '执行查询语句,并生成一个DataReader
    
            '读取查询到的数据,并返回给相应的属性
            While reader.Read()
                '获取数据库中相应字段的数据
                '数组必须从零开始读取,否则会超出其界限
                eUser.UserName = reader.GetString(0)
                eUser.PWD = reader.GetString(1)
            End While
            Return eUser                                                                                               '返回查询到的实体
            conn.Close()                                                                                                '关闭连接
        End Function
    
    End Class
    

    c、BLL层代码

    Public Class LoginManger
        Public Function UserLogin(ByVal User As Model.login) As Model.login
            Dim uDao As New DAL.UserDAO                                     '实例化D层中新的UserDAO对象
            Dim eUser1 As Model.login                                         '定义一个类型为实体层UserInfo的参数,用于赋值
    
            eUser1 = uDao.SelectUser(User)
    
            '判断是否查询到记录,若有,登录成功,并返回实体euser1
            '若isnothing(eUser1)则判断失效,均为登录成功。。。不解。。是isnothing用错了,还是哪儿的逻辑问题?
            If IsNothing(eUser1.UserName) Then
                Throw New Exception("登录失败,请检查用户名和密码!")
            Else
                MsgBox("登录成功,马上进入系统......", , "恭喜")
                Return eUser1
    
            End If
        End Function
    End Class
    


    d、UI层代码


    Public Class Form1
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Me.Close()
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Try
                '获得表现层的数据
                Dim euser2 As New Model.login                          '实例化新的UserInfo,用来传递B层的实体
                Dim euser3 As Model.login                                   '定义一个类型为UserInfo的参数,用来赋值
                euser2.UserName = TextBox2.Text.Trim             '将用户名传递给实体层的UserName
                euser2.Pwd = TextBox2.Text.Trim                       '将密码传递给实体层的PWD
    
                '调用B层,登录判断
                Dim mgr As New BLL.LoginManger
                euser3 = mgr.UserLogin(euser2)
            Catch ex As Exception
                MessageBox.Show(ex.Message.ToString())
            End Try
        End Sub
    
    End Class


  • 相关阅读:
    列出 visual studio 的所有快捷键
    CVS命令深入研究 zz
    大话系统之权限控制 (转)
    策略模式
    使用ISAPI_Rewrite对asp.net实现URL重写,显示HTML后缀
    使用ICSharpCode.SharpZipLib.dll实现在线解压缩
    ISAPI_REWRITE(转)
    ISAPI_Rewrite集
    做快乐的程序员(转)
    Request.PathInfo,Request.Path,RequestRawUrl
  • 原文地址:https://www.cnblogs.com/jinfulin/p/3797713.html
Copyright © 2011-2022 走看看