实现任意组合查询

组合查询之所以很让人觉得困难就是因为组合的情况特别的多,组合情况特别的多之后就很可能会让我们在分析的时候漏掉某种情况;除此之外,我们的代码量和工作量也会因此变的特别的大。

 

那么我们不妨转换一种思路,组合最让人望而却步的地方是组合情况特别的多,但是如果只有一种情况,那么它的实现其实是很简单的。从这个角度来想,我如果将所有的查询都看做一种情况来处理,而所谓的不同组合就是这一种情况几个特定的几个地方的不同选择而已那么我们处理起来是不是会变的很简单

单纯的说可能觉得还是不理解,下面就用代码来实现一下我所说的“所有的查询都看做一种情况来处理”。

 

下面是机房收费系统中查询窗体

实现的功能是用户通过选择字段名和字段满足的条件来查询想要查询到的内容,其中字段最多可以由三条组合起来

字段名:用户ID  用户级别 机房号  登录时间 登录日期

符号: =  > <   <>

组合关系:与 或

从上面的介绍中可以看出用户可以进行的选择是很多的,我所谓的所有的查询看做一种情况来处理就是将选择全部写在一句话中,这样子用户能够做的选择就成为了这一句话中的改变点。也就是说我将能够改变的点全部封装在了一句话中,这样子我们所做的就是传递每次的改变点的内容,而不用想那么多的组合了

具体的实现:

具体实现大体上分成两步;

第一步:传递改变点,也就是传递参数

只是贴上一些重要部分的代码:

 

[vb] view plaincopyprint?

  1. Imports System.Data
  2. Imports System
  3. Imports Entity
  4. Public Class FrmWorkLog
  5.     Dim enGroup As New GroupStringEntity
  6.     Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
  7.         ‘利用 enGroup传递参数
[vb] view plaincopyprint?

  1.      ‘enGroup是实体类,将需要传递的参数设置成为类的属性
  2.     ‘转化字符串的函数
  3.     ‘进行了第一行选择
  4.     enGroup.G_FileName1 = ChangeFile(cmbFileName1.SelectedItem.ToString)
  5.     enGroup.G_Operate1 = ChangeOperate(cmbOperate1.SelectedItem.ToString)
  6.     enGroup.G_Context1 = ChangeContext(txtFileName1.Text.ToString)
  7.     ‘第二行选择和关系
  8.     enGroup.G_FileName2 = ChangeFile(cmbFileName2.Text.ToString)
  9.     enGroup.G_Operate2 = ChangeOperate(cmbOperate2.Text.ToString)
  10.     enGroup.G_Context2 = ChangeContext(txtFileName1.Text.ToString)
  11.     enGroup.G_RelationA = ChangeRelation(cmbRelation1.Text.ToString)
  12.     ‘第三行选择和关系
  13.     enGroup.G_FileName3 = ChangeFile(cmbFileName3.Text.ToString)
  14.     enGroup.G_Operate3 = ChangeOperate(cmbOperate3.Text.ToString)
  15.     enGroup.G_Context3 = ChangeContext(txtFileName1.Text.ToString)
  16.     enGroup.G_RelationB = ChangeRelation(cmbRelation2.Text.ToString)
  17. End Sub
  18. Class

 

其中转换函数的代码:

这一部分先要实现的是将所有的选择点都能有一个默认值,也就是说如果我们没有选择,那么我会就会将我们默认的设置作为我们这个改变点上的内容,所以这一句话的默认值是:1=1 and 1=1 and 1=1

