实现任意组合查询

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

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

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

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

实现任意组合查询_第1张图片

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

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

符号: =  > <   <>

组合关系:与 或

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

具体的实现:

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

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

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

Imports System.Data  
Imports System  
Imports Entity  
Public Class FrmWorkLog  
    Dim enGroup As New GroupStringEntity  
  
    Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click  
  
        '利用 enGroup传递参数 
         'enGroup是实体类,将需要传递的参数设置成为类的属性
        '转化字符串的函数  
        '进行了第一行选择  
        enGroup.G_FileName1 = ChangeFile(cmbFileName1.SelectedItem.ToString)  
        enGroup.G_Operate1 = ChangeOperate(cmbOperate1.SelectedItem.ToString)  
        enGroup.G_Context1 = ChangeContext(txtFileName1.Text.ToString)  
        '第二行选择和关系  
        enGroup.G_FileName2 = ChangeFile(cmbFileName2.Text.ToString)  
        enGroup.G_Operate2 = ChangeOperate(cmbOperate2.Text.ToString)  
        enGroup.G_Context2 = ChangeContext(txtFileName1.Text.ToString)  
        enGroup.G_RelationA = ChangeRelation(cmbRelation1.Text.ToString)  
        '第三行选择和关系  
        enGroup.G_FileName3 = ChangeFile(cmbFileName3.Text.ToString)  
        enGroup.G_Operate3 = ChangeOperate(cmbOperate3.Text.ToString)  
        enGroup.G_Context3 = ChangeContext(txtFileName1.Text.ToString)  
        enGroup.G_RelationB = ChangeRelation(cmbRelation2.Text.ToString)  
  
    End Sub  
End Class  

其中转换函数的代码:

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


Public Module ModelVariable

    '设置组合查询中转化字符串的四个函数
    Public Function ChangeContext(ByVal strName As String) As String
        If strName = "" Then
            Return "1"
        Else
            Return strName
        End If
    End Function
    Public Function ChangeOperate(ByVal strName As String) As String
        If strName = "" Then
            Return "="
        Else
            Return strName
        End If
    End Function
    Public Function ChangeRelation(ByVal strName As String) As String
        Select Case strName
            Case "与"
                Return "and"
            Case "或"
                Return "or"
            Case Else
                Return "and"
        End Select
    End Function
    Public Function ChangeFile(ByVal strName As String) As String
        Select Case strName
            Case "用户名"
                Return "UserID"
            Case "用户级别"
                Return "UserLevel"
            Case "登录时间"
                Return "WorkTime"
            Case "登录日期"
                Return "WorkDate"
            Case "机房号"
                Return "PC"
            Case Else
                Return "1"
        End Select

    End Function
End Module



第二步:设置SQL查询语句,在这里使用的是存储过程

create proc PROC_WorkLog   
 --这里定义变量,可以通过外界依次传入参数,与变量匹配  
  @File varchar(10),   --字段0  
 @Operator varchar(2),--操作符0  
 @Context varchar(10),--内容0  
   
 @Relation1 varchar(3),--关系1  
 @File1 varchar(10), --字段1  
 @Operator1 varchar(2), --操作符1  
 @Context1 varchar(10),--内容1  
   
 @Relation2 varchar(3),--关系2  
 @FIle2 varchar(10),  --字段2  
 @Operator2 varchar(2),--操作符2  
 @Context2 varchar(10)--内容2  
AS  
 --定义临时变量  
  declare @TempSql varchar(500)  
begin  
   --char(32)是空格,char(39)是单引号  
 set @TempSql='select * from T_UserWorklog where '+char(32)  
+@File+@Operator+char(39)+@Context+char(39)  
+char(32)+@Relation1+char(32)  
+@File1+@Operator1+char(39)+@Context1+char(39)  
+char(32)+@Relation2+char(32)  
+@FIle2+@Operator2+char(39)+@Context2+char(39)  
 --执行这个存储过程的语句。  
 execute (@tempsql)  
end


第三步:实现查询


   
   
   
   


