机房重构之充值

最近机房重构一直在路上,心态已经从刚开始的无从下手到现在的照着葫芦画瓢。无论是三层还是七层,基本的思路都是一样的。最先最先的是写实体层,然后先写接口层的方法,然后就是D层去实现接口层的方法,接着就是工厂,B层,接着或者是外观层,然后是U层。由于我刚刚开始是按照一个窗体一个类来写的,并不是按照数据库中的表来写的,所以越来越觉得外观层没有用,毕竟B层就一个或者是俩个方法,敲着敲着就不写外观层啦。

我们在第一次VB版的机房时候已经知道了业务逻辑啦,知道了这些窗体先执行什么,后执行什么。拿充值窗体为例,我们知道三次用到数据库,首先是查(卡号是不是在student表里),然后是插入(插入到recharge表中),最后是更新(更新student表中的余额)。

窗体:

代码:

接下来我们先看接口层的代码:

Public Interface IRecharge
    Function InterRecharge(RechargeEntity As Entity.Rechargeinfo) As DataTable

End Interface

然后D层去实现接口层的方法:在D层涉及到了数据库的内容,在这里,先查询,然后插入,最后是更新。同时这里还用到了sqlhelp里面的方法。

Imports Entity
Imports IDAL
Imports System.Data.SqlClient
Imports Sqlhelper.SqlHelper
Public Class SqlServerRechargeDAL : Implements IRecharge

    Public Function InterRecharge(ByVal RechargeEntity As Entity.Rechargeinfo) As DataTable Implements IRecharge.InterRecharge
        Dim sql As String '定义字符串变量sql 用于存放要执行的sql语句
        Dim table As DataTable '定义表变量table 用于存储执行的结果并返回
        Dim ReEntity As New Entity.Rechargeinfo
        Dim stuEntity As New Entity.Studentinfo
        Dim paras As SqlParameter() = {New SqlParameter("@cardno", RechargeEntity.cardno)}
        sql = "select * from student_info where cardno = @cardno "
        table = Sqlhelper.SqlHelper.ExecSelect(sql, CommandType.Text, paras)

        If table.Rows.Count = 0 Then
            MsgBox("没有此卡号或此卡号已经退出,请重新输入!")
            Return table

        Else

            RechargeEntity.studentno = table.Rows(0).Item("studentno")
            RechargeEntity.addmoney = RechargeEntity.addmoney
            RechargeEntity.retime = Format(Now, "hh:mm:ss")
            RechargeEntity.User_ID = RechargeEntity.User_ID
            stuEntity.cash = table.Rows(0).Item("cash") + RechargeEntity.addmoney
            stuEntity.cardno = table.Rows(0).Item("cardno")
            Dim sql1 As String '定义字符串变量sql 用于存放要执行的sql语句
            Dim num As Integer  '定义表变量table 用于存储执行的结果并返回

            Dim paras1 As SqlParameter() = {New SqlParameter("@cardno", RechargeEntity.cardno),
                                           New SqlParameter("@studentno", RechargeEntity.studentno),
                                           New SqlParameter("@addmoney", RechargeEntity.addmoney),
                                           New SqlParameter("@redate", RechargeEntity.retime),
                                           New SqlParameter("@User_ID", RechargeEntity.User_ID),
                                           New SqlParameter("@Status", "没有使用")}

            sql1 = "insert into recharge_info(studentno,cardno,addmoney,redate,User_ID,Status) values(@cardno,@studentno,@addmoney,@redate,@User_ID,@Status)"
            num = Sqlhelper.SqlHelper.ExecuteNoQuery(sql1, CommandType.Text, paras1)
            Dim result1 As Boolean
            If num > 0 Then
                result1 = True
                Dim sql2 As String
                Dim num1 As Integer
                Dim result2 As Boolean
                Dim paras2 As SqlParameter() = {New SqlParameter("@cash", stuEntity.cash),
                                              New SqlParameter("@cardno", stuEntity.cardno)}
                sql2 = "update student_info set [email protected] where [email protected]"
                num1 = Sqlhelper.SqlHelper.ExecuteNoQuery(sql2, CommandType.Text, paras2)
                If num1 > 0 Then
                    result2 = True
                Else
                    result1 = False
                End If
            Else
                result1 = False
            End If
            Return table
        End If

    End Function
End Class

工厂层是用来更换数据库用的:

