最近遇到了查两个表的情况,首先我想到的是用存储过程,但是如果需要两个查询结果的值的话,必须根据存储过程查询语句的顺序取你要的Table,例如DataSet.Tables[0],DataSet.Table[1]来获取想要的Table值,比较麻烦。早就听说视图了,想着可能比存储过程简单多了,查询了一下资料,确实是比存储过程方便简单快捷多了。
1.自己的理解:视图就是从若干个基本表或者其他视图构造出来的虚拟表。也可以只取某个表的几个字段。同真实的表一样,视图包含一系列带有名称的列和行数据,能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。
2.简单应用--机房收费系统stucheckcash
需要查询两个表:卡表和学生表。
(1)新建视图--在自己的数据库下找到视图
(2)选择涉及到的表或视图
(3)在表中选择想要的字段
(@H_301_93@4)点击保存并重新命名
(5)编写代码(和普通表没有区别,直接把表名改为视图名就行)
Public Function Querystudent(enStudent As StudentEntity) As DataTable Implements IStudent.Querystudentinfo 'Dim student As New StudentEntity '实例化实体类 Dim table As New DataTable '实例化数据表 '定义并实例化参数数组,防止sql注入 Dim paras As sqlParameter() = {New sqlParameter("@Studentno",enStudent.Studentno)} '这里用的是视图,把原先的Student_info改为了StuCardView_info Dim sqlstr As String = "Select * From StuCardView_info where Stuno= @Studentno" '调用sqlHelper类中的ExecSelect()方法来执行查询,获取返回值 table = clssqlHelper.ExecSelect(sqlstr,CommandType.Text,paras) Return table End Function详解:原先需要写两个查询语句,一个关于卡表查询的,一个关于学生表查询的,现在只需要写一个查询语句即可。
3.易错处:
可以看看这个图和上图的区别,第一副图是表之间有关联,卡表与学生表之间有外键,第二图没有建立关联。
区别:第一副图显示结果(查卡号为66):
这幅图显示的是我要的正确结果。
第二幅图显示结果:
会把学生表所有的数据显示出来,卡号是卡表中的对学生表不起作用,所以会显示全部并且给所有条记录的卡号都赋值成了66号。
总结:经过实践,视图在查询两个表,比存储过程易操作。只查询表中的某几个字段也可以,方便快捷,真的是挺实用的。但是也有缺点,操作视图会比直接操作基础表要慢,所以我们尽量避免在大型表上创建视图。这才刚刚开始了解,还需要继续深刻的研究。
Ps:有理解不对的地方请多多指教。