七层听起来是不是很高大尚那,其实七层就是在三层的基础上加了Entity实体层Facade外观层,Factory工厂层,IDAL层,
Entity实体层:就是存储数据的,方便在各个层之间传递数据,多数作为类中方法的参数
Facade外观层:其实就是用了一个外观模式,作用就是接触B层与U层之间的耦合
Factory工厂层:就是用到了抽象共产+反射+配置文件,作用是灵活的实现数据库的连接,方便换数据库
IDAL层::就是提供接口
配置文件:写在U层的App.config里面
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" /> </startup> <appSettings> <add key="SqlConnStr" value="server=.;database=charge_sys;User ID=sa;Password=1"/> <add key="DB" value="Login.DAL"/> </appSettings> </configuration>
U层:(怎样在加载窗体时就让指定文本框获得焦点可以看一下)
Public Class Form1 Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click '实例化实体层UserInfo对象,用于在各层之间进行传递数据 Dim entigyObject As New Login.Entity.UserInfo '定义变量接受Facade层的返回值 Dim facadeReturn As Boolean Dim facadeObject As New Login.Facade.IsUserOk '判断用户名或密码是否输入 If (txtPassword.Text = "" Or txtUsername.Text = "") Then MessageBox.Show("请输入用户名或密码") Exit Sub End If '将文本框的内容传递给dataUser对象 entigyObject.UserId = txtUsername.Text.Trim() entigyObject.PWD = txtPassword.Text.Trim() '通过U层将entigyObject传递给Facade层 facadeReturn = facadeObject.OneInterfaceUser(entigyObject) '判断是否存在输入的用户 Try If facadeReturn = False Then MessageBox.Show("用户名或密码错误!", "温馨提示") txtUsername.Text = "" txtPassword.Text = "" txtUsername.Focus() Else MessageBox.Show("登录成功", "恭喜你") End If Catch ex As Exception MsgBox(ex.Message) txtUsername.Text = "" txtPassword.Text = "" txtUsername.Focus() End Try End Sub Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click Me.Close() End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'txtUsername.Focus() Me.ActiveControl = Me.txtUsername '使文本框获得焦点 End Sub
Public Class IsUserOk '是否存在该用户 Public Function OneInterfaceUser(ByVal entigyObject As Login.Entity.UserInfo) As Boolean '实例化B层对象 Dim bllObject As New Login.BLL.HaveLoginUser '定义变量接受bllObject返回值 Dim bllReturn As Boolean '通过Facade层将entity传递给B层 bllReturn = bllObject.isUserExist(entigyObject) Return bllReturn End Function End Class
Private Sub txtUsername_KeyDown(sender As Object, e As KeyEventArgs) Handles txtUsername.KeyDown If e.KeyCode = Keys.Enter Then txtPassword.Focus() End If End Sub Private Sub txtPassword_KeyDown(sender As Object, e As KeyEventArgs) Handles txtPassword.KeyDown If e.KeyCode = Keys.Enter Then btnOk.Focus() End If End SubEnd Class
Facade层:
Public Class IsUserOk '是否存在该用户 Public Function OneInterfaceUser(ByVal entigyObject As Login.Entity.UserInfo) As Boolean '实例化B层对象 Dim bllObject As New Login.BLL.HaveLoginUser '定义变量接受bllObject返回值 Dim bllReturn As Boolean '通过Facade层将entity传递给B层 bllReturn = bllObject.isUserExist(entigyObject) Return bllReturn End Function End Class
B层:
Public Class HaveLoginUser '判断用户是否存在 Public Function isUserExist(ByVal entityObject As Login.Entity.UserInfo) As Boolean '定义接口 Dim iDalObject As Login.IDAL.ISelectUserAccess '实例化工厂 Dim factoryObject As New Login.Factory.DataAccess '调用工厂方法,创建接口 iDalObject = factoryObject.CreatUser() '定义数据库表变量,接受IDAL接口层返回值 Dim table As New DataTable Dim inflence As New Integer '实现接口的方法 table = iDalObject.SelectUser(entityObject) '判断是否有记录,有返回true,否则返回false If Not table Is Nothing Then '首先判断是否为空,不为空的情况下才能判断是否有记录 If table.Rows.Count = 0 Then Return False Else inflence = iDalObject.OnWorkInfo(entityObject) Return True End If Else Return False End If End Function End Class
Factory层:
Public Class DataAccess Private Shared ReadOnly AssemblyName As String = "LoginDAL" '为什么用shared,参数代码什么 '读配置文件 Dim db As String = System.Configuration.ConfigurationSettings.AppSettings("DB") 'System.Configuration.ConfigurationManager.AppSettings("DB") Public Function CreatUser() As Login.IDAL.ISelectUserAccess Dim className As String = db + "." + "UserData" Return CType(Assembly.Load(AssemblyName).CreateInstance(className), Login.IDAL.ISelectUserAccess) End Function End Class
IDAL层:
Public Interface ISelectUserAccess '定义方法,看数据库中是否有该用户,D层实现IDal层 Function SelectUser(ByVal selectuserInfo As Login.Entity.UserInfo) As DataTable End Interface
D层:
Public Class UserData : Implements Login.IDAL.ISelectUserAccess '实现IDal层的接口 '在数据库表User中查找有登录界面的用户, Public Function SelectUser(ByVal selectuserInfo As Login.Entity.UserInfo) As DataTable Implements Login.IDAL.ISelectUserAccess.SelectUser '实例化SQLHelper对象 Dim sqlHelperObject As New SQLHelper Dim sql As String '定义变量,接受数据库返回的数据 Dim table As New DataTable '实例化参数数组,赋值 Dim sqlParams As SqlParameter() = {New SqlParameter("@UserID", selectuserInfo.UserId), New SqlParameter("@Password", selectuserInfo.PWD)} 'sql语句执行查询 sql = "select * from User_Info where userId=@UserID and PWD=@Password" '调用SQLHelper类中的ExecSqlSelect方法执行select语句查询 table = sqlHelperObject.ExecSqlSelect(sql, CommandType.Text, sqlParams) Return table End Function
SqlServer类:因为会涉及到很多连接数据库的时候,为防止连接数据库部分代码重复编写,把该部分代码抽象出来,形成一个单独的类,可以放到D层,也可另建一层,那这样就是所谓的8层了
【总结】Public Function ExecSqlSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable '创建数据库连接,并用using及时关闭,用到配置文件连接数据库 Using conn As New SqlConnection(strConnection) '创建command命令,目的执行命令(增删改查) Dim cmd As SqlCommand = conn.CreateCommand() '定义适配器(相当于稳压器),面对的是个庞大的数据库系统,而你只需要其中的几张表,挑选作用 '(包括select,inset,update,deletecommand),与sqlconnection和sqlcommand一起使用,提高连接数据库的性能 '目的就是填充DataSet Dim adp As SqlDataAdapter '定义数据集对象,用于存储临时数据表 Dim ds As New DataSet '命令是文本形式 cmd.CommandText = cmdText '命令执行的类型 cmd.CommandType = cmdType '命令执行的参数 cmd.Parameters.AddRange(paras) '初始化适配器, adp = New SqlDataAdapter(cmd) Try '重新打开数据库 conn.Open() '向Adapter体重查询的结果 adp.Fill(ds) '返回包含在DataSet中表集合中的第一张表 Return ds.Tables(0) Catch ex As Exception Return Nothing Throw ex End Try End Using End Function
本文章有待完善,先仅供代码。。。