表单控件的副产品——查询控件

您是怎么处理查询的问题?我是又写了一个控件来搞定的。

查询控件

温故而知新
能自己“跑”的表单控件,思路,雏形,源码。vs2005版本

表单控件续(1)——应用接口来简化和分散代码

    当初在写表单控件的时候,突然想到,这个表单控件稍微修改一下不就是一个查询控件了吗?

    那么查询控件需要做的什么事情呢?
         1、自己描绘控件,比如能够自己添加文本框、下拉列表框这一类的控件。
         2、可以自己获取用户输入的信息,根据查询方式组合where 后面的 SQL语句 。

    是不是和表单控件很像呢?

    在表单控件的SaveData()里面我们可以得到字段名称和对应的用户输入的信息,那么我们就可以写成这种方式。
        for (int i = 0; i < info.Length; i++)
            {

                iCntl = this.FindControl("c_" + info[i].ColSysName) as IGetControlValue;
                if (iCntl != null)
                    query = ColSysName + "like '%" + iCntl.GetControlValue() + "%'";
     
            }

    当然并不是所有的查询都是只用 like 就可以搞定的,这里需要一个查询方式的属性,于是我们可以扩展一下ControlInfos 加一个属性(FindKind),用来记录查询方式。

    然后根据这个属性,我们就可以来组合SQL语句了,准确的说是where 后面的SQL语句。目前的方法还是需要使用case 。

string str = iCntl.GetControlValue()
switch ( infos[i].FindKind)
            {
                case 1:
                    if (DoubleType.FromString(inputInfo[i]) != 0.0)
                    {
                        str2 = " [" + info[i].ColSysName + "]=" + str;
                    }
                    goto Label_0615;

                case 2:
                    str2 = " [" + info[i].ColSysName + "]='" + str + "'";
                    goto Label_0615;

                case 3:
                    str2 = " [" + info[i].ColSysName + "] like '%" + str + "%'";
                    goto Label_0615;

                case 4:
                    str2 = " [" + info[i].ColSysName + "] like '" + str + "%'";
                    goto Label_0615;

                case 5:
                    str2 = " [" + info[i].ColSysName + "] like '%" + str + "'";
                    goto Label_0615;

                case 6:
                    str2 = " [" + info[i].ColSysName + "] like '" + str + "'";
                    goto Label_0615;

                case 11:
                    str2 = " [" + info[i].ColSysName + "]>'" + str + "'";
                    goto Label_0615;

                case 12:
                    str2 = " [" + info[i].ColSysName + "]<'" +str + "'";
                    goto Label_0615;

                case 13:
                    str2 = " [" + info[i].ColSysName + "]>='" +str + "'";
                    goto Label_0615;

                case 14:
                    str2 = " [" + info[i].ColSysName + "]<='" + str + "'";
                    goto Label_0615;

                case 0x15:
                    strArray3 = inputInfo[i].Split(new char[] { '|' });
                    if (strArray3[0].Length != 0)
                    {
                        goto Label_04B1;
                    }
                    str2 = "";
                    goto Label_0615;

                case 0x16:
                    strArray2 = inputInfo[i].Split(new char[] { '|' });
                    if (strArray2[0].Length != 0)
                    {
                        break;
                    }
                    str2 = "";
                    goto Label_0615;

                case 0x17:
                    str3 = inputInfo[i].Replace("|", ",");
                    if (str3.Length != 0)
                    {
                        goto Label_0549;
                    }
                    str2 = "";
                    goto Label_0615;

                case 0x18:
                    str4 = inputInfo[i].Replace(",", "','").Replace("|", "','");
                    if (str4.Length != 0)
                    {
                        goto Label_05CA;
                    }
                    str2 = "";
                    goto Label_0615;

                case 30:
                    str2 = "";
                    goto Label_0615;

                default:
                    goto Label_0615;
            }

不好意思,原来使用vb.net来写的,这个是用Reflector反编译的,不知道为什么还给弄出来goto了。看来我写的代码不用混淆也可以了,我自己都看不懂了。还是发一个“原版”的吧。

