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

存储过程---留住你的美丽(下),第1张

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

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

<span ><span >USE [MachineRoomChargeSystem]GO/****** Object:  StoredProcedure [dbo].[Proc_Groupquery]    Script Date: 08/01/2014 19:24:15 ******/SET ANSI_NulLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- 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 ><span >'**********************************************'文 件 名: 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 PropertyEnd Class</span></span>
D层如下:就学生上机状态查询来说:

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

接着,用or连接:

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

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

总结

以上是内存溢出为你收集整理的存储过程---留住你的美丽(下)全部内容,希望文章能够帮你解决存储过程---留住你的美丽(下)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1272897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存