三层架构实例—用户登录窗体


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

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

1、建立数据库

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

三层架构实例—用户登录窗体_第1张图片

2、创建项目

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

三层架构实例—用户登录窗体_第2张图片


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

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


三层架构实例—用户登录窗体_第3张图片


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


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

三层架构实例—用户登录窗体_第4张图片


5、添加实体层


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

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

a、各层关系如图所示


三层架构实例—用户登录窗体_第5张图片

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

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


三层架构实例—用户登录窗体_第6张图片
其他各层以同样方法引用,在此不赘述。



7、设计UI层界面

三层架构实例—用户登录窗体_第7张图片

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


你可能感兴趣的:(架构)