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

来源:互联网 发布:mac与windows 编辑:程序博客网 时间:2024/04/27 21:51

前面我们对三层结构有一个简单的认知,明白了三层结构包括的内容以及各层之间的关系,下面在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 PropertyEnd Class



b、DAL层代码

Imports System.DataImports System.Data.SqlClientImports ModelPublic 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 FunctionEnd 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 FunctionEnd 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 SubEnd Class


1 0