【机房系统知识小结点系列】之组合查询

时间:2022-09-16 11:05:20

    在做机房系统的时候,很多的同学把“组合查询”的功能放在最后来实现。分析原因,主要是头脑中思绪万千,不知道该如何下手而已。下面呢?我就来帮您屡一下头绪。

    先来看一下我们的界面

【机房系统知识小结点系列】之组合查询

    U层是负责显示数据和接收用户输入的数据,以及数据的返回。

   功能设计:

一、根据“组合条件”是否存在,可以分成四种方案,每种方案有着不同的功能。

二、把用户输入的信息,原封不动的存放在一个“容器”中。

三、将“容器”整体作为“参数”,传递给B层,并接受B层返回的结果。

四、将返回的结果,以“表格”的形式显示出来?(略)

Public Class frmQueryStudentOnlineLogFuzzy‘查询学生上机记录()
Private Sub btnQuery_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuery.Click

'功能设计一:根据组合关系的选定,判定其余的功能的可用性,以及是否清空。
If Trim(combRelation1.Text) = "" Then '若第二个组合关系为空时,则第三行不可用,且清空

combFileName2.Text = ""
combOperate2.Text = ""
txtContext2.Text = ""
combFileName2.Enabled = False
combOperate2.Enabled = False
txtContext2.Enabled = False

combRelation2.Enabled = False

combFileName3.Text = ""
combOperate3.Text = ""
txtContext3.Text = ""
combFileName3.Enabled = False
combOperate3.Enabled = False
txtContext3.Enabled = False

Else '若第二个组合关系可用,判断额第二个组合条件是否可用
combRelation2.Enabled = True
combFileName2.Enabled = True
combOperate2.Enabled = True
txtContext2.Enabled = True

If Trim(combRelation2.Text) = "" Then '若第二个组合关系为空,则第三行不可用,且为空
combFileName3.Text = ""
combOperate3.Text = ""
txtContext3.Text = ""
combFileName3.Enabled = False
combOperate3.Enabled = False
txtContext3.Enabled = False
Else '若第二个组合关系不为空,则第二行可用
combFileName3.Enabled = True
combOperate3.Enabled = True
txtContext3.Enabled = True

End If
End If


'功能设计二:把信息存储在实例类中,传递至BLL层,共参数调用
Dim enGroup As New Entity.GroupEntity '组合实体类,将需要传递的参数作为其属性
'第一行组合关系的选择
enGroup.FileName1 = Trim(combFileName1.Text.ToString)
enGroup.Operate1 = Trim(combOperate1.Text.ToString)
enGroup.Content1 = Trim(txtContext1.Text.ToString)

'第二行组合关系的选择
enGroup.Relation1 = Trim(combRelation1.Text.ToString)
enGroup.FileName2 = Trim(combFileName2.Text.ToString)
enGroup.Operate2 = Trim(combOperate2.Text.ToString)
enGroup.Content2 = Trim(txtContext2.Text.ToString)

'第三行组合关系的选择
enGroup.Relation2 = Trim(combRelation2.Text.ToString)
enGroup.FileName3 = Trim(combFileName3.Text.ToString)
enGroup.Operate3 = Trim(combOperate3.Text.ToString)
enGroup.Content3 = Trim(txtContext3.Text.ToString)

'功能设计三:传递参数+接受返回结果
Dim bllOnlineManage As New BLL.OnlineManageBLL
Dim dtOnlineLog As New DataTable
Dim enConfiguration As New Configuration
dtOnlineLog = bllOnlineManage.QueryStudentOnlineLogFuzzy(enGroup)
Call enConfiguration.DgvwStyle(dgvwQueryStudentOnlineLogFuzzy, dtOnlineLog)

End Sub
End Class


B层负责:对数据业务逻辑处理,起到了数据交换中承上启下的作用。

功能设计:

一、将U层传递来的“参数”,进行处理。(如何处理呢?需要设定一个“转换函数”)

二、将处理后的东西,传递给D层,并接受D层返回的结果。


Public Class OnlineManageBLL '上机记录,管理

Public Function QueryStudentOnlineLogFuzzy(ByVal enGroup As Entity.GroupEntity) As DataTable '按照组合方式,查询学生的上机记录(模糊查询)
Dim enConfigurationBLL As New ConfigurationBLL
'第一行组合关系的选择
enGroup.FileName1 = enConfigurationBLL.ChangeFileName(enGroup.FileName1)
enGroup.Operate1 = enConfigurationBLL.ChangeOperate(enGroup.Operate1)
enGroup.Content1 = enConfigurationBLL.ChangeContext(enGroup.Content1)

'第二行组合关系的选择
enGroup.Relation1 = enConfigurationBLL.ChangeRelation(enGroup.Relation1)
enGroup.FileName2 = enConfigurationBLL.ChangeFileName(enGroup.FileName2)
enGroup.Operate2 = enConfigurationBLL.ChangeOperate(enGroup.Operate2)
enGroup.Content2 = enConfigurationBLL.ChangeContext(enGroup.Content2)

