组合查询中一对单引号引起的悲剧

最近在忙着做机房收费系统,当做到组合查询的时候,发现了一个问题,那就是无法精确的返回满足查询条件的结果,具体的情况我们来看一个小例子:

首先,我们来看看数据库中要查询的表的全部记录

请注意红色方框标记的字段值,下面我们运行一下存在问题的源程序

当我设置查询条件为:卡号>23时,请注意图中蓝色方框标记的数据,显然不满足我设置的查询条件,为什么会出现这个问题呢?起初我的直觉是数据类型的问题,即字符串和数字的识别出现了问题,于是我就使用了IIF函数对文本框的内容进行判断:IIf(IsNumeric(Text1.Text), Val(Text1.Text), Text1.Text),即对text1中输入的内容进行判断,若为真则用函数Val()转化为数字类型,否则不作处理,可是发现根本没什么用。

到底是哪里出了问题呢?偶然想起了在SQL Server中写代码的时候,where子句中的条件格式,如果是字符串类型的数据我们要用一对英文状态下的单引号引起来,那么比较数据的大小当然不用单引号了,不如我们在SQL Server做一个实验:

首先我们不用单引号:

请注意图中蓝色方框标记的查询条件,23是不带单引号的,我们看到返回的结果是正确的,那么我们加上单引号再看看会有什么意想不到的结果:

大家注意返回结果中蓝色方框内的数据,和源程序中的错误结果一模一样,问题找到了,那就是我们在宿主语言VB中进行和数据库交互的时候对SQL语句的条件处理不当,才导致了查询返回不正确的结果,如何消除这个异常呢?

很简单,用一个If语句就可以搞定,下面我们来看修改后的代码:

<span style="font-size:18px">txtSQL = "select * from student_Info where "
    
    '判断各个文本框是否为空

    If Not Testtxt(Trim(Combo1.Text)) Or Not Testtxt(Trim(Combo4.Text)) Or Not Testtxt(Trim(Text1.Text)) Then
        MsgBox "查询条件不完整,请重新确认!!", vbOKOnly + vbCritical, "查询提示"
        Exit Sub
    Else
        If IsNumeric(Text1.Text) Then
            txtSQL = txtSQL & FieldName(Combo1.Text) & Combo4.Text & "" & Text1.Text & ""
        Else
            txtSQL = txtSQL & FieldName(Combo1.Text) & Combo4.Text & "'" & Text1.Text & "'"
        End If
            
    End If
 
    '利用函数判断是否是两个条件的组合查询
    If ComboInquire(Combo7.Text) Then
    '是组合查询
        If Not Testtxt(Combo2.Text) Or Not Testtxt(Combo5.Text) Or Not Testtxt(Text2.Text) Then
            MsgBox "查询条件不完整,请检查确认!!", vbOKOnly + vbCritical, "查询提示"
            Exit Sub
        Else
           Select Case Combo7.Text
           Case "与"
            If IsNumeric(Text2.Text) Then
                txtSQL = txtSQL & " And " & FieldName(Combo2.Text) & Combo5.Text & "" & Text2.Text & ""
            Else
                txtSQL = txtSQL & " And " & FieldName(Combo2.Text) & Combo5.Text & "'" & Text2.Text & "'"
            End If
           Case "或"
            If IsNumeric(Text2.Text) Then
                txtSQL = txtSQL & " Or " & FieldName(Combo2.Text) & Combo5.Text & "" & Text2.Text & ""
            Else
                txtSQL = txtSQL & " And " & FieldName(Combo2.Text) & Combo5.Text & "'" & Text2.Text & "'"
            End If
            End Select
        End If
    End If
      
    '再次判断是否是三个条件限制的组合查询
    If ComboInquire(Combo8.Text) Then
        '组合查询
        If Not Testtxt(Combo3.Text) Or Not Testtxt(Combo6.Text) Or Not Testtxt(Text3.Text) Then
            MsgBox "查询条件不完整,请检查确认!!", vbOKOnly + vbCritical, "查询提示"
            Exit Sub
        Else
           Select Case Combo8.Text
           Case "与"
           
            If IsNumeric(Text3.Text) Then
                txtSQL = txtSQL & " And " & FieldName(Combo3.Text) & Combo6.Text & "" & Text3.Text & ""
            Else
                txtSQL = txtSQL & " And " & FieldName(Combo3.Text) & Combo6.Text & "'" & Text3.Text & "'"
            End If
            
           Case "或"
           
            If IsNumeric(Text3.Text) Then
                txtSQL = txtSQL & " Or " & FieldName(Combo3.Text) & Combo6.Text & "" & Text3.Text & ""
            Else
                txtSQL = txtSQL & " And " & FieldName(Combo3.Text) & Combo6.Text & "'" & Text3.Text & "'"
            End If
            
            End Select
        End If
    End If</span>

这样我们再来执行相同条件的查询:


结果是正确的,问题被完美的解决了。其实这是个很小的问题,但是很多人并没有注意到这个问题,如果我们的机房收费系统真的投入使用,是绝对不能出现任何问题的,基本的查询都无法保证,更别谈其他的了。
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值