机房重构组合查询-储存过程

**前言:**在VB版本的时候实现组合查询使用sql语句的条件拼接完成的,因为vb版本的时候还没有使用分层的思想。还没有学习三层架构,再次重构的时候使用了三层架构与融合了设计模式进行实现的。并且还使用了在学习数据库视频时候学的储存过程:具体的存储过程介绍:https://blog.csdn.net/kangshihang1998/article/details/105821646 这篇博客总结了存储过程和触发器的对比。

以操作员工作记录为例:
UI界面
在这里插入图片描述
业务逻辑:

 /// <summary>
        /// 实例化工厂,用于创建D登录查询类。
        /// </summary>
        FactoryDAl fact = new FactoryDAl();
        /// <summary>
        /// 组合查询方法
        /// </summary>
        /// <param name="comf1">字段1</param>
        /// <param name="comf2">字段2</param>
        /// <param name="comf3">字段3</param>
        /// <param name="comoper1">操作符1</param>
        /// <param name="comoper2">操作符2</param>
        /// <param name="comoper3">操作符3</param>
        /// <param name="contetn1">内容1</param>
        /// <param name="content2">内容2</param>
        /// <param name="contetn3">内容3</param>
        /// <param name="rel1">组合关系1</param>
        /// <param name="rel2">组合关系2</param>
        /// <param name="form">组合查询窗体</param>
        /// <returns></returns>
        public DataTable SelectGroupQuer(string comf1, string comf2, string comf3, string comoper1, string comoper2, string comoper3, string contetn1, string content2, string contetn3, string rel1, string rel2, string DbName, Form form)
        {
            DataTable SelectGroupQuerTable = new DataTable();
            //调用接口与工厂
            GroupQuerIDAL groupQuerIDAL = (GroupQuerIDAL)fact.CreateUser("GroupQuerDAL");
            #region 第一组条件赋值
            GroupQuery groupQuery = new GroupQuery();
            groupQuery.Field1 =comf1;
            groupQuery.Operator1 = comoper1;
            groupQuery.Content1 = contetn1;
            groupQuery.DbName = DbName;
            #endregion
            #region 第二组条件赋值
            groupQuery.Relation1 =rel1;
            groupQuery.Field2 = comf2;
            groupQuery.Operator2 = comoper2;
            groupQuery.Content2 = content2;
            #endregion
            #region 第三组条件赋值
            groupQuery.Field3 = comf3;
            groupQuery.Operator3 = comoper3;
            groupQuery.Content3 = contetn3;
            groupQuery.Relation2 = rel2;
            #endregion
            #region 组合查询逻辑
            //判断第一个组合关系是否被选中
            if (rel1.Trim()!="")//被选中
            {
                #region 判断第二个组合关系是否被玄宗
                if (rel2.Trim()!="")//被选中
                {
                    #region 判断所有控件内容是否为空
                    if (comf1.Trim() != "" && comoper1.Trim() != "" && contetn1.Trim() != "")
                    {
                        if (comf2.Trim() != "" && comoper2.Trim() != "" && content2.Trim() != "")
                        {
                            if (comf3.Trim() != "" && comoper3.Trim() != "" && contetn3.Trim() != "")
                            {
                                //查询具体内容
                                SelectGroupQuerTable = groupQuerIDAL.SelectGroupQuer(groupQuery);
                            }//第三组
                        }//第二组
                    }//第一组
                    #endregion
                }
                else
                {
                    #region 判断前两组控件的内容是否为空
                    if (comf1.Trim() != "" && comoper1.Trim() != "" && contetn1.Trim() != "")
                    {
                        if (comf2.Trim() != "" && comoper2.Trim() != "" && content2.Trim() != "")
                        {
                            //查询具体内容
                            SelectGroupQuerTable = groupQuerIDAL.SelectGroupQuer(groupQuery);
                        }//第二组
                    }//第一组
                    #endregion
                }
                #endregion
            }
            else//没被选中
            {
                #region 判断第一组控件内容是否为空
                if (comf1.Trim() != "" && comoper1.Trim() != "" && contetn1.Trim() != "")
                {
                    //查询具体内容
                    SelectGroupQuerTable = groupQuerIDAL.SelectGroupQuer(groupQuery);
                }
                #endregion
            }
            #endregion
            return SelectGroupQuerTable;
        }

DAL(与其它的一样)
还有DAL层调用储存过程与正常的sql语句一样,把储存过程的名字传到sqlherper助手类里。
不同的地方是sql语句类型从文本变成了CommandType.StoredProcedure 这个的具体解释是
传入的是一个存储过程类型sql语句。
储存过程:

USE [charging_system]
GO
/****** Object:  StoredProcedure [dbo].[PROC_GroupCheck]    
Script Date: 2020/5/5 20:14:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE 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.
	if(@comboCheck1='')--初始化组合关系状态
	set @comboCheck1=null
	if(@comboCheck2='')
	set @comboCheck2=null
    --一个条件的查询
    SET @TempSql='select * from '+@DbName+' 
    where'+char(32)+@comboFields1+@comboOperators1+char(39)
    +@textBox1+char(39)
    if(@comboCheck1 is not null)
    begin
    --两个条件的查询
    SET @TempSql=@TempSql+char(32)+@comboCheck1+char(32)+@comboFields2+
    @comboOperators2+
    char(39)+@textBox2+char(39)
    if(@comboCheck2 is not null)
    begin

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

总结:
整个组合查询使用的是同一条业务线(就UI层不是同一个窗体),除了往储存过程中传的数据表名不一样外。其它的参数都是相同的。所以写一个组合查询通用的储存过程很重要,因为在储存过程中把需要查询的数据表名用参数代替了,这样就可以灵活替换具体的数据表了。

posted @ 2020-05-05 20:22  康世行  阅读(29)  评论(0编辑  收藏  举报