最近遇到了查两个表的情况,首先我想到的是用存储过程,但是如果需要两个查询结果的值的话,必须@H_301_2@根据存储过程查询语句的顺序取你要的Table@H_301_2@,例如@H_301_2@DataSet.Tables[0]@H_301_2@,@H_301_2@DataSet.Table[1]@H_301_2@来获取想要的@H_301_2@Table@H_301_2@值,比较麻烦。早就听说视图了,想着可能比存储过程简单多了,查询了一下资料,确实是比存储过程方便简单快捷多了。@H_301_2@
1.@H_301_2@自己的理解:视图就是从若干个基本表或者其他视图构造出来的虚拟表。也可以只取某个表的几个字段。@H_301_2@同真实的表一样,视图包含一系列带有名称的列和行数据,能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等@H_301_2@。@H_301_2@
@H_301_2@
2.@H_301_2@简单应用@H_301_2@--@H_301_2@机房收费系统@H_301_2@stucheck@H_301_2@cash@H_301_2@
需要查询两个表:卡表和学生表。
(@H_301_2@1@H_301_2@)新建视图@H_301_2@--@H_301_2@在自己的数据库下找到视图@H_301_2@
@H_301_2@
(2@H_301_2@)选择涉及到的表或视图@H_301_2@
@H_301_2@(@H_301_2@3@H_301_2@)在表中选择想要的字段@H_301_2@
@H_301_2@
@H_301_2@(@H_301_2@4@H_301_2@)点击保存并重新命名@H_301_2@
@H_301_2@
(@H_301_2@5@H_301_2@)编写代码(和普通表没有区别,直接把表名改为视图名就行)@H_301_2@@H_301_2@
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.@H_301_2@易错处:@H_301_2@@H_301_2@@H_301_2@
可以看看这个图和上图的区别,第一副图是表之间有关联,卡表与学生表之间有外键,第二图没有建立关联。@H_301_2@@H_301_2@@H_301_2@@H_301_2@
区别:第一副图显示结果(查卡号为66@H_301_2@):@H_301_2@
@H_301_2@
这幅图显示的是我要的正确结果。@H_301_2@@H_301_2@
第二幅图显示结果:
会把学生表所有的数据显示出来,卡号是卡表中的对学生表不起作用,所以会显示全部并且给所有条记录的卡号都赋值成了@H_301_2@66@H_301_2@号。@H_301_2@
总结:经过实践,视图在查询两个表,比存储过程易操作。只查询表中的某几个字段也可以,方便快捷,真的是挺实用的。但是也有缺点,@H_301_2@操作视图会比直接操作基础表要慢,所以我们尽量避免在大型表上创建视图@H_301_2@@H_301_2@。这才刚刚开始了解,还需要继续深刻的研究。@H_301_2@
原文链接:https://www.f2er.com/vb/257952.html