视图书面上的解释说是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。 从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表。从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。
正如上面的解释,视图是一个虚拟的表,比如在我们的机房中,第一次敲机房的时候数据库Card和Studnt表是合在一起的,但是在机房重构时我设计的数据库是分开的,而许多操作都涉及到对两张表的同时操作,这时如果分别进行操作的话会麻烦很多,这时我们引入视图,将两张表合在一起建立一个虚拟的表。拿学生查看余额为例,他要同时需要查询Card表和Student表的信息返回到窗体中,我们来看视图是如何发挥作用的。
建立视图:右击新建视图
添加表,这里我们选择Card_Info和Stduent_Info
选择要联系的字段
不要忘记要建立连接,选择相同的字段进行连接,这样两个表才能联系起来,这里我们进行连接的字段是StudnetNo,这里只要按住Card表的StudentNo一直指向Student表的StudentNo,这样就建立起联系来了,如下图。
如果不建立联系,每个卡号会和Stduent中的每个字段建立联系,这样查询到的结果就不止一条。
最后保存,命名为V+"_"+名称。这样视图就建立好了。
使用视图时,和平时对数据库的增删改查一样,语句都是一样的,要在D层中把对数据库表的名称改为视图的名称就可以了。
<span style="font-family:KaiTi_GB2312;font-size:18px;"> Dim sql As String
Dim table As DataTable
Dim list As New List(Of Entity.EntityCardStudnet)
Dim sqlparams As SqlParameter() = {New SqlParameter("@CardNo", card.CardNo)}
sql = "select * from V_QueryCash where CardNo=@CardNo" '使用建立视图的名称
table = sqlHelper.ExecSelect(sql, CommandType.Text, sqlparams)
list = DAL.ModelHelper.convertTolist(Of Entity.EntityCardStudent)(table)
Return list</span>
我们还要注意建立视图我们要重新定义一个实体类,把视图里面所有的字段封装为一个新的实体。
如果使用泛型的话要注意实体类里面的属性名称要和数据库字段的名称一致,不然不能成功返回。这里我就因为这个错误调试了好久,不知道为什么有的属性不能返回到窗体。
总结:
遇到问题就解决问题,不能因为报错就去逃避。敲机房的时候一直都是用的DataTable,但是慢慢的了解到它是不符合分层的原则的,就慢慢的转成泛型。通过博客看到很多同学用了视图,我在了解了七层的调用和关系之后就一直那样调用,一条线一条线,也想到没有用视图,感觉总是有些遗憾,现在机房一些简单的功能已经实现了,感觉视图还是要加进去比较好,所以就返回去重新修改的代码去使用视图。在这个过程遇到了一些困难,本来很简单的一个视图让我调了好长时间,但是也算是印象深刻了。在机房中能多学习点就多学习点。