机房收费系统的个人重构版已经进行差不多一半多了,没有太大的磕磕绊绊,所以总感觉自己是不是哪个地方理解的还是不到位,也所以一直写不出经过自己理解后的总结博客,某一天的下午在五楼无意中听到师姐给徒弟验收机房,就多听了几句,这才发现自己一直过得太“安逸”了,就像米老师说的,人不能过得太安逸,否则会出问题的,真的是这样,废话不多说了,下面简单介绍下机房中引入的视图。
初次接触视图,是在自考的数据库系统原理,那时候只是单纯的想,单纯的理解,直到如今派上用场,才切切实实的感受到它的好以及便捷之处。
视图:从若干基本表或其它视图构造出来的表。大白话说,就是从几张我们需要的数据表中挑出我们需要的字段重新组成一张“表”以供我们查询使用。
在重构中,比如查询金额收取情况,这里涉及到两个表,一是充值表,而是学生信息表(因为要反应该卡是否结账),按照原来的思维,我可能会一个个的去查询我想要的,这里就有一个问题:大量的代码重复,怎么办?上网看看后才发现“视图”的存在。
首先,视图的创建,有两种方式:
1·相应的数据库下右击视图,按照要求来就可以,不太难,所以不再展示具体流程。
2·用“CREATE VIEW"语句实现。
create view V_student (cardNo,cancelDate,cancelTime,cancelMoney,head,isCheck) as select cancel_info.cardNo,cancelDate,cancelTime,cancelMoney,cancel_info.head,isCheck from Cancel_Info ,Student_Info where cancel_info.cardNo =student_info.cardNo两种方式均可,只是第二种方式可以顺便回顾一下代码语句。
其次,在重构中具体应用。
'用于查询金额返还记录 Public Function collectMoneyRecord(enRecharge As RechargeEntity) As Object Implements IRecharge.collectMoneyRecord Dim sql As String Dim table As DataTable 'Dim mylist As List(Of RechargeEntity, StudentEntity) Dim sqlParams() As SqlParameter = {New SqlParameter("@startDate", enRecharge.startDate), New SqlParameter("@endDate", enRecharge.endDate)} 'V_CollectMoney就是我们建立视图的名字,其它过程和正常查询类似。 sql = "select * from V_CollectMoney where rechargeDate between @startDate and @endDate" table = sqlhelper.GetDataTable(sql, CommandType.Text, sqlParams) 'mylist = ModuleEntity.converToList(Of RechargeEntity, StudentEntity)(table) Return table End Function
问题:我们都知道,在重构中,是不允许返回DataTable的,原因是向用户暴露了数据库信息,可是当我返回泛型集合时,问题又来了,大家都知道,实体和数据库中表都是一一对应的,那现在我查询的不是表,是视图,那那个集合反应的实体该怎么办?加入两个实体(RechargeEntity,StudentEntity)吗?我试过了,不可以,那要重新建立一个新的实体吗?如果这样,问题可以解决,可是这个实体不是和RechargeEntity,StudentEntity重复了吗?所以,我一直没有找着更好的解决方案,还望同胞们指点迷津。(这篇博客会持续更新)