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

简介:         存储过程,是什么呢?分解来看,存储--根据不同的应用环境通过采取合理、安全、有效的方式将数据保存到某些介质上并能保证有效的访问,总的来讲可以包含两个方面的含义:一方面它是数据临时或长期驻留的物理媒介;另一方面,它是保证数据完整安全存放的方式或行为。
        存储过程,是什么呢?分解来看,存储--根据不同的应用环境通过采取合理、安全、有效的方式将数据保存到某些介质上并能保证有效的访问,总的来讲可以包含两个方面的含义:一方面它是数据临时或长期驻留的物理媒介;另一方面,它是保证数据完整安全存放的方式或行为。过程--事物发展所经过的程序;阶段。“过程”,也是将输入转化为输出的系统。
        在我们的计算机的世界里,百度对存储过程这样进行阐述:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

       下面结合机房收费系统中的组合查询--学生基本信息维护为例,该功能的逻辑,根据不同的条件选择,查询相应信息。接下来:看看我们的存储过程如何在她的世界动情演绎,首先我们来看一下存储过程的创建。

       首先:第一步

        

       第二步:

       

      接下来就开始编译我们的存储过程了代码如下:

      

<span style="font-size:18px;">-- =============================================
-- Author:		<丁国华>
-- Create date: <2014年7月30日 12:14:52,>
-- Description:	<组合查询--学生基本信息维护>
-- =============================================
CREATE PROCEDURE [dbo].[Proc_StuInfoPreserve]
	-- 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(10),           --字段C
	@cboOperatorC varchar(10),        --操作符C
	@txtContentC varchar(10)          --表名或视图名称
	
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 T_Student where '+CHAR(32)
	+@cboFieldA+@cboOperatorA+CHAR(39)+@txtContentA +CHAR(39)+
    CHAR(32)+@cboRelationA +CHAR (32)+
    @cboFieldB+@cboOperatorB +CHAR(39)+@txtContentB+CHAR(39)+
    CHAR(32)+@cboRelationB+CHAR(32)+
    @cboFieldC+@cboOperatorC+CHAR(39)+@txtContentC+CHAR(39)
    execute(@strText)
END
GO</span>
         上述存储过程的写法,报出如下错误:

         

        错误的原因就是存储过程写错了,存储过程应该到底应该怎么写呢?正确做法如下:

         

<span style="font-size:18px;">USE [MachineRoomChargeSystem]
GO
/****** Object:  StoredProcedure [dbo].[Proc_StuInfoPreserve]    Script Date: 07/31/2014 16:49:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<丁国华>
-- Create date: <2014年7月30日 12:14:52,>
-- Description:	<组合查询--学生基本信息维护>
-- =============================================
ALTER PROCEDURE [dbo].[Proc_StuInfoPreserve]
	-- 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
	
	
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 T_Student where'+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>
        那么我们的D层有该怎么去写呢?以前写sql语句的地方,应该如何进行相应变动,写法如下:

        

<span style="font-size:18px;">'**********************************************
'文 件 名: T_StudentDAL
'命名空间: DAL
'内    容: 对学生表的一系列增删改查的操作
'功    能: 
'文件关系:
'作    者:丁国华
'小    组:宝贝计划
'生成日期: 2014/7/17 10:15:17
'版本号:V2.0
'修改日志:
'版权说明:
'**********************************************

  ''' <summary>
    ''' 学生基本信息维护,根据条件的相关选择,查询出相应信息
    ''' </summary>
    ''' <param name="cboFieldA"></param>
    ''' <param name="cboOperatorA"></param>
    ''' <param name="txtContentA"></param>
    ''' <param name="cboRelationA"></param>
    ''' <param name="cboFieldB"></param>
    ''' <param name="cboOperatorB"></param>
    ''' <param name="txtcontentB"></param>
    ''' <param name="cboRelationB"></param>
    ''' <param name="cboFieldC"></param>
    ''' <param name="cboOperatorC"></param>
    ''' <param name="txtContentC"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function QueryStuInfoPre(cboFieldA As String, cboOperatorA As String, txtContentA As String, cboRelationA As String, cboFieldB As String, cboOperatorB As String, txtcontentB As String, cboRelationB As String, cboFieldC As String, cboOperatorC As String, txtContentC As String) As List(Of Entity.StudentEntity) Implements IStudent.QueryStuInfoPre
        Dim strText As String = "Proc_StuInfoPreserve" '这里的strText不在存放单条SQL语句,而是存储过程
        Dim cmdType As CommandType = CommandType.StoredProcedure '命令类型
        Dim parameter As SqlParameter() '传参数

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

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

        dt = sqlHelper.ExecuteReaderTable(strText, cmdType, parameter)
        myList = EntityHelper.convertToList(Of Entity.StudentEntity)(dt)
        Return myList

    End Function
</span>
          结合机房收费系统,我对存储过程的理解就是,把一推sql语句写到存储过程中,在系统中涉及到sql语句的时候,直接写存储过程的名字即可,这样做的好处可以重复使用,从而可以减少数据库开发工作人员的工作量;提高了性能;减少了网络流量;提高了安全性。在机房收费系统中,涉及三个组合查询,如何让三个组合查询使用用一个存储过程,尽情期待,下篇博文存储过程---留住你的美丽(下),第二版机房收费系统,未完,待续......

 
目录
相关文章
|
7月前
|
存储 SQL Oracle
Oracle存储过程:数据王国的魔法师
【4月更文挑战第19天】Oracle存储过程是封装复杂SQL操作的魔法工具,存储在数据库中以便重复调用。它们提供高效执行和安全,类似于预编译的程序。创建存储过程涉及定义名称和参数,如示例所示,创建一个根据员工ID获取姓名和薪资的`get_employee_info`过程。调用存储过程可提高代码可读性和性能,使数据库管理更为便捷。
488. 祖玛游戏【我亦无他唯手熟尔】
488. 祖玛游戏【我亦无他唯手熟尔】
110 0
|
人工智能 JSON Dart
别总写代码,这130个网站比涨工资都重要
别总写代码,这130个网站比涨工资都重要
233 0
别总写代码,这130个网站比涨工资都重要
|
SQL 存储 NoSQL
招募队友,和老表一起21天学完SQL必知必会,肝
招募队友,和老表一起21天学完SQL必知必会,肝
125 0
招募队友,和老表一起21天学完SQL必知必会,肝
|
存储 安全 关系型数据库
完蛋,公司被一条 update 语句干趴了!
不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。 当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。 我们可以打开 MySQL 里的 sql_safe_updates 参数,这样可以预防 update 操作时 where 条件没有带上索引列。 如果发现即使在 where 条件中带上了列索引列,优化器走的还是全标扫描,这时我们就要使用 force index([index_name]) 可以告诉优化器使用哪个索引。
完蛋,公司被一条 update 语句干趴了!
|
安全 数据安全/隐私保护
看Ta独特魅力!如何通吃佛系员工与霸道总裁
随着共享经济大潮的兴起,以共享单车为领衔的新兴产业也异军突起。但其实,共享的内核早已渗入生活的方方面面,例如近两年大受创业团队追捧的联合办公,其内核就是通过共享办公场所与办公用品,降低各自公司的办公成本,并促进效率的提升。
104 0
看Ta独特魅力!如何通吃佛系员工与霸道总裁
|
存储 自然语言处理 关系型数据库
从大厂不允许使用 SELECT * 说开去
从大厂不允许使用 SELECT * 说开去
148 0
|
新零售 搜索推荐
再议拼多多崛起---数据人无事闲聊
拼多多本质上是他背后强大制造业和互联网等要素构成的价值网,以及无处安放的低端供应链和低销人群构成的巨大市场,最终撑起了拼多多。还有,中国的营销效率是全世界最好的,中国的制造业能力是最强的,中国可以触及的市场是最大的,在这样的价值网基础上,未来中国肯定会崛起许多本土品牌并走向国际。
13760 0
|
SQL Oracle 关系型数据库
动手为王:由一条UPDATE语句引发的一波三折深入实践
当时我在『甲骨文技术大会』分享了一个关于SQL的主题,其中的一个案例推演了几个步骤,后来本文作者『刘晨』做了验证、实验,并且分享在他的博客上,今天我们整理了这篇文章和大家分享。
1755 0