Imports System.Reflection
Imports System.Configuration
Imports IDAL
Public Class RechargeFactory
    Private Shared ReadOnly AssemlyName As String = "DAL"
    '定义程序集名称变量D层命名空间的名字
    Private Shared db As String = ConfigurationManager.AppSettings("DB")
    Private Property AssemblyName As String = "DAL"
    '表示读配置文件如果配置文件中是sqlserver 就访问sqlserver数据库

    ''' <summary>
    ''' 充值窗口的抽象工厂
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function checkCfactory() As IRecharge
        '创建用户表的工厂
        Dim ClassName As String = AssemblyName + "." + db + "RechargeDAL"
        ''AssemblyName是程序集的名称,db+“UserDAL”是DAL层中的sqlServerUserDAL 如果不用SQLserver数据库,那么我们
        '在建一个类 比如我们访问access数据库 那么类名称就叫accessUserDal,把配置文件
        '中Value值改为Access 这样就是扩展而不是修改
        Dim irecharge As IRecharge '实例化接口
        '理解Assembly.Load(AssemblyName).CreateInstance(ClassName)
        irecharge = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IRecharge)
        '将实例化的D层通过向上转型转换成接口类,然后通过调用接口类中的函数来调用D层中实现该接口的函数
        Return irecharge
    End Function

End Class

接下来就是B层啦:

Imports IDAL
Imports Entity
Imports Factory
Public Class RechargeBLL
    Public Function Recheckcard(ByVal RechargeEntity As Entity.Rechargeinfo) As DataTable
        Dim ICheckCardno As IDAL.IRecharge
        Dim CheckFactory As New Factory.RechargeFactory

        ICheckCardno = CheckFactory.checkCfactory
        Dim ReBLLEntity As DataTable
        ReBLLEntity = ICheckCardno.InterRecharge(RechargeEntity)

        Return ReBLLEntity
    End Function

End Class

外观:

Imports BLL
Public Class ReFacade

    Public Function cardnoFacade(ByVal RechargeEntity As Entity.Rechargeinfo) As DataTable

        Dim reBLL As New BLL.RechargeBLL
        Dim reEntity As DataTable
        reEntity = reBLL.Recheckcard(RechargeEntity)
        Return reEntity
    End Function
End Class

U层:

Imports Facade
Imports Entity

Public Class frmrechargeUI

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim RechargeEntity As New Entity.Rechargeinfo
        RechargeEntity.cardno = txtcardno.Text.Trim
        RechargeEntity.addmoney = txtrecord.Text.Trim
        RechargeEntity.User_ID = frmLoginUI.txtusername.Text

        If txtcardno.Text = "" Or IsNumeric(txtcardno.Text) = False Then
            MsgBox("请输入卡号,并且为数字!")
        End If
        If txtrecord.Text = "" Or IsNumeric(txtrecord.Text) = False Then
            MsgBox("请输入卡号,并且为数字!")
        End If

        Dim RechargeFacade As New Facade.ReFacade
        Dim Rresult As DataTable
        Rresult = RechargeFacade.cardnoFacade(RechargeEntity)

        If Rresult.Rows.Count = 0 Then
        'If IsNothing(Rresult) Then
            MsgBox("没有此卡号!")
        Else
            TextBox1.Text = "充值卡号为:" & RechargeEntity.cardno & vbCrLf & vbCrLf & "充值金额是:" & RechargeEntity.addmoney + vbCrLf & vbCrLf & "充值时间为:" & Now & vbCrLf & vbCrLf & "充值老师为:" & RechargeEntity.User_ID
            MsgBox("充值成功!")
            TextBox1.Text = ""
            txtcardno.Text = ""
            txtrecord.Text = ""
        End If

    End Sub

End Class

明细节 :

在敲的过程中遇到了很多问题,比如在执行U层的 下面的这句,也就是我注销的这句,无论是student表里面有没有数据,因为是isnothing 也就是包含表里面的字段,即使他里面没有数据,但是也会有表头字段,所以总是执行到U层的时候出现了错误。

<pre name="code" class="vb">'If IsNothing(Rresult) Then

实体层就神略啦,我们有了很清晰的思路,那就是在各层之间注意点语法,同时在敲这个窗体的时候,我对返回值有了更加深刻的理解。

重构,实践起来!!!!!!

时间: 2024-07-31 12:52:32

机房重构之充值的相关文章

机房重构(3)——存储过程

在敲机房收费过程中我们都会遇到这样的问题:很多功能实现都需要涉及到多张表的操作,比如充值.退卡.结账等功能的实现.这就需要我们多次对数据库进行操作,不仅代码量大大增加,而且执行效率也会大打折扣.为了提高效率,于是,存储过程就华丽登场了. 1.简介 存储过程是一组为了完成特定功能的语句集,经过编译后存储在数据库中,用户通过制定存储过程的名称并给出参数来执行它.存储过程在运算时生成执行方式并存储在数据库当中,当其再次运行时速度比单个的SQL语句要快.    2.优缺点 1)优点 a.复用性强.存储过

【C#】万事开头难(二)&amp;lt;机房重构&amp;gt;

前言 机房将要进行完了,之所以仍然使用这个题目,是由于我想告诉自己.无论面对多么未知的事物.不要害怕,去做就好.在这么多天的机房重构中,发现了好多问题,也攻克了好多问题,今天,就把我解决的问题分享给大家. 充值中的分行显示 在充值和退卡功能窗口中,我们会将一些信息分行显示到lablebox中,那么这个分行是怎么做到的呢? lblDetail.Text = "充值卡号: " + txtCardNo.Text.Trim() + System.Environment.NewLine+&quo

