机房重构开始有一断时间了,这个过程对于我来说并不容易,由开始的三层登录实现,到后来的七层登录实现,很多人说只要这条线通了以后就容易多了,但是通过这个过程对于我来说并没有那么容易,这个过程总会出现这样那样的问题。
以注册为例,我的 数据库设计的是卡表和学生表分开的,当初为了敲出另外一条线,没有首先判断卡号是否存在,只是单纯的将信息插入了card表,没有插入student表,因为还不知道怎么同时插入两张表,也不知道怎么怎么要判断完卡号之后再去决定要不要将相关信息插入数据库。通过与同学们的交流和我的摸索,写出了如下代码,为了方便我在D层传了两个实体,实现同时插入Card表和Student表。代码如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> ''' <summary> ''' 创建注册的方法,为了方便在此两个参数 ''' </summary> ''' <param name="card"></param> ''' <param name="student"></param> ''' <returns></returns> ''' <remarks>2015年4月10日11:21:38</remarks> Function RegisterCard(ByVal card As Entity.EntityCard, ByVal student As Entity.EntityStudent) As Boolean</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">Imports IDAL Imports System.Data Imports System.Reflection Imports System.Configuration 'Factory Public Class FactoryDB Private Shared ReadOnly AssemblyName As String = "DAL" '数据程序集名称 Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB") Dim strCard As String = System.Configuration.ConfigurationSettings.AppSettings("DB") ''' <summary> ''' 实例化一个DAL中的Card表的类 ''' </summary> ''' <returns></returns> ''' <remarks>2015-4-10 11:32:48</remarks> Public Function CreateCard() As IDAL.ICard Dim classname As String = "DAL" + "." + strDB + "CardDAL" Return CType(Assembly.Load(AssemblyName).CreateInstance(classname), IDAL.ICard) '' Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strCard), IDAL.ICard) End Function</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"> ''' <summary> ''' 注册新卡 ''' </summary> ''' <param name="card"></param> ''' <param name="student"></param> ''' <returns>返回Boolean型</returns> ''' <remarks>2015-4-10 14:19:00</remarks> Public Function RegisterCard(card As EntityCard, student As EntityStudent) As Boolean Implements ICard.RegisterCard Dim Sql As String Dim table As Boolean Dim sqlParams As SqlParameter() = {New SqlParameter("@CardNo", card.Card), New SqlParameter("@StudentNo", card.Student), New SqlParameter("@Date", card.RDate), New SqlParameter("@Time", card.RTime), New SqlParameter("@Balance", card.BL), New SqlParameter("@ID", card.ID), New SqlParameter("@Check", card.Check), New SqlParameter("@Type", card.CardType), New SqlParameter("@Status", card.CardStatus)} Sql = "Insert into Card_Info(CardNo,StudentNo,RegisterDate,RegisterTime,Balance,IsCheck,userID,Type,Status) Values(@CardNo,@StudentNo,@Date,@Time,@Balance,@Check,@ID,@Type,@Status)" table = sqlHelper.ExecAddDelUpdate(Sql, CommandType.Text, sqlParams) If table = True Then Dim Asql As String Dim flag As Boolean Dim params As SqlParameter() = {New SqlParameter("@StudentNoo", student.Student), New SqlParameter("@Name", student.StudentName), New SqlParameter("@Sex", student.StudentSex), New SqlParameter("@Department", student.Dept), New SqlParameter("@Grade", student.StudentGrade), New SqlParameter("@Class", student.StudentClass), New SqlParameter("@Comment", student.SCommant)} Asql = "Insert into Student_Info(StudentNo,Name,Sex,Department,Grade,Class,Comment) Values(@StudentNoo,@Name,@Sex,@Department,@Grade,@Class,@Comment)" flag = sqlHelper.ExecAddDelUpdate(Asql, CommandType.Text, params) Return flag End If Return table End Function</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class CardBLL '实现抽象工厂和接口的方法 ''' <summary> ''' 注册卡号 ''' </summary> ''' <param name="card"></param> ''' <returns></returns> ''' <remarks>2015-4-10 14:57:22</remarks> Public Function AddCard(ByVal card As Entity.EntityCard, ByVal student As Entity.EntityStudent) As Boolean Dim factory As New Factory.FactoryDB Dim Acard As IDAL.ICard Dim Aflag As DataTable Dim flag As Boolean Acard = factory.CreateCard Aflag = Acard.IsExitCard(card) If Aflag.Rows.Count = 0 Then flag = Acard.RegisterCard(card, student) If flag = True Then MsgBox("注册卡号成功", , "提示") Else MsgBox("未注册成功", , "提示") End If Else MsgBox("此卡号已存在", , "提示") End If Return flag End Function End Class</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class RegisterCardFAC ''' <summary> ''' 注册卡号 ''' </summary> ''' <param name="card"></param> ''' <returns></returns> ''' <remarks>2015-4-10 15:04:41</remarks> Public Function AddCard(ByVal card As Entity.EntityCard, ByVal student As Entity.EntityStudent) As Boolean Dim add As New BLL.CardBLL() Dim flag As Boolean flag = add.AddCard(card, student) Return flag End Function End Class </span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class frmRegister Private Sub frmRegister_Load(sender As Object, e As EventArgs) Handles MyBase.Load ComboType.Items.Add("临时用户") ComboType.Items.Add("固定用户") comboSex.Items.Add("男") comboSex.Items.Add("女") ComboStatus.Items.Add("使用") End Sub Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click Dim CardFacade As New Facade.RegisterCardFAC '实例化实体类卡 Dim card As New Entity.EntityCard '实例化实体类学生 Dim student As New Entity.EntityStudent '调用卡 card.ID = LoginUI.txtUserName.Text.Trim() card.BL = txtChargeMoney.Text card.Student = txtStudentNo.Text card.Card = txtCardNo.Text.Trim() card.CardType = ComboType.Text card.RDate = DateTime.Now.ToLongDateString() card.RTime = DateTime.Now.ToLongTimeString() card.CardStatus = ComboStatus.Text card.Check = "未结账" student.Student = txtStudentNo.Text student.StudentName = txtStudentName.Text student.StudentSex = comboSex.Text student.Dept = txtDept.Text student.StudentGrade = txtGrade.Text student.StudentClass = txtClass.Text student.SCommant = txtComment.Text Dim flag1 As Boolean flag1 = CardFacade.AddCard(card, student) End Sub End Class</span>
每一个功能都是按照这样的一个顺序进行编写的,当敲的多了发现其实并不难,机房重构和第一次机房的时候是一样的,万事开头难,当明白之后发现敲代码是一个很享受的过程,不过敲完之后的调试更是一个技术活。注册这个功能涉及到两个实体,两个表,这里可以定义一个超体,将卡表和学生表合在一起写作一个实体类,这样就不用传两个实体了,听同学们说也可以使用存储过程,这个我还没有尝试,在接下来时间里慢慢的去熟悉它。机房,我会加油的!