机房重构——组合查询

时间:2022-09-16 10:36:30

        机房重构,组合查询也算是一个大难关,组合查询到底应该怎么做呢?我不能再很原来一样再敲三个窗体吧,这就必须采取措施来改变这种想法,经过我不断摸索终于找到了解决方法,模板方法,我们只需要建一个模板窗体,其他各窗体继承父窗体就可以满足我的要求。那究竟怎么来实现呢?

       接下来来详细论述。我认为模板方法,就跟我们平时制作月饼一样,做一个模子,接下来只要依葫芦画瓢,按照已有的资源去做就好,这样就省去了每次都一做一个花样的时间,也达到了复用。

机房重构——组合查询

这是制作了一个模板,接下来的只要继承就可以了,当然可以有一些自己的个性。

U层的代码如下:

Public Class FrmMulQuery

Protected enMulQuery As New En_MulQuery
Private Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.Click
'第一个组合关系为空
If cmbRelation1.Text = "" Then
If cmbField1.Text = "" Then
MsgBox("请选择字段名!")
ElseIf cmbOperation1.Text = "" Then
MsgBox("请选择操作符!")
ElseIf txtContent1.Text = "" Then
MsgBox("请输入查询条件!")
End If
End If
'第一个组合关系不为空
If cmbRelation1.Text <> "" Then
If cmbField1.Text = "" Then
MsgBox("请选择字段名!")
ElseIf cmbOperation1.Text = "" Then
MsgBox("请选择操作符!")
ElseIf txtContent1.Text = "" Then
MsgBox("请输入查询条件!")
ElseIf cmbField2.Text = "" Then
MsgBox("请选择字段名!")
ElseIf cmbOperation2.Text = "" Then
MsgBox("请选择操作符!")
ElseIf txtContent2.Text = "" Then
MsgBox("请输入查询条件!")
End If
End If
'第二个组合关系不为空
If cmbRelation2.Text <> "" Then
If cmbField1.Text = "" Then
MsgBox("请选择字段名!")
ElseIf cmbOperation1.Text = "" Then
MsgBox("请选择操作符!")
ElseIf txtContent1.Text = "" Then
MsgBox("请输入查询条件!")
ElseIf cmbField2.Text = "" Then
MsgBox("请选择字段名!")
ElseIf cmbOperation2.Text = "" Then
MsgBox("请选择操作符!")
ElseIf txtContent2.Text = "" Then
MsgBox("请输入查询条件!")
ElseIf cmbField3.Text = "" Then
MsgBox("请选择字段名!")
ElseIf cmbOperation3.Text <> "" Then
MsgBox("请选择操作符!")
ElseIf txtContent3.Text = "" Then
MsgBox("请输入查询条件!")
End If
End If
'定义并实例化实体
Dim enMulQuery As New Entity.En_MulQuery
'给实体层传参
enMulQuery.cmbField1 = GetEnglish(cmbField1.Text.Trim())
enMulQuery.cmbField2 = GetEnglish(cmbField2.Text.Trim())
enMulQuery.cmbField3 = GetEnglish(cmbField3.Text.Trim())
enMulQuery.cmbOperation1 = cmbOperation1.Text.Trim()
enMulQuery.cmbOperation2 = cmbOperation2.Text.Trim()
enMulQuery.cmbOperation3 = cmbOperation3.Text.Trim()
enMulQuery.txtContent1 = txtContent1.Text.Trim()
enMulQuery.txtContent2 = txtContent2.Text.Trim()
enMulQuery.txtContent3 = txtContent3.Text.Trim()
enMulQuery.cmbRelation1 = GetEnglish(cmbRelation1.Text.Trim())
enMulQuery.cmbRelation2 = GetEnglish(cmbRelation2.Text.Trim())
enMulQuery.GetTable = GetTable()

'实例化外观层
Dim facadeMulquery As New Facade.MulQueryFacade
'定义临时表
Dim table As New DataTable
'获取外观层传出的数据
table = facadeMulquery.MulQuery(enMulQuery)
'将数据显示在控件中
DataGridView1.DataSource = table
End Sub

Private Sub FrmMulQuery_Load(sender As Object, e As EventArgs) Handles MyBase.Load

'操作符
cmbOperation1.Items.Add("=")
cmbOperation1.Items.Add("<")
cmbOperation1.Items.Add(">")
cmbOperation1.Items.Add("<>")

cmbOperation2.Items.Add("=")
cmbOperation2.Items.Add("<")
cmbOperation2.Items.Add(">")
cmbOperation2.Items.Add("<>")

cmbOperation3.Items.Add("=")
cmbOperation3.Items.Add("<")
cmbOperation3.Items.Add(">")
cmbOperation3.Items.Add("<>")
'组合关系
cmbRelation1.Items.Add("与")
cmbRelation1.Items.Add("或")
cmbRelation2.Items.Add("与")
cmbRelation2.Items.Add("或")
End Sub
'声明一个函数用来将控件中的文字转换为数据库中需要的英文子弹名
Protected Overridable Function GetEnglish(cmbString As String) As String
Return ""
End Function
'声明一个函数用来获取所查的表
Public Overridable Function GetTable() As String
Return ""
End Function<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span>

我是通过存储过程来完成复杂的组合查询,接下里看如何写存储过程:

ALTER PROCEDURE [dbo].[Proc_MulQuery]
@cmbField1 varchar(10),
@cmbOperation1 varchar(10),
@txtContent1 varchar(10),
@cmbField2 varchar(10),
@cmbOperation2 varchar(10),
@txtContent2 varchar(10),
@cmbField3 varchar(10),
@cmbOperation3 varchar(10),
@txtContent3 varchar(10),
@cmbRelation1 varchar(10),
@cmbRelation2 varchar(10),
@tableName varchar(20)
AS
declare @TempSql varchar(500)--临时存放sql语句,用于查询所需内容
BEGIN
SET @TempSql='SELECT * FROM '+@tableName +' WHERE ' +@cmbField1 +@cmbOperation1+char(39) + @txtContent1 + char(39)
if @cmbRelation1 != ''
BEGIN
SET @TempSql=@TempSql+@cmbRelation1+CHAR(32)+@cmbField2 +@cmbOperation2+CHAR(39)+@txtContent2+CHAR(39)
if @cmbRelation2!= ''
BEGIN
SET @TempSql=@TempSql+@cmbRelation2+CHAR(32)+@cmbField3+@cmbOperation3+CHAR(39)+@txtContent3+CHAR(39)
END
END
EXECUTE(@TempSql)
END
接下来就是子窗体如何继承:

机房重构——组合查询
刚开始确实认为无从下手,但当真正开始做之后,一切好像都是纸老虎了,我们的担心其实只是心里的胆怯,放手去做,不要担心,一切都不是问题。