机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在ui层做个判断并生成查询条件strcondition。 在机房收费系统的联合查询模块中出现的问题:system.data.sqlclient.sqlexception类型的未经处理的异常在 s
机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在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之间就必须要有空格。