Imports System.Data             
Imports System.Data.SqlClient   
Imports Entity  
Imports DateBaseHelper  
Public Class WorkLogDAL  
  
    '**********************************************  
    ' <summary>  
    ' 得到用户工作记录  
    ' </summary>  
    '<param name="enGroup()"><>GroupStringEntity实体类的几个对象,通过UI层给对象的属性赋值</param>  
    ' <returns>  
    ' datatable 得到用户工作记录记录集  
    ' </returns>  
    '**********************************************  
    Public Function CheckWorkLog(ByVal enGroup As GroupStringEntity) As System.Data.DataTable   
  
        '设置存储过程的参数:名字和传入的参数  
        Dim strProc As String = "PROC_WorkLog"  
        Dim sqlParameter() As SqlParameter = {  
          New SqlParameter("@File", enGroup.G_FileName1),  
          New SqlParameter("@Operator", enGroup.G_Operate1),  
          New SqlParameter("@Context", enGroup.G_Context1),  
          New SqlParameter("@File1", enGroup.G_FileName2),  
          New SqlParameter("@Operator1", enGroup.G_Operate2),  
          New SqlParameter("@Context1", enGroup.G_Context2),  
          New SqlParameter("@Relation1", enGroup.G_RelationA),  
          New SqlParameter("@File2", enGroup.G_FileName3),  
          New SqlParameter("@Operator2", enGroup.G_Operate3),  
          New SqlParameter("@Context2", enGroup.G_Context3),  
          New SqlParameter("@Relation2", enGroup.G_RelationB)  
      }  
        '打开数据库 执行存储过程 关闭数据库 返回值  
        '其中DBHelper主要是对数据库的操作的类
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

Imports System.Data  
Imports System.Data.SqlClient  
Imports System.Data.OleDb  
Imports System.Text  
Imports System.Configuration  
  
Public Class DBHelper  
    Private myConnection As New SqlConnection '表示数据连接控件  
    Private CmdString As String       '表示SQL语句命令  
    Private Cmd As New SqlCommand     '表示SQL命令语句的执行  
  
    '**********************************************  
    ' <summary>  
    ' 打开数据库  
    ' </summary>  
    ' <returns>  
    ' Boolean true:连接成功  false:连接失败  
    ' </returns>  
    '**********************************************  
    Public Function Open() As Boolean  
        '通过读取app来获得连接字符串  
        Dim myConnectionString As String = ConfigurationManager.AppSettings("Connstr")  '表示数据字符串  
        '传入连接字符串  
        myConnection.ConnectionString = myConnectionString  
        Try  
            myConnection.Open()  
            Return True  
        Catch ex As Exception  
            Return False  
        End Try  
    End Function  
  
    '**********************************************  
    ' <summary>  
    ' 关闭数据库  
    ' </summary>  
    '**********************************************  
    Public Sub Close()  
        Cmd.Dispose()  
        myConnection.Close()  
    End Sub  
  
    '**********************************************  
    ' <summary>  
    ' 执行有参数的存储过程  
    ' </summary>  
    ' <param name="strProc"> 存储过程名字</param>  
    '<param name="sqlParameter">存储过程需要的参数</param>  
    ' <returns>  
    ' DataTable  返回查询到的记录集  
    ' </returns>  
    '**********************************************  
    Public Function ExecuteProcData(ByVal strProc As String, ByVal sqlParameter As SqlParameter()) As DataTable  
  
        Dim da As New SqlDataAdapter(Cmd)  
        Dim ds As New DataSet  
  
        '设置sqlcommand按钮  
        '连接数据库将存储名称和参数传递给cmd  
        Cmd.Connection = myConnection  
        '指明为存储过程  
        Cmd.CommandType = CommandType.StoredProcedure  
        Cmd.CommandText = strProc  
        Cmd.Parameters.AddRange(sqlParameter)  
  
        da.Fill(ds)  
  
        Try  
            Return ds.Tables(0)  
        Catch e As Exception  
            Return Nothing  
        End Try  
    End Function</pre><pre name="code" class="vb">End class</pre><br>  
End Class




3
0

你可能感兴趣的:(组合查询,机房收费系统)