未经处理的异常在 System.Data.dll 中发生。其它信息:在应使用条件的上下文(在 '***' 附近)中指定了非布尔类型的表达式。
2017-06-19 18:56
567 查看
机房收费系统中,有些人在联合查询这个模块用的是存储过程,我先尝试着在数据库中建立了一个视图,然后在UI层做个推断并生成查询条件strCondition。
在机房收费系统的“联合查询”模块中出现的问题:“System.Data.SqlClient.SqlException”类型的未经处理的异常在 System.Data.dll 中发生。其它信息: 在应使用条件的上下文(在 '@strCondition' 附近)中指定了非布尔类型的表达式。
出错的DAL层代码为:
代码里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之间就必需要有空格。
在机房收费系统的“联合查询”模块中出现的问题:“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之间就必需要有空格。
相关文章推荐
- 未经处理的异常在 System.Data.dll 中发生。其它信息:在应使用条件的上下文(在 '***' 附近)中指定了非布尔类型的表达式。
- 未经处理的异常在 System.Data.dll 中发生。其他信息:在应使用条件的上下文(在 '***' 附近)中指定了非布尔类型的表达式。
- System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其它信息:尝试读取或写入受保护的内存。这通常指示其它内存已损坏。
- 在应使用条件的上下文(在 'xxx' 附近)中指定了非布尔类型的表达式.
- 在应使用条件的上下文(在 'dt_Receiv' 附近)中指定了非布尔类型的表达式
- “System.BadImageFormatException”类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确
- “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
- System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其他信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- “System.BadImageFormatException”类型的未经处理的异常在 PixelToMap.exe 中发生 其他信息: 未能加载文件或程序集“SuperMap.Data, Ver
- “System.NotSupportedException”类型的异常在 System.Data.Entity.dll 中发生,但未在用户代码中进行处理 其他信息: 在 LINQ to Entitie
- 使用过多的递归出现错误,“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生
- “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生
- “System.StackOverflowException”类型的未经处理的异常在 MySql.Data.dll 中发生”的错误处理
- System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生
- “System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。
- “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生
- 在应使用条件的上下文(在 'between@P1' 附近)中指定了非布尔类型的表达式。 ; unc
- “System.BadImageFormatException”类型的未经处理的异常在 Castle.Windsor.dll 中发生 其他信息: 未能加载文件或程序集“Gis”或它的某一个依赖项。
- EF异常:“System.InvalidOperationException”类型的未经处理的异常在 mscorlib.dll 中发生
- System.AccessViolationException”类型的第一次机会异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。