未经处理的异常在 System.Data.dll 中发生。其他信息:在应使用条件的上下文(在 ‘***‘ 附近)中指定了非布尔类型的表达式。

简介: 机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在UI层做个判断并生成查询条件strCondition。

        机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在UI层做个判断并生成查询条件strCondition。


        在机房收费系统的“联合查询”模块中出现的问题:“System.Data.SqlClient.SqlException”类型的未经处理的异常在 System.Data.dll 中发生。其他信息: 在应使用条件的上下文(在 '@strCondition' 附近)中指定了非布尔类型的表达式。


        出错的DAL层代码为:


Public Function QueryOnLineStatus(ByVal strCondition As String) As List(Of Entity.QueryOnLineStatusViewEntity) Implements IDAL.IQueryOnLineStatusView.QueryOnLineStatus
        Dim cmdText As String = "select * from QueryOnLineStatus_View where @strCondition"    '定义查询字符串(strCondition为UI层传过来的查询条件)
        Dim cmdType As CommandType = CommandType.Text                                         '定义命令类型
        Dim sqlHelper As New SqlHelper                                                        '实例化SqlHelper类
        Dim myList As List(Of Entity.QueryOnLineStatusViewEntity)
        Dim dtb As New DataTable
        Dim parameters As SqlParameter()
        parameters = {New SqlParameter("@strCondition", strCondition)}
        dtb = sqlHelper.ExecuteSelect(cmdText, cmdType, parameters)
        myList = Entity.EntityHelper.ConvertToList(Of Entity.QueryOnLineStatusViewEntity)(dtb) 'EntityHelper.ConvertToList的功能是把DataTable类型转化为泛型集合
        Return myList
    End Function


       代码里SQL语句中的strCondition是从UI层传过来的查询条件,此错误发生时,在调试中已经证明查询条件没有错误,如下图:strCondition的值为:“cardNumber='1' ”,所以整个SQL语句不就是“ select * from QueryOnLineStatus_View where cardNumber='1' ”嘛!


51.png


        最后解决这个问题的办法太出乎我的意料:把原SQL语句"select * from QueryOnLineStatus_View where @strCondition"中“where”和"@strCondition"之间的空格给去掉,将SQL语句变成"select * from QueryOnLineStatus_View where@strCondition"。


        经过一阵冥思苦想,在数据库中尝试了好多次后,才明白这到底是为什么。。。。


        先看在数据库中测试的结果:


        1、当查询语句中where后面是一个值时(假设这个值是1):


        (1)、查询语句中where与1之间没有空格,查询出正确结果;


52.png


        (2)、查询语句中where与1之间有空格,报错:在应使用条件的上下文(在 '1' 附近)中指定了非布尔类型的表达式


53.png

     2、假设查询语句中where后面是一条语句时(假设这条语句是“1=1”):

        (1)查询语句中where与“1=1”之间有空格,查询出正确结果;

54.png


        (2)查询语句中where与“1=1”之间没有空格,报错:'=' 附近有语法错误。


55.png


      原来,SQL语句中,where后面跟的是一个Boolean型的值。


      【画龙点睛】


      在where后面,如果仅仅是一个Boolean类型的值或者Boolean类型的变量,那么where和这个Boolean值之间是不可以有空格的(这时,我的代码中的@strCondition就是一个Boolean类型的变量;但如果where后面是一条语句的话(当然这一条语句的整体也是一个Boolean类型的值,比如“1=1”),那么这条语句和where之间就必须要有空格。

相关文章
|
7月前
|
存储
记录一次错误。(此声明没有存储类或类型说明符)
记录一次错误。(此声明没有存储类或类型说明符)
TS,类型注解 number就是类型注解,TS类型注解是一种为变量添加类型约束的方式,你定义什么类型,就只能赋值什么类型,变量命名规则,变量名称不能以数字开头,交换变量写法
TS,类型注解 number就是类型注解,TS类型注解是一种为变量添加类型约束的方式,你定义什么类型,就只能赋值什么类型,变量命名规则,变量名称不能以数字开头,交换变量写法
|
8月前
|
Java C# 开发者
Python 中的类型注解是一种用于描述变量、函数参数和返回值预期类型的机制
【5月更文挑战第8天】Python的类型注解提升代码可读性和可维护性,虽非强制,但利于静态类型检查(如Mypy)。包括:变量注解、函数参数和返回值注解,使用内置或`typing`模块的复杂类型,自定义类型注解,以及泛型模拟。类型注解可在变量声明、函数定义和注释中使用,帮助避免类型错误,提高开发效率。
78 6
|
8月前
|
Java 索引
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
92 0
|
8月前
自定义封装一个方法让这个方法可以判断所有的数据类型并返回
自定义封装一个方法让这个方法可以判断所有的数据类型并返回
42 0
|
Java 编译器
重载的方法能否根据返回类型进行区分?
重载的方法不能根据返回类型进行区分。方法的重载是基于方法名称和参数列表来进行区分的,与返回类型无关。这是因为在Java中,编译器在确定要调用哪个重载方法时,仅根据传递给方法的参数来进行决策。
386 0
判断Object中数据类型(已知类型、未知类型))
判断Object中数据类型(已知类型、未知类型))
150 0
|
Python
变量的赋值定义分类和类型判断
几乎在所有编程语言当中变量是最先接触语法概念,那么什么是变量,变量应该怎么定义呢,定义变量又该注意哪些因素呢?这里我们来给大家详细聊聊。
变量的赋值定义分类和类型判断
|
开发框架 安全 JavaScript