【重构】组合查询——存储过程

前言

在上一篇博客,我和大家分享了如何在组合查询中使用模板设计模式,已经子父窗体的继承,承接上篇博客,我给大家分享一下存储过程的使用!

了解

我们既然使用存储过程,我们首相要了解一下,它是什么?

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

其实我们在学习数据库的时候,都接触过存储过程,它和触发器很类似,说白了,就是一个封装好的sql语句和流程控制语句,存放数据库中,你使用的时候直接调用就可以了!

操作

很多小伙伴可能不知道去哪里找存储过程:
数据库——>机房数据库——>可编程性——>存储过程(如下图)

这里写图片描述

代码

这是我的存储过程的代码,供大家借鉴!

USE [数据库名字]
GO
/****** Object:  StoredProcedure [dbo].[PROC_GroupCheck]    Script Date: 2018/5/20 9:02:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================    
-- Author:     刘兵 
-- Create date: 2018-5-11   
-- Description: 用于组合查询时和数据库交互    
-- =============================================    
ALTER PROCEDURE [dbo].[PROC_GroupCheck]  
    /**** 需要传递的参数 ****/
    @cmbfiled1 varchar(20),
    @cmbfiled2 varchar(20),
    @cmbfiled3 varchar(20), 
    @sombol1 varchar(20),
    @sombol2 varchar(30),
    @sombol3 varchar(20),   
    @dtp1 varchar(20),
    @dtp2 varchar(20),
    @dtp3 varchar(20),  
    @cmbRelations1 varchar(20),
    @cmbRelations2 varchar(20),
    @tablename varchar(20)                
AS      
    declare @TempSql varchar(500)   
BEGIN      
     SET @TempSql='SELECT * FROM '+@tablename +' WHERE ' +@cmbfiled1+@sombol1+char(39) + @dtp1 + char(39)       
     if (@cmbRelations1!='')    
    BEGIN        
        SET @TempSql=@TempSql+@cmbRelations1+CHAR(32)+@cmbfiled2+@sombol2+CHAR(39)+@dtp2+CHAR(39)     
        if (@cmbRelations2!='')    
        BEGIN        
        SET @TempSql=@TempSql+@cmbRelations2+CHAR(32)+@cmbfiled3+@sombol3+CHAR(39)+@dtp3+CHAR(39)        
        END        
  END    
EXECUTE(@TempSql)       
END    

D层代码

        public DataTable TeamInQuiry(Entity.Line line)
        {
            SQLHelper sqlhelper = new SQLHelper();
            string sql = "PROC_GroupCheck";
            SqlParameter[] sqlParameters =
            {
                new SqlParameter ("@cmbfiled1",line.Filed1),
                new SqlParameter ("@cmbfiled2",line.Filed2 ),
                new SqlParameter ("@cmbfiled3",line.Filed3),

                new SqlParameter ("@sombol1",line.Sybol1),
                new SqlParameter ("@sombol2",line.Sybol2 ),
                new SqlParameter ("@sombol3",line.Sybol3 ),

                new SqlParameter ("@dtp1",line.Comdition1 ),
                new SqlParameter ("@dtp2",line.Comdition2 ),
                new SqlParameter ("@dtp3",line.Comdition3 ),

                new SqlParameter ("@cmbRelations1",line .Relation1),
                new SqlParameter ("@cmbRelations2",line.Relation2),
                new SqlParameter ("@tablename",line .gettablename),
            };
            DataTable table = sqlhelper.ExecuteQuery(sql, sqlParameters, CommandType.StoredProcedure);
            return table;
        }

优点

大家看完上边的代码,不难看出,其实存储过程中的代码和我们在D层写的查询语言十分相似,但是我们为什么要是存储过程呢?

  • 提高了代码的复用性

我们在数据库中写了一个存储过程,只要是符合这个SQL语句的功能实现,都可以直接调用,大大减少了我们开发的工作量,同时提高了代码的复用性!

  • 执行速度快

数据库对存储过程进行预编译的,在首次运行一个存储过程时,查询优化器对其分析,优化,并给出系统表中的执行计划,所以速度相对较快!

  • 减少网络流量

之所以会减少流量,是因为我们之前向数据库传输的是大段大段sql语句,而现在传输的只有一个调用语句!

  • 安全

系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。

后语

其实在组合查询的时候,我们不使用存储过程也可以实现查询的功能,但是对于新的事物,我们要勇于尝试,因为这就是学习!



希望本文对您有所帮助!
有什么不足!欢迎指正!
感觉不错可以赞一下哦!

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值