机房重构之组合查询

在机房重构的过程中有个难点,那就是组合查询了。

还记得在第一次桥机房的时候,组合查询我是用的字符串的拼接,当时就感觉到字符串拼接比较费劲,需要很多情况的判断然后给出拼接的方式。而且很容易出错,这次我是用的存储过程。

 PROCEDURE [dbo].[Query_OnOfftimerecord] 
@cboFieldA varchar(10),  
@cboOperatorA varchar(10),  
@txtConditionA varchar(10),  
@cboRelationA varchar(10),  
@cboFieldB varchar(10),  
@cboOperatorB varchar(10),  
@txtConditionB varchar(10),  
@cboRelationB varchar(10),  
@cboFieldC varchar(10),  
@cboOperatorC varchar(10),  
@txtConditionC varchar(10)--表名称或视图名称 

AS
declare @TempSql varchar(500)--临时存放sql语句  
--CHAR(32)是空格,CHAR(39)单引号  
BEGIN
set @TempSql='select * from CardRecord where '+CHAR(32)  
+@cboFieldA+@cboOperatorA+CHAR(39)+@txtConditionA+CHAR(39)+  
CHAR(32)+@cboRelationA+CHAR(32)+  
@cboFieldB+@cboOperatorB+CHAR(39)+@txtConditionB+CHAR(39)+  
+CHAR(32)+@cboRelationB+CHAR(32)  
+@cboFieldC+@cboOperatorC+CHAR(39)+@txtConditionC+CHAR(39)  
execute (@TempSql)  
END
<pre name="code" class="vb">
 

</pre>组合查询中所有框的值,然后以字符串拼接的形式形成SQL语句,然后执行这个SQL语句。<br /><p></p><p><span style="font-size:24px"><span style="white-space:pre"></span>他的优点是通过传递所有参数,减少了逻辑的判断。</span></p><p><span style="font-size:24px"><br /></span></p><p><span style="font-size:24px"><span style="white-space:pre"></span>只分三种情况:</span></p><p><span style="font-size:24px"><span style="white-space:pre"></span>1、只有一个条件:则后两个条件则赋值成和第一个条件一样的条件,中间用and连接。</span></p><p><span style="font-size:24px"><span style="white-space:pre"></span>2、有两个条件:则最后一个条件和倒数第二个一样,中间用and连接。</span></p><p><span style="font-size:24px"><span style="white-space:pre"></span>3、三个条件:这个就是最好的情况,不用单独判断赋值了。</span></p><p><span style="font-size:24px">UI层<span style="white-space:pre"> </span></span></p><pre name="code" class="vb"><pre name="code" class="vb">Dim c1 As String
        Dim c2 As String
        Dim c3 As String
        Dim c4 As String
        Dim c5 As String
        Dim op1 As String
        Dim op2 As String
        Dim op3 As String
        Dim con1 As String
        Dim con2 As String
        Dim con3 As String
        Select Case Comfile1.Text
            Case "卡号"
                c1 = "CardId"
            Case "学号"
                c1 = "StuID"
            Case "上机时间"
                c1 = "Ontime"
            Case "下机时间"
                c1 = "StuSex"
            Case "用户ID"
                c1 = "UserID"
            Case "状态"
                c1 = "CardState"
            Case Else
                c1 = ""
        End Select
        Select Case Comfile3.Text
            Case "卡号"
                c3 = "CardId"
            Case "学号"
                c3 = "StuID"
            Case "上机时间"
                c3 = "Ontime"
            Case "下机时间"
                c3 = "StuSex"
            Case "用户ID"
                c3 = "UserID"
            Case "状态"
                c3 = "CardState"
            Case Else
                c3 = ""
        End Select
        Select Case Comfile2.Text
            Case "卡号"
                c2 = "CardId"
            Case "学号"
                c2 = "StuID"
            Case "上机时间"
                c2 = "Ontime"
            Case "下机时间"
                c2 = "StuSex"
            Case "用户ID"
                c2 = "UserID"
            Case "状态"
                c2 = "CardState"
            Case Else
                c2 = ""
        End Select
        Select Case Comyu1.Text
            Case "与"
                c4 = "and"
            Case "或"
                c4 = "or"
            Case Else
                c4 = ""
        End Select
        Select Case Comyu2.Text
            Case "与"
                c5 = "and"
            Case "或"
                c5 = "or"
            Case Else
                c5 = ""
        End Select
        Dim bll As New BLL.OnOfftime
        Dim dt As DataTable
        op1 = Comop1.Text
        op2 = Comop2.Text
        op3 = Comop3.Text
        con1 = txttext1.Text
        con2 = txttext2.Text
        con3 = txttext3.Text
        If c4 = "" Then//如果第一个组合关系为空,则给后面两个条件的所有控件的值赋成和第一个条件一样的
            c4 = "and"
            c5 = "and"
            c2 = c1
            op2 = op1
            con2 = con1
            c3 = c1
            op3 = op1
            con3 = con1
        End If
        If c4 <> "" And c5 = "" Then//如果第一个组合关系有值,第二个没有,则把第三个条件赋成和第二个条件一样
            c3 = c2
            op3 = op2
            con3 = con2
            c5 = c4
        End If
        dt = bll.zuheQueryrecord(c1, op1, con1, c4, c2, op2, con2, c5, c3, op3, con3) 
        If dt.Rows.Count = 0 Then
            MsgBox("没有记录")
        Else
            DataGridView.DataSource = dt
        End If
    End Sub


 
 DAL层 

<pre name="code" class="vb"> Dim helper As New SqlHelper
        Dim dt As DataTable
        Dim textcmd As String = "Query_OnOfftimerecord"
        Dim sqlparmars As SqlParameter() = {New SqlParameter("@cboFieldA", c1), New SqlParameter("@cboOperatorA", c2), New SqlParameter("@txtConditionA", c3), New SqlParameter("@cboRelationA ", c4), New SqlParameter("@cboFieldB", c5), New SqlParameter("@cboOperatorB", c6), New SqlParameter("@txtConditionB", c7), New SqlParameter("@cboRelationB", c8), New SqlParameter("@cboFieldC", c9), New SqlParameter("@cboOperatorC", c10), New SqlParameter("@txtConditionC", c11)}

        dt = helper.ExecuteDataTable(textcmd, CommandType.StoredProcedure, sqlparmars)               //调用存储过程Query_OnOfftimerecord
        Return dt


 

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值