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