[vb] view plaincopyprint?

  1. <pre name=”code” class=”vb”>Public Module ModelVariable
  2.     ‘设置组合查询中转化字符串的四个函数
  3.     Public Function ChangeContext(ByVal strName As String) As String
  4.         If strName = “” Then
  5.             Return “1”
  6.         Else
  7.             Return strName
  8.         End If
  9.     End Function
  10.     Public Function ChangeOperate(ByVal strName As String) As String
  11.         If strName = “” Then
  12.             Return “=”
  13.         Else
  14.             Return strName
  15.         End If
  16.     End Function
  17.     Public Function ChangeRelation(ByVal strName As String) As String
  18.         Select Case strName
  19.             Case “与”
  20.                 Return “and”
  21.             Case “或”
  22.                 Return “or”
  23.             Case Else
  24.                 Return “and”
  25.         End Select
  26.     End Function
  27.     Public Function ChangeFile(ByVal strName As String) As String
  28.         Select Case strName
  29.             Case “用户名”
  30.                 Return “UserID”
  31.             Case “用户级别”
  32.                 Return “UserLevel”
  33.             Case “登录时间”
  34.                 Return “WorkTime”
  35.             Case “登录日期”
  36.                 Return “WorkDate”
  37.             Case “机房号”
  38.                 Return “PC”
  39.             Case Else
  40.                 Return “1”
  41.         End Select
  42.     End Function
  43. End Module
  44. </pre><br>
  45. <br>
  46. <pre></pre>
  47. <br>
  48. 第二步:设置SQL查询语句,在这里使用的是存储过程
  49. <p style=”margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; font-family:Arial; font-size:14px; line-height:26px”>
  50. <br>
  51. </p>
  52. <pre name=”code” class=”vb”>create proc PROC_WorkLog
  53.  –这里定义变量,可以通过外界依次传入参数,与变量匹配
  54.   @File varchar(10),   –字段0
  55.  @Operator varchar(2),–操作符0
  56.  @Context varchar(10),–内容0
  57.  @Relation1 varchar(3),–关系1
  58.  @File1 varchar(10), –字段1
  59.  @Operator1 varchar(2), –操作符1
  60.  @Context1 varchar(10),–内容1
  61.  @Relation2 varchar(3),–关系2
  62.  @FIle2 varchar(10),  –字段2
  63.  @Operator2 varchar(2),–操作符2
  64.  @Context2 varchar(10)–内容2
  65. AS
  66.  –定义临时变量
  67.   declare @TempSql varchar(500)
  68. begin
  69.    –char(32)是空格,char(39)是单引号
  70.  set @TempSql=’select * from T_UserWorklog where ‘+char(32)
  71. +@File+@Operator+char(39)+@Context+char(39)
  72. +char(32)+@Relation1+char(32)
  73. +@File1+@Operator1+char(39)+@Context1+char(39)
  74. +char(32)+@Relation2+char(32)
  75. +@FIle2+@Operator2+char(39)+@Context2+char(39)
  76.  –执行这个存储过程的语句。
  77.  execute (@tempsql)
  78. end</pre>
  79. <div><br>
  80. </div>
  81. <div><br>
  82. </div>
  83. 第三步:实现查询
[vb] view plaincopyprint?

  1. Imports System.Data
  2. Imports System.Data.SqlClient
  3. Imports Entity
  4. Imports DateBaseHelper
  5. Public Class WorkLogDAL
  6.     ‘**********************************************
  7.     ‘ <summary>
  8.     ‘ 得到用户工作记录
  9.     ‘ </summary>
  10.     ‘<param name=”enGroup()”><>GroupStringEntity实体类的几个对象,通过UI层给对象的属性赋值</param>
  11.     ‘ <returns>
  12.     ‘ datatable 得到用户工作记录记录集
  13.     ‘ </returns>
  14.     ‘**********************************************
  15.     Public Function CheckWorkLog(ByVal enGroup As GroupStringEntity) As System.Data.DataTable
  16.         ‘设置存储过程的参数:名字和传入的参数
  17.         Dim strProc As String = “PROC_WorkLog”
  18.         Dim sqlParameter() As SqlParameter = {
  19.           New SqlParameter(“@File”, enGroup.G_FileName1),
  20.           New SqlParameter(“@Operator”, enGroup.G_Operate1),
  21.           New SqlParameter(“@Context”, enGroup.G_Context1),
  22.           New SqlParameter(“@File1”, enGroup.G_FileName2),
  23.           New SqlParameter(“@Operator1”, enGroup.G_Operate2),
  24.           New SqlParameter(“@Context1”, enGroup.G_Context2),
  25.           New SqlParameter(“@Relation1”, enGroup.G_RelationA),
  26.           New SqlParameter(“@File2”, enGroup.G_FileName3),
  27.           New SqlParameter(“@Operator2”, enGroup.G_Operate3),
  28.           New SqlParameter(“@Context2”, enGroup.G_Context3),
  29.           New SqlParameter(“@Relation2”, enGroup.G_RelationB)
  30.       }
  31.         ‘打开数据库 执行存储过程 关闭数据库 返回值
