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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/38322005

         机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在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' ”嘛!

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

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

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

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

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

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

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

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

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

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

       【画龙点睛

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏鸿的学习笔记

sql解析的一些计划

关于sql解析的一些概述: 因为最近在研究如何将oracle的sql语句迁移到hive上去,前期是准备写一些udf函数去弥补hive缺失oracle函数...

832
来自专栏yukong的小专栏

【ssm个人博客项目实战07】博客的后台实现什么是循环引用和重复引用关闭循环引用/重复引用

在前面我们已经完成了博客类别的添加修改删除分页查询操作了,现在我们就来完成了博客的添加修改

2333
来自专栏JMCui

HQL查询

       HQL(Hibernate QueryLanguage) 是面向对象的查询语言,它和SQL查询语言有些相似。 1、Select/update/de...

2463
来自专栏chenssy

【死磕Sharding-jdbc】---group by结果合并(2)

在sharding-jdbc源码之group by结果合并(1)中主要分析了sharding-jdbc如何在GroupByStreamResultSetMerg...

992
来自专栏王小雷

SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程

SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语...

3188
来自专栏Hadoop数据仓库

HAWQ技术解析(十) —— 过程语言

        HAWQ支持用户自定义函数(user-defined functions,UDF),还支持给HAWQ内部的函数起别名。编写UDF的语言可以是SQ...

4545
来自专栏JadePeng的技术博客

c# IO操作(带进度的文件复制器,读取文本文件的指定行)

带进度的文件复制器      基本原理就是通过Stream的BeginRead来异步复制文件,同时刷新进度条的状态 ? ? ? 代码 读取文件的指定行 1、...

3607
来自专栏PHP在线

帮助你认识PHP的特点与发展

写在前面的话:之前做的一个项目,数据库及系统整体构架设计完成之后,和弟兄们经过一段时间的编码,系统如期上线,刚开始运行一切良好,后来随着数 据量的急剧膨胀,慢慢...

2853
来自专栏chenssy

【死磕Sharding-jdbc】---重写

核心源码就在sharding-jdbc-core模块的com.dangdang.ddframe.rdb.sharding.rewrite目录下,包含两个文件SQ...

1213
来自专栏学习力

《Java从入门到放弃》框架入门篇:hibernate查询——HQL

2047

扫码关注云+社区

领取腾讯云代金券