机房重构之存储过程

在重构机房中经常遇到这样的问题:很多功能的实现都需要涉及到多张表的操作,比如充值.结账和退卡等功能的实现.因此,就需要我们多次对数据库进行操作,代码量不仅会增加,执行效率也会大大打折扣.于是,存储过程就应运而生,以大大提高执行效率. 1.简介 存储过程是一组为了完成特定功能的语句集,经过编译后存储在数据库中,用户通过制定存储过程的名称并给出参数来执行它.存储过程在运算时生成执行方式并存储在数据库当中,当其再次运行时速度比单个的SQL语句要快. 2.优缺点 1)优点 a.复用性强.存储过程可以重复

机房重构---我们“重构”出了什么?

机房重构立即就要结束了,在这"第三个"系统结束的时候,有必要思考一下我们重构的目的了. 或许有人说,还有什么目的呀,不就是编程语言换成了.Net,做出来,调完bug,能执行就得了呗.这么浮夸的日子里,还叫什么劲啊? 对于有这样的想法的人,我必须道一声:您(白)辛苦了 ! 不管做什么事,没有一点总结性思考是无法进步的. 我以下的一些重构论述或者说反思性总结也存在很多不足,希望大家多多指正,在此先致谢! 本文将从五个方面论述一下这次的重构系统,各自是系统架构.UML图指导.设计模式应用.数

机房重构(4)——触发器的使用

上篇文章<机房重构(3)--存储过程>介绍了存储过程的使用,接下来介绍一下触发器的使用.说到触发器,我们并不陌生,我们学习过程中涉及到很多相关的知识,但是欠缺的实践应用.通过这次机房收费,对触发器有了进一步的理解. 1.简介 触发器也是一种与表事件相关的特殊的存储过程.由事件来触发,当对一个表进行操作(insert,delete,update)时就会激活它执行.经常用于加强数据的完整性约束和业务规则等.它与存储过程的区别是触发器不能执行EXCUTE语句调用,而是在用户执行Transact_SQ

【个人机房重构】——创建数据库三部曲

进行过了基础三层思想的熏陶,马上就进入了个人机房重构的阶段,感觉自己这只菜鸟中的菜鸟,任重而道远.要想建造高楼大厦,必须有水泥.砖瓦.数据库是管理数据资源的容器,下面是我自己建表的过程,如果有不妥的地方,还请大家指正! 一."三范式"了然于胸 好处:关系数据库的规范,为了减少数据冗余.满足三范式,说明数据库比较健全,数据冗余少,后期维护方便. 详细内容: 第一范式(1NF):数据库表中的字段都是单一属性,不可再分,确保了每列的原子性. 例如:住址 就要拆成  省份 城市,直到不能拆了为

【机房重构】—触发器经营离婚事务所

最近了解到了触发器,现在我的理解是更喜欢把触发器当成特殊的存储过程(触发器:通过对这个表的操作为依据处罚之后可以对另外的表进行一系列操作),那么此刻我就将触发器如何经营离婚事务所的过程和大家分享: 一.经营漏洞(触发器的缺点): 当一对夫妇有了闪离的念头,冲动之余就拿着结婚证来找触发器(离婚事务所)了:此时触发器是不会在乎你俩是否真的认定了要离婚(是否应不应该触发这个事件),只要你将结婚证给了他并大概说一些理由,他就会给你们办理离婚手续(执行符合条件之后要处罚的过程),大家都知道,离婚手续一旦办

【机房重构】——存储过程(Stored Procedure)

[前言] 在学习数据库知识时,就曾经接触过存储过程,当时只是如蜻蜓点水一般,短暂的停留,并没有留下什么印象,在进行机房重构学习过程中,又重新认识了存储结构,从开始的抵触,不想用到后来逐渐了解,学着使用,思路越来越清晰,真正去做了才发现了其中的乐趣:常常说学习需要多总结,现在就是在积累,每一次的收获都要整理记录,才能留下深刻的印象,下面就来学习一下存储过程的知识吧. [存储过程的概念] 在采用客户机/服务器(C/S)计算模式的数据库系统中,很多工作可以在客户端完成,也可以在服务器端完成,数据库除了

[机房重构]UML图(包图、类图、用例图、时序图)

机房重构画图是一个非常重要的一个阶段,机房重构之前也画过UML的图,但是这一次与上一次不同,这一次有分层的思想在里面. 包图 之前三层的时候各层之间的传递很清晰,包图也很容易就画出来了,先来看之前三层的包图.通过实体将输入的信息从U层传入B层,同时通过实体将信息从D层传入B层,B层进行判断,通过实体将结果返回给U层. 之前的三层不能很好的实现低耦和的思想,并且我们学习了设计模式,要继续进行分层,进行七层的编写.之前不太理解,看大家的博客,知道在U层和B层之间加入了外观模式,降低U层和B层之间的耦