[vb] view plaincopyprint?

  1. <pre name=”code” class=”vb”>        ‘其中DBHelper主要是对数据库的操作的类</pre> Dim con As New DBHelper Dim dt As DataTable con.Open() ‘执行存储过程返回datatable dt = con.ExecuteProcData(strProc, sqlParameter) con.Close() Return dt End Function End Class
  2. <pre></pre>
  3. <pre name=”code” class=”vb”><span style=”font-family: Arial, Helvetica, sans-serif;”>Imports System.Data  </span></pre><pre name=”code” class=”vb”>Imports System.Data.SqlClient
  4. Imports System.Data.OleDb
  5. Imports System.Text
  6. Imports System.Configuration
  7. Public Class DBHelper
  8.     Private myConnection As New SqlConnection ‘表示数据连接控件
  9.     Private CmdString As String       ‘表示SQL语句命令
  10.     Private Cmd As New SqlCommand     ‘表示SQL命令语句的执行
  11.     ‘**********************************************
  12.     ‘ <summary>
  13.     ‘ 打开数据库
  14.     ‘ </summary>
  15.     ‘ <returns>
  16.     ‘ Boolean true:连接成功  false:连接失败
  17.     ‘ </returns>
  18.     ‘**********************************************
  19.     Public Function Open() As Boolean
  20.         ‘通过读取app来获得连接字符串
  21.         Dim myConnectionString As String = ConfigurationManager.AppSettings(“Connstr”)  ‘表示数据字符串
  22.         ‘传入连接字符串
  23.         myConnection.ConnectionString = myConnectionString
  24.         Try
  25.             myConnection.Open()
  26.             Return True
  27.         Catch ex As Exception
  28.             Return False
  29.         End Try
  30.     End Function
  31.     ‘**********************************************
  32.     ‘ <summary>
  33.     ‘ 关闭数据库
  34.     ‘ </summary>
  35.     ‘**********************************************
  36.     Public Sub Close()
  37.         Cmd.Dispose()
  38.         myConnection.Close()
  39.     End Sub
  40.     ‘**********************************************
  41.     ‘ <summary>
  42.     ‘ 执行有参数的存储过程
  43.     ‘ </summary>
  44.     ‘ <param name=”strProc”> 存储过程名字</param>
  45.     ‘<param name=”sqlParameter”>存储过程需要的参数</param>
  46.     ‘ <returns>
  47.     ‘ DataTable  返回查询到的记录集
  48.     ‘ </returns>
  49.     ‘**********************************************
  50.     Public Function ExecuteProcData(ByVal strProc As String, ByVal sqlParameter As SqlParameter()) As DataTable
  51.         Dim da As New SqlDataAdapter(Cmd)
  52.         Dim ds As New DataSet
  53.         ‘设置sqlcommand按钮
  54.         ‘连接数据库将存储名称和参数传递给cmd
  55.         Cmd.Connection = myConnection
  56.         ‘指明为存储过程
  57.         Cmd.CommandType = CommandType.StoredProcedure
  58.         Cmd.CommandText = strProc
  59.         Cmd.Parameters.AddRange(sqlParameter)
  60.         da.Fill(ds)
  61.         Try
  62.             Return ds.Tables(0)
  63.         Catch e As Exception
  64.             Return Nothing
  65.         End Try
  66.     End Function</pre><pre name=”code” class=”vb”>End class</pre><br>
  67. End Class</pre><br>
  68. <br>
  69. <br>

标签