【机房重构】注册

    机房重构开始有一断时间了,这个过程对于我来说并不容易,由开始的三层登录实现,到后来的七层登录实现,很多人说只要这条线通了以后就容易多了,但是通过这个过程对于我来说并没有那么容易,这个过程总会出现这样那样的问题。

    以注册为例,我的 数据库设计的是卡表和学生表分开的,当初为了敲出另外一条线,没有首先判断卡号是否存在,只是单纯的将信息插入了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>

     第四步,D层实现接口的方法,这里会用到sqlHelper,对于封装的sqlHelper详见博客:【机房重构】sqlHelper.

<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>

    第五步,B层实现抽象工厂和接口的方法,在这里要进行逻辑判断。

<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>

    第六步,Facade层,调用B层方法将U层数据传入B层或返回数据给U层


<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>

    第七步,U层,将输入的内容传给实体,通过外观层,进行传参。

<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>

    总结:

    每一个功能都是按照这样的一个顺序进行编写的,当敲的多了发现其实并不难,机房重构和第一次机房的时候是一样的,万事开头难,当明白之后发现敲代码是一个很享受的过程,不过敲完之后的调试更是一个技术活。注册这个功能涉及到两个实体,两个表,这里可以定义一个超体,将卡表和学生表合在一起写作一个实体类,这样就不用传两个实体了,听同学们说也可以使用存储过程,这个我还没有尝试,在接下来时间里慢慢的去熟悉它。机房,我会加油的!

你可能感兴趣的:(【机房重构】注册)