【重构】C#——存储过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sophia_0331/article/details/82834102

存储过程

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

1、为什么要使用存储过程?

目的:解决代码冗余的问题。在机房重构进行组合查询时,如果不用存储过程的话,每一个条件都查询一次,都查询七八次,代码重复度太高,工作量也很大,这时就可以用存储过程来解决这个问题,定义好要查询的参数,将要查询的语句框架放到数据库中的存储过程中,需要用的时候就直接调用这个存储过程,D层就可以少写很多代码了。

2、如何使用存储过程?

--Author:sophia
--Create date:2018-08-30
--Description:组合查询存储过程
ALTER PROCEDURE [dbo].[PROC_GroupCheck] 
    -- Add the parameters for the stored procedure here
    @DbName nvarchar(50),
    @comboFields1 nvarchar(20),
    @comboFields2 nvarchar(20),
    @comboFields3 nvarchar(20),
    @comboOperators1 nvarchar(10),
    @comboOperators2 nvarchar(10),
    @comboOperators3 nvarchar(10),
    @textBox1 nvarchar(20),
    @textBox2 nvarchar(20),
    @textBox3 nvarchar(20),
    @comboCheck1 nvarchar(10),
    @comboCheck2 nvarchar(10)

AS 
declare @TempSql varchar(500)--临时存放sql语句
--Char(32)是空格  插入(39)是单引号
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.


    --一个条件的查询
    SET @TempSql=' select * from '+@DbName+' where '+char(32)+@comboFields1+@comboOperators1+char(39)+@textBox1+char(39)
    if(@comboCheck1 ='and' or @comboCheck1='or')
    begin
    --两个条件的查询
    SET @TempSql=@TempSql+char(32)+@comboCheck1+char(32)+@comboFields2+@comboOperators2+char(39)+@textBox2+char(39)
    if(@comboCheck2 ='and' or @comboCheck2='or')
    begin

    --三个条件的查询
    SET @TempSql=@TempSql+char(32)+@comboCheck2+char(32)+@comboFields3+@comboOperators3+char(39)+@textBox3+char(39)
    end
    end
    execute(@Tempsql)
END

D层代码调用存储过程:

public DataTable GroupCheck(Entity.GroupCheck GKstudent)
        {
            SQLHelper sqlhelper = new SQLHelper();
            string sql = "dbo.PROC_GroupCheck";//存储过程
            SqlParameter[] paras = new SqlParameter[]
            {
                 new SqlParameter("@DBName",GKstudent.Gettablename),

                new SqlParameter("@comboFields1",GKstudent.cmbfield1),
                new SqlParameter("@comboFields2",GKstudent.cmbfield2),
                new SqlParameter("@comboFields3",GKstudent.cmbfield3),

                new SqlParameter("@comboOperators1",GKstudent.cmboperate1),
                new SqlParameter("@comboOperators2",GKstudent.cmboperate2),
                new SqlParameter("@comboOperators3",GKstudent.cmboperate3),

                new SqlParameter("@textBox1",GKstudent.txtquery1),
                new SqlParameter("@textBox2",GKstudent.txtquery2),
                new SqlParameter("@textBox3",GKstudent.txtquery3),

                new SqlParameter("@comboCheck1",GKstudent.cmbrelation1),
                new SqlParameter("@comboCheck2",GKstudent.cmbrelation2)

            };              
            DataTable dt = sqlhelper.ExecuteQuery(sql, paras, CommandType.StoredProcedure);
            return dt;
        }

3、存储过程的优点

  • 重复使用,可以减少数据库开发人员的工作量
  • 减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
  • 安全性。参数化的存储过程可以防止SQL注入式攻击。

4、存储过程的缺点

  • 调试麻烦
  • 移植问题
  • 重新编译问题
  • 大量使用存储过程,难以维护。

猜你喜欢

转载自blog.csdn.net/Sophia_0331/article/details/82834102
今日推荐