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


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

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

                题设要求:如果我如今要从卡表和学生表里返回查询信息(卡表的comment,money,status和学生表的所有信息),卡表和学生表例如以下:

                   

                                                      图一  学生表

                    

                                                      图二    卡表

               

    方法一:视图。

                比較简单,相信这样的方法是最经常使用的了。

                

    <span style="font-size:18px;">create view V_ CardStudent 
    @CardNo varchar(100)
    as
    select comment,money,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, CommandType.Text, 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>



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


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

  • 相关阅读:
    括号序列
    秘密信息
    大奖赛
    订单
    摆花
    利用spring自己实现观察者模式
    Spring操作mongo排序,限制查询记录数
    Hbse的读写过程
    使用aop记录数据库操作的执行时间
    分享一个关于jackson的Json工具类
  • 原文地址:https://www.cnblogs.com/llguanli/p/7029406.html
Copyright © 2020-2023  润新知