zoukankan      html  css  js  c++  java
  • 机房重构——组合查询

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

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


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

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


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



  • 相关阅读:
    单元测试课堂练习
    软件工程个人作业02
    软件工程个人作业01
    构建之法提问
    大道至简-第七、八章-心得体会
    06-接口与继承 动手动脑及验证
    大道至简-第六章-心得体会
    随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中。
    大道至简-第五章-心得体会
    字符串加密
  • 原文地址:https://www.cnblogs.com/zsswpb/p/5771658.html
Copyright © 2011-2022 走看看