機房重構組合查詢-儲存過程

**前言:**在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層不是同一個窗體),除了往儲存過程中傳的數據表名不一樣外。其它的參數都是相同的。所以寫一個組合查詢通用的儲存過程很重要,因爲在儲存過程中把需要查詢的數據表名用參數代替了,這樣就可以靈活替換具體的數據表了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章