表单控件的副产品——查询控件表单控件的副产品——查询控件 Private Sub btn_click()Sub btn_click(ByVal Sender As Object, ByVal E As EventArgs)
表单控件的副产品——查询控件        'MyBase.Context.Response.Write("内部事件
")
表单控件的副产品——查询控件        Dim colInfo() As ColumnsInfo = _Col.SetColumnsInfos()
表单控件的副产品——查询控件        Dim inputInfo() As String = _Col.GetInputInfo
表单控件的副产品——查询控件
表单控件的副产品——查询控件        If inputInfo Is Nothing Then
表单控件的副产品——查询控件            System.Web.HttpContext.Current.Response.Write("_") '没有输入,或者输入有误!
表单控件的副产品——查询控件            Return
表单控件的副产品——查询控件        End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件        '调用外部事件——查询前
表单控件的副产品——查询控件        OnBtnClick(Sender, E)
表单控件的副产品——查询控件
表单控件的副产品——查询控件
表单控件的副产品——查询控件        '字段的查询方式。1:= int;2:=string; 3:like %n%;  4:like n%; 5:like %n ;6:like n;11:> string;12:< string;13:>= string;14: <= string
表单控件的副产品——查询控件        Dim find As String = ""
表单控件的副产品——查询控件        Dim tmp As String = ""
表单控件的副产品——查询控件        Dim i As Int32
表单控件的副产品——查询控件        For i = 0 To colInfo.Length - 1
表单控件的副产品——查询控件            If inputInfo(i).Length > 0 And inputInfo(i) <> "-999999" And inputInfo(i) <> "_n_" Then
表单控件的副产品——查询控件                '输入了信息,组成查询条件
表单控件的副产品——查询控件                Select Case colInfo(i).SearchKind
表单控件的副产品——查询控件                    Case 1      '= int
表单控件的副产品——查询控件                        If inputInfo(i) <> 0 Then
表单控件的副产品——查询控件                            tmp = " [" & colInfo(i).ColSysName & "]=" & inputInfo(i)
表单控件的副产品——查询控件                        End If
表单控件的副产品——查询控件                    Case 2      '= string
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "]='" & inputInfo(i) & "'"
表单控件的副产品——查询控件                    Case 3      'like %n%
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "] like '%" & inputInfo(i) & "%'"
表单控件的副产品——查询控件                    Case 4      'like n%
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "] like '" & inputInfo(i) & "%'"
表单控件的副产品——查询控件                    Case 5      'like %n
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "] like '%" & inputInfo(i) & "'"
表单控件的副产品——查询控件                    Case 6      'like n
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "] like '" & inputInfo(i) & "'"
表单控件的副产品——查询控件                    Case 11      '> string
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "]>'" & inputInfo(i) & "'"
表单控件的副产品——查询控件                    Case 12      '< string
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "]<'" & inputInfo(i) & "'"
表单控件的副产品——查询控件                    Case 13      '>= string
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "]>='" & inputInfo(i) & "'"
表单控件的副产品——查询控件                    Case 14      '<= string
表单控件的副产品——查询控件                        tmp = " [" & colInfo(i).ColSysName & "]<='" & inputInfo(i) & "'"
表单控件的副产品——查询控件                    Case 22      'between int
表单控件的副产品——查询控件                        Dim aa() As String = inputInfo(i).Split("|")
表单控件的副产品——查询控件                        If aa(0).Length = 0 Then
表单控件的副产品——查询控件                            tmp = ""
表单控件的副产品——查询控件                        Else
表单控件的副产品——查询控件                            If aa(1).Length = 0 Then
表单控件的副产品——查询控件                                aa(1) = aa(0)
表单控件的副产品——查询控件                            End If
表单控件的副产品——查询控件                            tmp = " [" & colInfo(i).ColSysName & "] between " & aa(0) & " and " & aa(1)
表单控件的副产品——查询控件                        End If
表单控件的副产品——查询控件                    Case 21      'between string
表单控件的副产品——查询控件                        Dim aa() As String = inputInfo(i).Split("|")
表单控件的副产品——查询控件                        If aa(0).Length = 0 Then
表单控件的副产品——查询控件                            tmp = ""
表单控件的副产品——查询控件                        Else
表单控件的副产品——查询控件                            If aa(1).Length = 0 Then
表单控件的副产品——查询控件                                aa(1) = aa(0)
表单控件的副产品——查询控件                            End If
表单控件的副产品——查询控件                            tmp = " [" & colInfo(i).ColSysName & "] between '" & aa(0) & "' and '" & aa(1) & "'"
表单控件的副产品——查询控件                        End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件                    Case 23     'col in () 多选查询 数字方式
表单控件的副产品——查询控件                        Dim a23 As String = inputInfo(i).Replace("|", ",")
表单控件的副产品——查询控件                        'System.Web.HttpContext.Current.Response.Write(a23)
表单控件的副产品——查询控件                        If a23.Length = 0 Then
表单控件的副产品——查询控件                            tmp = ""
表单控件的副产品——查询控件                        Else
表单控件的副产品——查询控件                            tmp = " [" & colInfo(i).ColSysName & "] in (" & a23 & ")"
表单控件的副产品——查询控件                        End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件                    Case 24     'col in () 多选查询 字符串方式
表单控件的副产品——查询控件                        Dim a23 As String = inputInfo(i).Replace(",", "','")
表单控件的副产品——查询控件                        a23 = a23.Replace("|", "','")
表单控件的副产品——查询控件                        'System.Web.HttpContext.Current.Response.Write(a23)
表单控件的副产品——查询控件                        If a23.Length = 0 Then
表单控件的副产品——查询控件                            tmp = ""
表单控件的副产品——查询控件                        Else
表单控件的副产品——查询控件                            tmp = " [" & colInfo(i).ColSysName & "] in ('" & a23 & "')"
表单控件的副产品——查询控件                        End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件                    Case 30     '不生成查询条件
表单控件的副产品——查询控件                        tmp = ""
表单控件的副产品——查询控件
表单控件的副产品——查询控件                End Select
表单控件的副产品——查询控件
表单控件的副产品——查询控件                '加到查询条件里面
表单控件的副产品——查询控件                If tmp.Length > 0 Then
表单控件的副产品——查询控件                    If find.Length > 0 Then
表单控件的副产品——查询控件                        find &= " and " & tmp
表单控件的副产品——查询控件                    Else
表单控件的副产品——查询控件                        find = tmp
表单控件的副产品——查询控件                    End If
表单控件的副产品——查询控件                End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件            End If
表单控件的副产品——查询控件            tmp = ""
表单控件的副产品——查询控件        Next
表单控件的副产品——查询控件
表单控件的副产品——查询控件        If _OutSearch.Length > 0 Then
表单控件的副产品——查询控件            '有外部的查询条件,加到 find 里面
表单控件的副产品——查询控件            If find.Length > 0 Then
表单控件的副产品——查询控件                find = find & " and " & _OutSearch
表单控件的副产品——查询控件            Else
表单控件的副产品——查询控件                find = _OutSearch
表单控件的副产品——查询控件            End If
表单控件的副产品——查询控件        End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件        'System.Web.HttpContext.Current.Response.Write(find)
表单控件的副产品——查询控件        If Not _PageTurn Is Nothing Then
表单控件的副产品——查询控件            If _PageTurn.SetQuery.Length = 0 Then
表单控件的副产品——查询控件                _PageTurn.SqlQuery = find
表单控件的副产品——查询控件            Else
表单控件的副产品——查询控件                If find.Length = 0 Then
表单控件的副产品——查询控件                    _PageTurn.SqlQuery = _PageTurn.SetQuery
表单控件的副产品——查询控件                Else
表单控件的副产品——查询控件                    _PageTurn.SqlQuery = _PageTurn.SetQuery & " and " & find
表单控件的副产品——查询控件                End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件            End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件            _Search = find
表单控件的副产品——查询控件            _PageTurn.SqlQuery = find
表单控件的副产品——查询控件            _PageTurn.CreateQuery()
表单控件的副产品——查询控件            _PageTurn.BindFirstPage()
表单控件的副产品——查询控件
表单控件的副产品——查询控件        End If
表单控件的副产品——查询控件
表单控件的副产品——查询控件       
表单控件的副产品——查询控件    End Sub
表单控件的副产品——查询控件#End Region



    当然这里有一个适用范围和习惯的问题。我是习惯使用DataTable来装载数据,而填充 DataTable 需要SQL语句,那么我只需要得到 where 后面的部分,查询的功能就可以实现了,所以对于我来说,查询控件能够输出像 "myName like '%jyk%'" 这样的字符串就已经够用了。

    还记得分页控件吗?分页控件有一个属性:myPage.SqlQuery = "";这个属性就是用来给分页控件设置查询条件的,正好可以查询控件对应上,这两个控件一配合起来,查询、分页就变得非常的简单了。

    对其他的查询方式的支持的考虑    
    我没有用过使用实体类来显示数据的方式,所以也不知道对于实体类来说,查询是怎么做的,不过这个查询控件至少可以提供字段名和对应的值,应该是可以用得上的吧。

    可能有些人喜欢使用存储过程来返回记录,查询条件也会写在存储过程里面,那么在调用存储过程的时候需要传递存储过程的参数,这种情况,查询控件也可以帮上点忙吧。

    抽象
    这样出现了一个问题,由于两个控件比较象,但是总不能等表单控件写好了,然后复制粘贴,再改一改,查询控件就诞生了吧。我们是不是应该对于相同的地方进行“抽象”呢,把相同的代码放在基类里面。可能你会说,就两种情况,有必要抽象吗,还弄一个基类出来是不是多此一举呢?我的回答是:很有必要。除非这两个控件件写完了之后就再也不需要修改了。

    只是单独写很好写,不用顾忌其他,但是要考虑到其他的用法的话,那就要十分小心了。


上一篇:Linux C 编程学习第四天_循环语句_while_do/while_for_goto


下一篇:Go流程控制