'第三行组合关系的选择
enGroup.Relation2 = enConfigurationBLL.ChangeRelation(enGroup.Relation2)
enGroup.FileName3 = enConfigurationBLL.ChangeFileName(enGroup.FileName3)
enGroup.Operate3 = enConfigurationBLL.ChangeOperate(enGroup.Operate3)
enGroup.Content3 = enConfigurationBLL.ChangeContext(enGroup.Content3)

Dim dalOnlineLog As New DAL.OnlineLogDAL
Dim dtOnlineLog As New DataTable
dtOnlineLog = dalOnlineLog.QueryStudentOnlineLogFuzzyByGroup(enGroup)
If dtOnlineLog.Rows.Count > 0 Then '若存在符合条件的记录, 则
Return dtOnlineLog
Else '若不存在符合条件的记录,则
Throw New Exception("不存在符合条件的记录!")
End If
End Function
End Class

B层中设定一个专门用于存放,配置信息的类ConfigurationBLL,其中放置了四个“转换函数”

ChangFileName’字段名的转换函数

ChangOperate‘操作符的转换函数

ChangContent’要查询内容的转换函数

ChangRelation‘关系的转换函数



'BLL层的配置文件,用于存放一些共用的功能
Public Class ConfigurationBLL
    '设定转换函数,目的:实现的是将所有的选择点都能有一个默认值,若均无选择,则默认值为1=1 and 1=1 and 1=1
    '设置组合查询中的转化字符串的四个函数
    Public Function ChangeFileName(ByVal str As String) As String '字段名的转换函数
        Select Case str
            Case "卡号"
                Return "cardID"
            Case "姓名"
                Return "stuID"
            Case "上机日期"
                Return "onlineDateTime"
            Case "房间号"
                Return "computerName"
            Case Else '包含str = ""的情况 
                Return "1"
        End Select
    End Function

    Public Function ChangeOperate(ByVal str As String) As String  '操作符的转换函数
        Select Case str
            Case "大于"
                Return ">"
            Case "小于"
                Return "<"
            Case "等于"
                Return "="
            Case "不等于"
                Return "<>"
            Case Else '包含str=""的情况
                Return "="
        End Select
    End Function

    Public Function ChangeContext(ByVal str As String) As String '要查询内容的转换函数
        If str = "" Then
            Return "1"
        Else
            Return str
        End If
    End Function

    Public Function ChangeRelation(ByVal str As String) As String '关系的转换函数
        Select Case str
            Case ""
                Return "and"
            Case "与"
                Return "and"
            Case "或" '包含str="" 和"与"的情况
                Return "or"
        End Select
    End Function
End Class

D层:负责对数据的操作。简单的说法就是实现对数据表的Select,Insert,Update,Delete的操作。

功能设计:

一、仅用一条SQL语句+参数查询的方式,对数据库中的数据进行操作。

Imports Entity
Imports System.Data.SqlClient

Public Class OnlineLogDAL '上机记录
Public Function QueryStudentOnlineLogFuzzyByGroup(ByVal enGroup As Entity.GroupEntity) As DataTable '按照组合查询的方式,查询学生的上机信息
Dim sqlserver As String = "SELECT cardID as 卡号,stuID as 学号, onlineDateTime as 上机日期, computerName as 机器名 FROM V_QueryStudentOnlineLogFuzzy WHERE " & enGroup.FileName1 & enGroup.Operate1 & "@Context1 " & " " & enGroup.Relation1 & " " & enGroup.FileName2 & enGroup.Operate2 & "@Context2 " & " " & enGroup.Relation2 & " " & enGroup.FileName3 & enGroup.Operate3 & "@Context3 "

Dim paras As SqlParameter() = {New SqlParameter("@FileName1", enGroup.FileName1),
New SqlParameter("@Operate1", enGroup.Operate1),
New SqlParameter("@Context1", enGroup.Content1),
New SqlParameter("@Relation1", enGroup.Relation1),
New SqlParameter("@FileName2", enGroup.FileName2),
New SqlParameter("@Operate2", enGroup.Operate2),
New SqlParameter("@Context2", enGroup.Content2),
New SqlParameter("@Relation2", enGroup.Relation2),
New SqlParameter("@FileName3", enGroup.FileName3),
New SqlParameter("@Operate3", enGroup.Operate3),
New SqlParameter("@Context3", enGroup.Content3)
}
Dim dtOnlineLog As New DataTable
Dim sqlhelper As New sqlHelper
dtOnlineLog = sqlhelper.ExecuteQuery(sqlserver, CommandType.Text, paras)
Return dtOnlineLog
End Function
End Class


总结:就像机房系统中的功能设计一样,U、B、D层各司其职,不要把所有的功能都混为一谈。当你对某种东西理不清头绪的候,首先要在心理肯定自己“一切问题都不是问题,问题就是怎么办?!”其次,一定要把所有的问题都一一列出来,逐一攻克。