在这些基本功能快要做完的时候系统意外的错误,让我无法解决。不得已请来了师傅。但是这也是我系统的转折点,因为师傅说我的程序非常不符合七层的思想——“解耦”。所以我就按照师傅的要求。对整个机房的七层都做了相应的整改,整改完成之后,果然思路清晰了很多。
基本思路就是把每张表的字段作为一个实体,D层是对表增删改查的所有方法,B层同样,这样只需要写一个工厂层,工厂里面写上相应表的工厂方法就可以了。下面以退卡为例,展示一下修改之后的代码
Public Class frmCancelCard Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnOK.Click If txtCardNo.Text = "" Then '判断卡号是否为空 MsgBox("请输入卡号", 0, "温馨提示") End If '从学生表中查询卡号是否已经注册且正在使用的卡进行查询 Dim fac As New Facade.StudentFacade Dim card As New Model.StudentModel Dim flag As List(Of Model.StudentModel) card.CardNo = Trim(txtCardNo.Text) card.Ifuse = "使用" flag = fac.checkifuse(card) txtMoney.Text = Trim(flag(0).Cash) If flag.Count > 0 Then '将这些退卡信息添加到退卡表中 Dim fac1 As New Facade.CancelCardFacade Dim cancel As New Model.CancelCardModel Dim flag1 As Boolean cancel.CardNo = Trim(txtCardNo.Text) cancel.CancelCash = Trim(txtMoney.Text) cancel.CancelDate = Format(DateTime.Now, "yyyy/MM/dd") cancel.CTime = Format(DateTime.Now, "hh:mm:ss") cancel.UserID = Trim(frmLogin.txtUserID.Text) cancel.Status = Trim(flag(0).Status) flag1 = fac1.AddCancelRecord(cancel) If flag1 = True Then '将学生基本信息表中的是否还在使用改成不使用 Dim flag2 As Boolean card.Ifuse = "不使用" card.CardNo = Trim(txtCardNo.Text) flag2 = fac.UpdateIfuse(card) If flag2 = True Then '将选出来的数据显示在界面上 txtMoney.Text = Trim(flag(0).Cash) txtMain.Text = "退卡卡号:" & card.CardNo & vbCrLf txtMain.Text = txtMain.Text + "退款金额:" & card.Cash & vbCrLf txtMain.Text = txtMain.Text + "退卡日期:" & Format(DateTime.Now, "yy-mm-dd") & vbCrLf txtMain.Text = txtMain.Text + "退卡时间:" & Format(DateTime.Now, "hh:mm:ss") & vbCrLf txtMain.Text = txtMain.Text + "办理退卡教师:" & Trim(frmLogin.txtUserID.Text()) Else MsgBox("您输入的卡号没有注册或者已经不再使用,请重新输入", 0, "温馨提示") txtCardNo.Text = "" txtMoney.Text = "" End If End If End If End Sub End Class
首先用到的是在学生表中查询该卡是否还是使用状态因此就在studentFacade层写了以下代码
'卡号是否使用查询 Public Function checkifuse(ByVal userinfo As Model.StudentModel) As List(Of Model.StudentModel) Dim ifuse As New BLL.StudentBLL Dim myList As List(Of Model.StudentModel) myList = ifuse.Checkifuse(userinfo) Return myList End Function然后添加到退卡表中是用的退卡的facade
Public Class CancelCardFacade '添加退卡信息到退卡表中 Public Function AddCancelRecord(ByVal userinfo As Model.CancelCardModel) As Boolean Dim addrecord As New BLL.CancelCardBLL Dim flag As Boolean flag = addrecord.AddRecord(userinfo) Return flag End Function
'更新学生卡的使用状态 Public Function UpdateIfuse(ByVal userinfo As Model.StudentModel) As Boolean Dim up As New BLL.StudentBLL() Dim flag As Boolean flag = up.UpdateIfuse(userinfo) Return flag End Function
每个外观层对应一个Bll层方法
'查看学生表里输入卡号是否使用 Public Function Checkifuse(ByVal userinfo As Model.StudentModel) As List(Of Model.StudentModel) Dim fac As New Factory.FactoryDB Dim Icheckifuse As IDAL.IStudent Dim flag As List(Of Model.StudentModel) Icheckifuse = fac.Student flag = Icheckifuse.CheckIfuse(userinfo) Return flag End Function
'在表中添加记录 Public Function AddRecord(ByVal userinfo As Model.CancelCardModel) As Boolean Dim fac As New Factory.FactoryDB Dim Ican As IDAL.ICancelCard Dim flag As Boolean Ican = fac.CancelCard flag = Ican.AddCancelrecord(userinfo) Return flag End Function
'更新学生表 Public Function UpdateIfuse(ByVal userinfo As Model.StudentModel) As Boolean Dim fac As New Factory.FactoryDB Dim ifuse As IDAL.IStudent Dim flag As Boolean ifuse = fac.Student flag = ifuse.Updateifuse(userinfo) Return flag End FunctionFactory层
'创建查看余额接口的方法 Public Function Student() As IDAL.IStudent Return CType(Assembly.Load("DAL").CreateInstance("DAL.StudentDAL"), IDAL.IStudent) End Function
'创建退卡表的接口 Public Function CancelCard() As IDAL.ICancelCard Return CType(Assembly.Load("DAL").CreateInstance("DAL.CancelCardDAL"), IDAL.ICancelCard) End Function
'从student表中查找状态为使用的且卡号为输入卡号的记录 Public Function CheckIfuse(userinfo As Model.StudentModel) As List(Of Model.StudentModel) Implements IStudent.CheckIfuse Dim cmdText2 As String Dim dt2 As DataTable Dim myList2 As List(Of Model.StudentModel) Dim para As SqlParameter() = {New SqlParameter("@CardNo", userinfo.CardNo), New SqlParameter("@Ifuse", userinfo.Ifuse)} cmdText2 = "SELECT * FROM Student_info where CardNo=@CardNo And Ifuse=@Ifuse " dt2 = shelper.ExecSelect(cmdText2, CommandType.Text, para) If dt2.Rows.Count > 0 Then myList2 = ConvertGenericsHelper.convertToGenerics(Of Model.StudentModel)(dt2) Return myList2 Else Return Nothing End If End Function
'更改ifuse的状态为不使用 Public Function Updateifuse(userinfo As StudentModel) As Boolean Implements IStudent.Updateifuse '更新student中的使用状态 Dim para As SqlParameter() = {New SqlParameter("@Ifuse", userinfo.Ifuse), New SqlParameter("@CardNo", userinfo.CardNo)} Dim cmdText As String Dim dt As Boolean cmdText = "update student_info set Ifuse=@Ifuse where CardNo=@CardNo" dt = shelper.ExecAddDelUpdate(cmdText, CommandType.Text, para) Return dt End Function
'在退卡表中增加退卡记录 Public Function AddCancelrecord(Userinfo As CancelCardModel) As Boolean Implements ICancelCard.AddCancelrecord Dim cmdText As String Dim dt As Boolean Dim paras = {New SqlParameter("@CardNo", Userinfo.CardNo), New SqlParameter("@Cancelcash", Userinfo.CancelCash), New SqlParameter("@CancelDate", Userinfo.CancelDate), New SqlParameter("@CTime", Userinfo.CTime), New SqlParameter("@UserID", Userinfo.UserID), New SqlParameter("@Status", Userinfo.Status)} cmdText = "insert into CancelCard_info (CardNo,CancelCash,CancelDate,CTime,UserID,Status) values (@CardNo,@Cancelcash,@CancelDate,@CTime,@UserID,@Status)" dt = shelper.ExecAddDelUpdate(cmdText, CommandType.Text, paras) Return dt End Function
'创建更改使用状态的接口 Function Updateifuse(ByVal userinfo As Model.StudentModel) As Boolean '创建查询是否使用的接口 Function CheckIfuse(ByVal userinfo As Model.StudentModel) As List(Of Model.StudentModel)
'创建增加退卡记录的接口 Function AddCancelrecord(ByVal Userinfo As Model.CancelCardModel) As Boolean其他的sqlhelper和泛型集合转换都相同。
刚开始听到师傅说我的分层不对,应该按照数据库的表进行分层的时候,有点崩溃,一想这么多的代码都得进行改动就有点心烦意乱。但是理清楚了思路之后,就坐在床上开始修改,越修改就越清楚,用了两个多小时就把它们都改完了,虽然不知道改完之后到底对不对,但是思路确实是比之前清楚了很多。