微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

三种方法实现从“一个组查询过程中返回两个表的查询结果”

还记得开始做机房的时候,遇到了要从一个函数中返回两个表的查询结果。当时的解决方法很“冲动”也很“无拘无束”,直接在实体类里边添加了其他表的实体,效果是达到了,但总觉得不伦不类。

现在介绍三种解决上述问题的方法代码为VB.net,系统使用三层架构)。

题设要求:假设我现在要从卡表和学生表里返回查询信息(卡表的comment,money,status和学生表的全部信息),卡表和学生表如下:

图一 学生表

图二 卡表

方法一:视图。

比较简单,相信这种方法是最常用的了。

<span style="font-size:18px;">create view V_ CardStudent 
@CardNo varchar(100)
as
select comment,status,studentNo,cardNo,studentName,sex,department,grade,stclass
from T_Card,T_Student
where T_Card.userName=T_Student.userName 

select * from V_ CardStudent
where cardNo=@CardNo

</span>



视图的应用也要求有外键关联,尤其是当我们做增删改等操作时,这样能保证数据的一致性,避免产生脏数据。同时,这里要建立新的包含所有要返回信息的实体集。

方法二:sql联合查询

这种方法要求表之间有外键关联,我的学生表的userName是主键,也是卡表的外键。另外,我们也需要重建一个实体集,要包含所有要求返回的信息。

<span style="font-size:18px;">联合查询sql子句:strsql = "Select c.comment,c.money,c.status From T_Card as c inner join  T_Student as s on c.userName=s.userName Where (c.cardNo=@CardNo)"</span>


适用情况:如果是需要操作的表比较少,如两三个可以考虑用这种方法,但如果是要求一次返回六七个表的信息,就不太推荐了,那样的sql语句着实是一个大难题……不仅不能重用,花费的时间还不如多写几行代码

方法三:泛型集合的“集合”。

这种方法不需要什么主外键、也不用新建实体集,原理简单,但需要用到泛型集合。

原理:我们先查找每个表的实体信息,返回一个List集合,然后把我们所需要的集合结果都添加一个新的List中,如下(部分代码):

<span style="font-size:18px;">Dim myCardList As List(Of CardEntity)
        Dim myStudentList As List(Of StudentEntity)
 
        '查找卡表中的信息,放到myCardList中
        strQueryCardInfo = "Select * From T_Card Where cardNo=@CardNo"
        Dim paraCard As sqlParameter() = {New sqlParameter("@CardNo",enCard.cardNo)}
        dtQueryCardInfo = sqlHelper.ExecuteSelect(strQueryCardInfo,CommandType.Text,paraCard)
        myCardList = CType(listHelper.convertToList(Of CardEntity)(dtQueryCardInfo),Global.System.Collections.Generic.List(Of Global.Entity.CardEntity))

        '查找学生表中的信息,放到myStudentList中
        strQueryStudentInfo = "Select * From T_Student Where cardNo=@CardNo"
        Dim paraStudent As sqlParameter() = {New sqlParameter("@CardNo",enStudent.cardNo)}
        dtQueryStudentInfo = sqlHelper.ExecuteSelect(strQueryStudentInfo,paraStudent)
        myStudentList = CType(listHelper.convertToList(Of StudentEntity)(dtQueryCardInfo),Global.System.Collections.Generic.List(Of Global.Entity.StudentEntity))

        Dim myList As New List(Of Object)  '建立一个新List
        myList.Add(myCardList)  '添加myCardList
        myList.Add(myStudentList)  '添加myStudentList

        Return myList

</span>



这种方法的缺点就是代码量较大,也不易维护。


总结:无论哪种方法,都是需要慎重考虑去选择的,有的需要时间代价,有的需要空间代价、维护代价等。所以,当我们学会或了解了新的技术或方法时,一定要慎重分析其使用范围和优缺点,选择相对合适的方法,这样我们的程序才能更稳健、高效。

原文地址:https://www.jb51.cc/vb/257832.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