在上一篇博客<<面向对象通讯录>>中,我简单的说了如何用面向对象的方法写通讯录,今天我们就来学习一下三层
的思想.
曾在我的一篇<<三层架构笔记>>中介绍过关于三层的一些理论知识,三层主要是UI(显示层),BLL(逻辑层),DAL(数据
层).我第一个三层的例子是一个登录系统,但是这个例子是我模仿别人敲的,我用别人的程序,调通了一条线在写的,所以
就不贴出来了.,以下介绍的通讯录的例子是我自己写的,因为是刚接触三层,难免会有错误.还请高手多多指点,
1.界面:
2.主要实现功能:
(1).点击"新增"按钮的时候,文本框被清空,输入数据,点击"保存"按钮,数据插入数据表中
(2.)修改文本框中的信息,点击保存,可以修改数据库表中对应的信息
(3).点击"删除"按钮,可以删除选中的信息.
3.数据库设计:
利用SQL Server数据库,建了一个“Login”数据库,其中建了一张Relationtable表,数据表内容具体如图:
4.实现代码:
(1)UI层
'*************************************************
'作者:唐欢
'小组:
'说明:UI层,用户界面
'创建日期:2013-1-6
'版本号:V1.00
'**********************************************'
Imports PersonBLL
Public Class FrmPerson
Dim Modtype As String = "add" 'add--添加,eidt-修改"
''' <summary>
''' 新增
''' </summary>
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Txtname.Text = ""
txtphone.Text = ""
Txtmobibe.Text = ""
TxtAddress.Text = ""
Modtype = "add"
End Sub
''' <summary>
''' 保存
''' </summary>
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim PersonSave As New Personphysical.ClsPersonphysical
Dim BllCheck As New PersonBLL.ClsPersonBLL
Dim dt As New DataTable
Dim val As New SqlClient.SqlCommand
PersonSave.Name = Trim(Txtname.Text)
PersonSave.Phone = Trim(txtphone.Text)
PersonSave.Mobibe = Trim(Txtmobibe.Text)
PersonSave.Address = Trim(TxtAddress.Text)
If Modtype = "add" Then
If BllCheck.SaveUIandPhysical(PersonSave) Then
MsgBox("添加成功")
Else
MsgBox("添加未成功!")
End If
Else
If BllCheck.UpdateUIandPhysical(PersonSave) Then
MsgBox("修改成功")
Else
MsgBox("修改未成功!")
End If
End If
DataGridView1.DataSource = BllCheck.Allperson(dt)
End Sub
''' <summary>
''' 窗体加载
''' </summary>
Private Sub FrmPerson_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Dim Physicalfrm As New Personphysical.ClsPersonphysical
DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
Dim dt As New DataTable
Dim Uiallperson As New PersonBLL.ClsPersonBLL
DataGridView1.DataSource = Uiallperson.Allperson(dt)
End Sub
''' <summary>
''' 选中某行
''' </summary>
Private Sub DataGridView1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.SelectionChanged
Dim Selectionperson As New Personphysical.ClsPersonphysical
Dim BllSelectionperson As New PersonBLL.ClsPersonBLL
If DataGridView1.SelectedRows.Count = 0 Then
Exit Sub
End If
Modtype = "edit"
Dim row As DataGridViewRow = DataGridView1.SelectedRows(0)
Selectionperson.Name = row.Cells(0).Value.ToString()
Selectionperson = BllSelectionperson.SelectPerson(Selectionperson)
Txtname.Text = Selectionperson.Name
txtphone.Text = Selectionperson.Phone
Txtmobibe.Text = Selectionperson.Mobibe
TxtAddress.Text = Selectionperson.Address
End Sub
''' <summary>
''' 退出
''' </summary>
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Application.Exit()
End Sub
''' <summary>
''' 删除选中的信息
''' </summary>
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim Deleteperson As New Personphysical.ClsPersonphysical
Dim BllDeleteperson As New PersonBLL.ClsPersonBLL
Dim dt As New DataTable
If DataGridView1.SelectedRows.Count = 0 Then
Exit Sub
End If
Dim row As DataGridViewRow = DataGridView1.SelectedRows(0)
Deleteperson.Name = row.Cells(0).Value.ToString()
If BllDeleteperson.DeletePeson(Deleteperson) Then
MsgBox("删除成功!")
Else
MsgBox("删除不成功!")
End If
DataGridView1.DataSource = BllDeleteperson.Allperson(dt)
End Sub
End Class
(2)BLL层(已做修改)
'*************************************************
'作者:唐欢
'小组:
'说明:BLL层,进行逻辑判断
'创建日期:2013-1-6
'版本号:V1.00
'**********************************************'
Public Class ClsPersonBLL
''' <summary>
''' 新添加信息
''' </summary>
''' <param name="BllName"></param>
''' <returns>PhysicalName</returns>
''' <remarks>把输入的信息传递给DAL层</remarks>
Function SaveUIandPhysical(ByVal BllName As Personphysical.ClsPersonphysical) As Boolean 'Personphysical.ClsPersonphysical
Dim DalName As New PersonDAL.ClsPersonDAL
Dim PhysicalName As New Personphysical.ClsPersonphysical
PhysicalName.Name = BllName.Name
PhysicalName.Phone = BllName.Phone
PhysicalName.Mobibe = BllName.Mobibe
PhysicalName.Address = BllName.Address
'PhysicalName = DalName.Add(PhysicalName)
'Return PhysicalName
Return DalName.Add(PhysicalName)
End Function
''' <summary>
''' 更新信息
''' </summary>
''' <param name="BllNameupdate"></param>
''' <returns>PhysicalName</returns>
''' <remarks>把UI层的输入信息传递给DAL层</remarks>
Public Function UpdateUIandPhysical(ByVal BllNameupdate As Personphysical.ClsPersonphysical) As Boolean
Dim DalName As New PersonDAL.ClsPersonDAL
Dim PhysicalName As New Personphysical.ClsPersonphysical
Dim val As New SqlClient.SqlCommand
'Dim Bllval As Integer
'Dim dt As New DataTable
PhysicalName.Name = BllNameupdate.Name
PhysicalName.Phone = BllNameupdate.Phone
PhysicalName.Mobibe = BllNameupdate.Mobibe
PhysicalName.Address = BllNameupdate.Address
'PhysicalName = DalName.Update(PhysicalName)
Return DalName.Update(PhysicalName)
End Function
''' <summary>
''' '获得所有人的信息
''' </summary>
''' <param name="alldt"></param>
''' <returns>AllPersonInformation</returns>
''' <remarks>获取这个表的信息</remarks>
Public Function Allperson(ByVal alldt As DataTable) As DataTable
Dim dt As New DataTable
Dim AllPersonInformation As New Personphysical.ClsPersonphysical
Dim Dalallperson As New PersonDAL.ClsPersonDAL
dt = Dalallperson.GetAll(dt)
Return dt
End Function
''' <summary>
''' 获取某行的值
''' </summary>
Public Function SelectPerson(ByVal SelectInfo As Personphysical.ClsPersonphysical) As Personphysical.ClsPersonphysical
Dim Phselectperson As New Personphysical.ClsPersonphysical
Dim Dalselectperson As New PersonDAL.ClsPersonDAL
Phselectperson.Name = SelectInfo.Name
Phselectperson = Dalselectperson.Getperson(Phselectperson)
Return Phselectperson
End Function
''' <summary>
''' 删除
''' </summary>
Public Function DeletePeson(ByVal Detperson As Personphysical.ClsPersonphysical) As Boolean ' Personphysical.ClsPersonphysical
Dim Phdeleteperson As New Personphysical.ClsPersonphysical
Dim Daldeleteperson As New PersonDAL.ClsPersonDAL
Phdeleteperson.Name = Detperson.Name
'Phdeleteperson = Daldeleteperson.Delete(Phdeleteperson)
'Return Phdeleteperson
Return Daldeleteperson.Delete(Phdeleteperson)
End Function
End Class
(3)DAL层(已做修改)
'*************************************************
'作者:唐欢
'小组:
'说明:DAL层,对数据库进行操作
'创建日期:2103-1-6
'版本号:V1.00
'**********************************************'
Imports System.Data.SqlClient
Imports System.Object
Public Class ClsPersonDAL
''' <summary>
''' '数据库连接
''' </summary>
''' <returns>SqlCn</returns>
''' <remarks>连接对象,实现数据库的连接</remarks>
Private Function GetConnection() As SqlConnection
Dim SqlCnstr As String = "server=TANGHUAN-PC;Database=login;Uid=sa;Pwd=123456;"
Dim SqlCn As SqlConnection = New SqlConnection(SqlCnstr)
Return SqlCn
End Function
''' <summary>
''' 往数据库中添加新记录
''' </summary>
''' <param name="Save"></param>
''' <returns>DalName</returns>
''' <remarks>插入成功后,把值返回给BLL层</remarks>
Public Function Add(ByVal Save As Personphysical.ClsPersonphysical) As Boolean 'Personphysical.ClsPersonphysical
Dim DalName As New Personphysical.ClsPersonphysical
Dim Sqlcn As SqlConnection = GetConnection()
Try
Sqlcn.Open()
Dim Sqlcmdstr As String = "INSERT INTO Relationtable(Name,Phone,Mobibe,Address) VALUES (@name,@phone,@mobibe,@address)"
Dim Sqlcmd As SqlCommand = New SqlCommand(Sqlcmdstr, Sqlcn)
Dim p1 As SqlParameter = New SqlParameter("@name", Save.Name)
Dim p2 As SqlParameter = New SqlParameter("@phone", Save.Phone)
Dim p3 As SqlParameter = New SqlParameter("@mobibe", Save.Mobibe)
Dim p4 As SqlParameter = New SqlParameter("@address", Save.Address)
Sqlcmd.Parameters.Add(p1)
Sqlcmd.Parameters.Add(p2)
Sqlcmd.Parameters.Add(p3)
Sqlcmd.Parameters.Add(p4)
'Sqlcmd.ExecuteNonQuery()
If Sqlcmd.ExecuteNonQuery > 0 Then
Return True
Else
Return False
End If
Finally
Sqlcn.Close()
End Try
'Return DalName
End Function
''' <summary>
''' 更新数据
''' </summary>
''' <param name="updateinfo"></param>
''' <returns>DalName</returns>
''' <remarks>更新成功的值返回给Bll层</remarks>
'''
Public Function Update(ByVal updateinfo As Personphysical.ClsPersonphysical) As Boolean 'Personphysical.ClsPersonphysical
Dim DalName As New Personphysical.ClsPersonphysical
Dim Sqlcn As SqlConnection = GetConnection()
Try
Sqlcn.Open()
Dim Sqlcmdstr As String = "Update Relationtable set Name=@name,Phone=@name,Mobibe =@mobibe,Address=@address where Name='" & updateinfo.Name & "'"
Dim Sqlcmd As SqlCommand = New SqlCommand(Sqlcmdstr, Sqlcn)
DalName.Name = updateinfo.Name
DalName.Phone = updateinfo.Phone
DalName.Mobibe = updateinfo.Mobibe
DalName.Address = updateinfo.Address
Dim p1 As SqlParameter = New SqlParameter("@name", DalName.Name)
Dim p2 As SqlParameter = New SqlParameter("@phone", DalName.Phone)
Dim p3 As SqlParameter = New SqlParameter("@mobibe", DalName.Mobibe)
Dim p4 As SqlParameter = New SqlParameter("@address", DalName.Address)
Sqlcmd.Parameters.Add(p1)
Sqlcmd.Parameters.Add(p2)
Sqlcmd.Parameters.Add(p3)
Sqlcmd.Parameters.Add(p4)
'Sqlcmd.ExecuteNonQuery()
If Sqlcmd.ExecuteNonQuery > 0 Then
Return True
Else
Return False
End If
Finally
Sqlcn.Close()
End Try
End Function
''' <summary>
''' 获取所有人员信息
''' </summary>
''' <param name="Allperson"></param>
''' <returns>dt</returns>
''' <remarks>整个表的信息</remarks>
Public Function GetAll(ByVal Allperson As DataTable) As DataTable
Dim DalAllperson As New Personphysical.ClsPersonphysical
Dim Sqlcn As SqlConnection = GetConnection()
Dim sqlstr As String = "select * from Relationtable "
Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter(sqlstr, Sqlcn)
Dim dt As DataTable = New DataTable()
myDataAdapter.Fill(dt)
Return dt
Sqlcn.Close()
End Function
''' <summary>
''' 获得某人的信息
''' </summary>
''' <param name="name"></param>
''' <returns>selectoneperson</returns>
''' <remarks>把通过姓名查询</remarks>
Public Function Getperson(ByVal name As Personphysical.ClsPersonphysical) As Personphysical.ClsPersonphysical
Dim Sqlcn As SqlConnection = GetConnection()
Sqlcn.Open()
Dim Sqlstr As String = "select * from Relationtable where Name='" & name.Name & "'"
Dim SqlCmmd As SqlCommand = New SqlCommand(Sqlstr, Sqlcn)
Dim reader As SqlDataReader = SqlCmmd.ExecuteReader
Dim selectoneperson As New Personphysical.ClsPersonphysical
Try
If reader.Read And reader.HasRows Then
selectoneperson.Name = reader("Name")
selectoneperson.Phone = reader("Phone")
selectoneperson.Mobibe = reader("Mobibe")
selectoneperson.Address = reader("Address")
End If
Return selectoneperson
Finally
Sqlcn.Close()
End Try
End Function
''' <summary>
''' 删除
''' </summary>
''' <param name="Detperson"></param>
''' <returns>PhdeletePerson</returns>
''' <remarks>把通过姓名查询到的信息返回BLL层</remarks>
Public Function Delete(ByVal Detperson As Personphysical.ClsPersonphysical) As Boolean 'Personphysical.ClsPersonphysical
Dim Sqlcn As SqlConnection = GetConnection()
Dim PhdeletePerson As New Personphysical.ClsPersonphysical
Dim val As Integer
PhdeletePerson.Name = Detperson.Name
Sqlcn.Open()
Dim SqlStr As String = "DELETE from Relationtable where Name ='" & PhdeletePerson.Name & "'"
Dim Sqlcmmd As SqlCommand = New SqlCommand(SqlStr, Sqlcn)
'Sqlcmmd.ExecuteNonQuery()
Try
If val = Sqlcmmd.ExecuteNonQuery = 0 Then
Return True
Else
Return False
End If
Finally
Sqlcn.Close()
End Try
Debug.Print(val)
End Function
End Class
(4)实体层:数据库的映射,为数据库和对象之间架起一座桥
'*************************************************
'作者:唐欢
'小组:
'说明:实体层
'创建日期:2013-1-6
'版本号:V1.00
'**********************************************'Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Public Class ClsPersonphysical
''' <summary>
''' 姓名
''' </summary>
Private _name As String
Public Property Name As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
''' <summary>
''' 手机
''' </summary>
Private _phone As String
Public Property Phone As String
Get
Return _phone
End Get
Set(ByVal value As String)
_phone = value
End Set
End Property
''' <summary>
''' 电话
''' </summary>
Private _mobibe As String
Public Property Mobibe As String
Get
Return _mobibe
End Get
Set(ByVal value As String)
_mobibe = value
End Set
End Property
''' <summary>
''' 地址
''' </summary>
Private _address As String
Public Property Address As String
Get
Return _address
End Get
Set(ByVal value As String)
_address = value
End Set
End Property
End Class
5.时序图
6.总结
1.每层如果需要值传递的时候需要定义实体层的对象,UI层定义实体层对象,主要作用是给实体层传值,BLL层定义实体
层对象,主要是取值,进行判 断.DAL层定义实体层对象,主要是取值,执行数据库表的查询.或其他的操作.
各个层值直接的传递主要是可以用这样一张图进行标示:
2.BLL层,DAL层都有类的方法,而且这些方法都设置参数,这些参数都是实体层对象,DAL层返回的参数共BLL层所用,BLL
层返回值共UI层所用
3.每层都需要有引用,而且每层都需要引用实体层,Bll层需要应用DAL层,UI层应用BLL层.
4. 如果BLL层调用DAL层的某个方法,设置的参数类型必须和函数的参数类型一致.
5.从UI层开始,在UI层结束 三层我们没有学过,但是函数我们学过,三层每个函数的调用和VB里面函数调用是一样的,
如果在学习vb的时候,你已经学会了函数调用,学习三层就更加简单了.现在才开始接触,以后还有很长的路走,踏实走
好每一步.