机房重构——组合查询

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

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


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

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
接下来就是子窗体如何继承:


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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 34
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值