最近在忙着做机房收费系统,当做到组合查询的时候,发现了一个问题,那就是无法精确的返回满足查询条件的结果,具体的情况我们来看一个小例子:
首先,我们来看看数据库中要查询的表的全部记录
请注意红色方框标记的字段值,下面我们运行一下存在问题的源程序
当我设置查询条件为:卡号>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>
这样我们再来执行相同条件的查询: