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

               

             机房收费系统中,有些人在联合查询这个模块用的是存储过程。我先尝试着在数据库中建立了一个视图。然后在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之间就必需要有空格。

             

             

  • 相关阅读:
    C#模拟键盘登录网站
    利用c#开发一个telnet unix服务器或者防火墙的小工具(转)
    Fckeditor XML Request error:internal server error (500) 一例
    CSS格式模板
    TFS 2008: Message that "solution not currently configured for integrated source control in Visual Studio"
    学习笔记Javascript事件Event、IE浏览器下的拖拽效果
    学习笔记验证控件
    学习笔记Socket编程、任务栏图标和MD5散列算法
    学习笔记Web服务、Remoting、WCF (上) Web服务
    学习笔记Web服务、Remoting、WCF (下) Remoting and WCF
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7229935.html
Copyright © 2011-2022 走看看