存储过程---留住你的美丽(下)

简介:         继上篇博客,存储过程---留住你的美丽(上),接着叨叨,美丽是留住了,如何让美丽持久惊艳别人的眼球,我们就要开动我们的小脑袋,转一转,想一想,一如上篇博客中所展示的代码一样,需要传十一个参数,各个层之间都需要重复写,键盘累了,坏了...
        继上篇博客,存储过程---留住你的美丽(上),接着叨叨,美丽是留住了,如何让美丽持久惊艳别人的眼球,我们就要开动我们的小脑袋,转一转,想一想,一如上篇博客中所展示的代码一样,需要传十一个参数,各个层之间都需要重复写,键盘累了,坏了怎么办nie?还要重新上京东买,咳咳咳,言归正传,依旧结合机房收费来说,如何让存储过程美丽持久,流年过往,经年不忘......

        在机房收费系统中,涉及三个组合查询,分别是学生基本信息维护、学生上机状态查看、操作员工作记录;如何让三个组合查询使用同一个存储过程,就需要我们转转小小的脑袋,几经周折,发现,我们可以把表名当成一个参数进行传递,这样,用到不同表的时候,我们只需要变更表名即可,存储过程写法如下所示:

        

<span style="font-size:18px;"><span style="font-size:18px;">USE [MachineRoomChargeSystem]
GO
/****** Object:  StoredProcedure [dbo].[Proc_GroupQuery]    Script Date: 08/01/2014 19:24:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<丁国华>
-- Create date: <2014年7月31日 20:08:32>
-- Description:	<组合查询--学生上机状态查看,操作员工记录>
-- =============================================
ALTER PROCEDURE [dbo].[Proc_GroupQuery]
	-- Add the parameters for the stored procedure here
	@cboFieldA varchar(10),           --字段名A
	@cboOperatorA varchar(10),        --操作符A
	@txtContentA varchar(10),         --要查询的内容A
	@cboRelationA varchar(10),        --组合关系A
	@cboFieldB varchar(10),           --字段名B
	@cboOperatorB varchar(10),        --操作符B
	@txtContentB varchar(10),         --要查询的内容B
	@cboRelationB varchar(10),        --组合关系B
	@cboFieldC varchar(11),           --字段C
	@cboOperatorC varchar(10),        --操作符C
	@txtContentC varchar(10),         --要查询的内容C
	@tableName varchar(50)            --要查询的视图名或表面名
	
	
AS
   declare @strText varchar(500)--临时存放sql语句
   --CHAR(32)是空格,CHAR(39)单引号
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	set @strText ='select * from '+@tableName+' where status !='+CHAR(39)+'正常上机'+CHAR(39)+' and status !='+char(39)+'正在值班'+CHAR(39)+' and'+CHAR(32)
	+@cboFieldA+@cboOperatorA+CHAR(39)+@txtContentA +CHAR(39)
	if @cboRelationA!=''
	begin
	set @strText=@strText+@cboRelationA+CHAR(32)+
    @cboFieldB+@cboOperatorB+CHAR(39
    )+@txtContentB+CHAR(39)
    end
	if @cboRelationB!=''
	begin
	set @strText=@strText+@cboRelationB+CHAR(32)+
    @cboFieldC+@cboOperatorC+CHAR(39)+@txtContentC+CHAR(39)
    end
    execute(@strText)
    
	
END
 
</span></span>
           E---实体层写法如下:

            

<span style="font-size:18px;"><span style="font-size:18px;">'**********************************************
'文 件 名: GroupQueryEntity
'命名空间: Entity
'内    容:
'功    能: 组合查询
'文件关系:
'作    者:丁国华
'小    组:宝贝计划
'生成日期: 2014/7/31 21:33:57
'版本号:V2.0
'修改日志:
'版权说明:
'**********************************************

Public Class GroupQueryEntity
    ''' <summary>
    ''' 组合查询用到的一系列实体
    ''' </summary>
    ''' <remarks></remarks>
    Private _cboFieldA As String
    Public Property cboFieldA() As String
        Get
            Return _cboFieldA
        End Get
        Set(value As String)
            _cboFieldA = value
        End Set
    End Property

    Private _cboOperatorA As String
    Public Property cboOperatorA() As String
        Get
            Return _cboOperatorA
        End Get
        Set(value As String)
            _cboOperatorA = value
        End Set
    End Property

    Private _txtContentA As String
    Public Property txtContentA() As String
        Get
            Return _txtContentA
        End Get
        Set(value As String)
            _txtContentA = value
        End Set
    End Property

    Private _cboRelationA As String
    Public Property cboRelationA() As String
        Get
            Return _cboRelationA
        End Get
        Set(value As String)
            _cboRelationA = value
        End Set
    End Property

    Private _cboFieldB As String
    Public Property cboFieldB() As String
        Get
            Return _cboFieldB
        End Get
        Set(value As String)
            _cboFieldB = value
        End Set
    End Property

    Private _cboOperatorB As String
    Public Property cboOperatorB() As String
        Get
            Return _cboOperatorB
        End Get
        Set(value As String)
            _cboOperatorB = value
        End Set
    End Property

    Private _txtcontentB As String
    Public Property txtcontentB() As String
        Get
            Return _txtcontentB
        End Get
        Set(value As String)
            _txtcontentB = value
        End Set
    End Property

    Private _cboRelationB As String
    Public Property cboRelationB() As String
        Get
            Return _cboRelationB
        End Get
        Set(value As String)
            _cboRelationB = value
        End Set
    End Property

    Private _cboFieldC As String
    Public Property cboFieldC() As String
        Get
            Return _cboFieldC
        End Get
        Set(value As String)
            _cboFieldC = value
        End Set
    End Property

    Private _cboOperatorC As String
    Public Property cboOperatorC() As String
        Get
            Return _cboOperatorC
        End Get
        Set(value As String)
            _cboOperatorC = value
        End Set
    End Property

    Private _txtContentC As String
    Public Property txtContentC() As String
        Get
            Return _txtContentC
        End Get
        Set(value As String)
            _txtContentC = value
        End Set
    End Property

    Private _tableName As String
    Public Property tableName() As String
        Get
            Return _tableName
        End Get
        Set(value As String)
            _tableName = value
        End Set
    End Property

End Class
</span></span>
          D层如下:就学生上机状态查询来说:

          

<span style="font-size:18px;"><span style="font-size:18px;">'**********************************************
'文 件 名: T_LineDAL
'命名空间: DAL
'内    容:
'功    能:
'文件关系:
'作    者:丁国华
'小    组:宝贝计划
'生成日期: 2014/7/25 10:39:13
'版本号:V2.0
'修改日志:
'版权说明:
'**********************************************
 ''' <summary>
    ''' 组合查询-学生上机状态查看
    ''' </summary>
    ''' <param name="enGroupQuery"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function queryStatus(enGroupQuery As Entity.GroupQueryEntity) As List(Of Entity.LineEntity) Implements ILine.queryStatus

        Dim strText As String = "Proc_GroupQuery"  '从存储过程里面查询相应信息
        Dim cmdType As String = CommandType.StoredProcedure '命令类型
        Dim parameter As SqlParameter()   '传参

        parameter = {New SqlParameter("@cboFieldA", enGroupQuery.cboFieldA),
                   New SqlParameter("@cboOperatorA", enGroupQuery.cboOperatorA),
                   New SqlParameter("@txtContentA", enGroupQuery.txtContentA),
                   New SqlParameter("@cboRelationA", enGroupQuery.cboRelationA),
                   New SqlParameter("@cboFieldB", enGroupQuery.cboFieldB),
                   New SqlParameter("@cboOperatorB", enGroupQuery.cboOperatorB),
                   New SqlParameter("@txtContentB", enGroupQuery.txtcontentB),
                   New SqlParameter("@cboRelationB", enGroupQuery.cboRelationB),
                   New SqlParameter("@cboFieldC", enGroupQuery.cboFieldC),
                   New SqlParameter("@cboOperatorC", enGroupQuery.cboOperatorC),
                   New SqlParameter("@txtContentC", enGroupQuery.txtContentC),
                   New SqlParameter("@tableName", enGroupQuery.tableName)}


        Dim sqlHelper As New SqlHelper
        Dim dt As New DataTable
        Dim myList As List(Of Entity.LineEntity)

        dt = sqlHelper.ExecuteReaderTable(strText, cmdType, parameter)
        myList = EntityHelper.convertToList(Of Entity.LineEntity)(dt)
        Return myList
    End Function
End Class</span></span>
        对实体进行封装,把先前需要传递的十一个参数转换成现在只需要传递一个实体即可,还有一个细节问题需要注意的是,在存储过程里面SQL语句where后面的条件该如何写nie?就学生查看上机记录和操作员工作记录来说,第一个组合查询涉及到的状态有正常上机,正常下机,强制下机;第二个组合查询涉及到的状态有正在值班和下班两种状态,我们的第一个组合查询的业务需求是查出来的信息是状态不等于正常上机的相关信息,第二个组合查询的业务需求是状态不等于正在值班的相关信息,那么在where后面的条件到底是用and连接还是用or连接,小伙伴们都知道and的意思是和,连词,连接两个并列结构,or是或者的意思,整到这里,我就开始整蒙圈了,到底是用or还是用and呢?开始我的第一反应用的是or,要么执行这个,要么执行那个,别着急,让我们用实话说话,焦点访谈,呵呵,开个玩笑,在SQL中新建查询,看看用and连接,会发生什么好玩儿的事儿呢?
           

          接着,用or连接:

          

       进过对比,我们发现,第一个用and连接,查询出来的信息的状态包括正常上机的和正常下机的,但是根据机房收费系统的业务需求,需要我们查询出来的信息是正常下机的,显然第二个才是我们所需要的信息,聪明的读者,明白了么?

        对比我们之前学习过的vb中的函数过程和我们的存储过程,有什么不一样的地方呢?存储过程不一定非要有返回值数据库中的函数一定有返回值;存储过程在前台语言可以直接调用 而函数一般要有sql语句做为载体;用户自定义函数在处理同一数据行中的各个字段时,特别方便有用。虽然这里使用存储过程也能达到查询目的,但是显然没有使用函数方便。而且,即使使用存储过程也无法处理SELECT查询中的同一数据行中的各个字段的运算。因为存储过程不返回值,使用时只能单独调用;而函数却能出现在能放置表达式的任何位置。第二版机房收费系统,未完,待续......

     
目录
相关文章
|
4天前
|
存储 SQL Oracle
Oracle存储过程:数据王国的魔法师
【4月更文挑战第19天】Oracle存储过程是封装复杂SQL操作的魔法工具,存储在数据库中以便重复调用。它们提供高效执行和安全,类似于预编译的程序。创建存储过程涉及定义名称和参数,如示例所示,创建一个根据员工ID获取姓名和薪资的`get_employee_info`过程。调用存储过程可提高代码可读性和性能,使数据库管理更为便捷。
|
3月前
|
SQL
leetcode-SQL-1050. 合作过至少三次的演员和导演
leetcode-SQL-1050. 合作过至少三次的演员和导演
24 0
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_48 合作过至少三次的演员和导演
「SQL面试题库」 No_48 合作过至少三次的演员和导演
|
4月前
每日一题----昂贵的婚礼
每日一题----昂贵的婚礼
|
SQL 存储 NoSQL
招募队友,和老表一起21天学完SQL必知必会,肝
招募队友,和老表一起21天学完SQL必知必会,肝
招募队友,和老表一起21天学完SQL必知必会,肝
|
存储 安全 关系型数据库
完蛋,公司被一条 update 语句干趴了!
不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。 当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。 我们可以打开 MySQL 里的 sql_safe_updates 参数,这样可以预防 update 操作时 where 条件没有带上索引列。 如果发现即使在 where 条件中带上了列索引列,优化器走的还是全标扫描,这时我们就要使用 force index([index_name]) 可以告诉优化器使用哪个索引。
完蛋,公司被一条 update 语句干趴了!
|
安全 数据安全/隐私保护
看Ta独特魅力!如何通吃佛系员工与霸道总裁
随着共享经济大潮的兴起,以共享单车为领衔的新兴产业也异军突起。但其实,共享的内核早已渗入生活的方方面面,例如近两年大受创业团队追捧的联合办公,其内核就是通过共享办公场所与办公用品,降低各自公司的办公成本,并促进效率的提升。
看Ta独特魅力!如何通吃佛系员工与霸道总裁
|
传感器 人工智能 算法
呼喊极客们,六足机器人 HEXA 身上藏着未来人机交互方式的答案|涨知识
在刚刚过去的2016 亚洲消费电子展(CES ASIA)上,Vincross公司开发的HEXA成功获得LAST GADGET STANDING奖项的提名。在如今机器人蓬勃发展到有点眼花缭乱的时候,来自中国的创业者孙天齐带着他的HEXA,凭借着独特的外形和丰富的开源性,让中国的自主创新机器人走上国际舞台。
293 0
呼喊极客们,六足机器人 HEXA 身上藏着未来人机交互方式的答案|涨知识
|
新零售 搜索推荐
再议拼多多崛起---数据人无事闲聊
拼多多本质上是他背后强大制造业和互联网等要素构成的价值网,以及无处安放的低端供应链和低销人群构成的巨大市场,最终撑起了拼多多。还有,中国的营销效率是全世界最好的,中国的制造业能力是最强的,中国可以触及的市场是最大的,在这样的价值网基础上,未来中国肯定会崛起许多本土品牌并走向国际。
13652 0
|
程序员
【晒出你的第83行代码】社区用户@尼古拉斯雷的代码故事,和现在比起来以前的代码都是垃圾!
在五四青年节之际,社区发起了来晒晒属于你的“第83行”的活动,活动中邀请业界的大牛、大神们来晒代码或者Review代码!本轮我们晒晒社区用户@尼古拉斯雷的代码故事,和以前比起来现在的代码进步太多了。
1665 0

热门文章

最新文章