现在的位置: 首页 > 综合 > 正文

三层——原先很头疼的例子

2013年12月06日 ⁄ 综合 ⁄ 共 3656字 ⁄ 字号 评论关闭

三层的从字面上理解很简单,但是后来的经历告诉我,字面上的不叫理解!但是,丑媳妇终究是要见婆婆的,再害怕的知识点也是迟早要学习滴!下面通过一个简单的(登陆+积分)的例子来了解一下让人头疼的三层!

、数据库搭建:新建一个Student 数据库,含有两张表:UserInfo
表和Scores表

UserInfo 表主要是存放登陆用户的登陆名和登陆密码的;Scores表记录用户登陆,每登陆一次,在表中添加用户的UserID和一个积分

                          


解决方案资源管理器                      
                 
UI层的窗体
                                                   

                            

、代码实现:

(1
实体层:一句话;上穿下跳,将数据在各层之间进行传递

Public Class UserInfo
    Private user_id As String
    Private user_password As String
    ''' <summary>
    ''' 定义UserInfo属性 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    ''' 

    Public Property UserID() As String  '定义UserInfo 的UserID 属性
        Get
            Return user_id              '从其他层中得到User_id并进行赋值
        End Get
        Set(ByVal value As String)
            user_id = value
        End Set
    End Property

    Public Property UserPassword() As String '定义UserInfo 的UserPassword属性
        Get
            Return user_password            '从其他层中得到User_password并进行赋值
        End Get
        Set(ByVal value As String)
            user_password = value
        End Set
    End Property

End Class

(2) UI层,从用户界面中获取用户的操作数据。

Public Class frmLogin

    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '引用了实体类和业务逻辑层,要实例化对应的对象
        Dim UiEntityUser As New Entity.UserInfo
        Dim UiBllLogin As New BLL.LoginManager

        '从UI层得到用户ID 和密码
        UiEntityUser.UserID = TextBox1.Text()
        UiEntityUser.UserPassword = TextBox2.Text()

        '转入到业务逻辑层,进行相关的业务逻辑的判断
        If UiBllLogin.UserLogin(UiEntityUser) = True Then
            MsgBox("登陆成功!")
        Else
            MsgBox("登陆失败!")
        End If

    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles Button2.Click
        End
    End Sub
End Class

(3)业务逻辑层,进行各种业务逻辑的判断

Public Class LoginManager

Public Function UserLogin(ByVal User As Entity.UserInfo) As Boolean

 '引用了实体类和数据访问层,因此应该实例化实体类和数据访问层中对应的类

 Dim bllEntityUserInfo As New Entity.UserInfo
 Dim bllDalScore As New DAL.DBScore
 Dim bllDalUser As New DAL.DBUserInfo

 '将用户界面得到的用户输入的ID 赋值给实例化的实体类对象,从而转入到数据访问层进行查询
 bllEntityUserInfo.UserID = User.UserID
 bllEntityUserInfo = bllDalUser.DbCheck(bllEntityUserInfo)

 '过数据访问层从数据库查询的用户密码和用户输入的密码一致,进行数据库积分更新,并返回值
        If Trim(bllEntityUserInfo.UserPassword) = User.UserPassword Then
            bllDalScore.UpdateScore(User.UserID, 10)
            Return True
        Else
            Return False
        End If
    End Function

End Class

(4) 数据访问层;和数据库进行交互,是系统和数据库之间联系的纽带。

数据访问层有三个类:

      a ) databaseConnecstr 用来连接数据库

Public Class databaseConnecstr

    Public Shared Function Constr() As String
        Constr = "data source=192.168.24.82;database=Student; uid=sa;pwd=202414;"
    End Function

End Class

    b)UserInfo 类,用来从数据库UserInfo表中检索相关信息。

Imports System.Data.SqlClient

Public Class DBUserInfo
    '
    Public Function DbCheck(ByVal User As Entity.UserInfo) As Entity.UserInfo
        '实例化访问数据库对象
        Dim conn As New SqlClient.SqlConnection      '连接数据库的字符串
        conn = New SqlConnection(DAL.databaseConnecstr.Constr())

        '定义查询语句
        Dim sql As String = "select * from UserInfo where UserID='" & User.UserID & "'"
        '执行查询语句
        Dim cmd As SqlCommand = New SqlCommand(sql, conn)
        Dim read As SqlDataReader

        Try
            conn.Open()
            read = cmd.ExecuteReader
            read.Read()

            '如果用户存在的话,将数据库表中检索的记录对应赋值给参数

            User.UserID = read.Item("UserID")
            User.UserPassword = read.Item("UserPwd")
            Return User  '返回User

        Catch ex As Exception
            '如果用户不存 将密码赋值为空,并将用户作为返回值进行返回
            User.UserPassword = ""
            Return User

        End Try

    End Function
End Class

   c) Scores类,用户每登陆成功一次,给用户添加积分

Imports System.Data.SqlClient
Public Class DBScore

    Public Sub UpdateScore(userID As String, score As Integer)

        '定义连接数据的字符串和数据库执行命令
        Dim conn As SqlConnection = New SqlConnection(DAL.databaseConnecstr.Constr())
        Dim cmd As SqlCommand = conn.CreateCommand()

        '向数据库Scores 表中插入用户ID 和 积分
        cmd.CommandText = "insert into Scores(UserID,Score) values(@UserID,@Score)"
        cmd.Parameters.Add(New SqlParameter("@UserID", userID))
        cmd.Parameters.Add(New SqlParameter("@Score", score))

        '打开数据库连接 执行SQL语句之后,关闭
        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()

    End Sub
End Class

三、其实,各层之间的相互调用,必须有引用关系才可以。当我们建立了UI , BLL,DAL以及实体类 等类库的时候,我们就应该在各个类库中添加相应的引用关系。只有这样,才会在各层调用的时候,不会出现“XXX
未定义”的错误!

PS:按照源码设计之后,还不一定能出现运行结果。如果运行的话,可能会出现: 无法直接启动带有"类库输出类型"的项目。的错误。这是因为我们的启动项设置的不对,将UI层设为启动项,并在UI项目的My
Project 中,将应用程序类型设置下图所示,这时就可以了!

总结:丑媳妇总是要见家人的,再难的知识点也是要学习滴~~~~~~

抱歉!评论已关闭.