未經處理的異常在 System.Data.dll 中發生。其它信息:在應使用條件的上下文(在 '***' 附近)中指定了非布爾類型的表達式。
機房收費系統中,有些人在聯合查詢這個模塊用的是存儲過程,我先嘗試著在數據庫中建立了一個視圖,然後在UI層做個推斷並生成查詢條件strCondition。
在機房收費系統的“聯合查詢”模塊中出現的問題:“System.Data.SqlClient.SqlException”類型的未經處理的異常在 System.Data.dll 中發生。其它信息: 在應使用條件的上下文(在 [email protected] 附近)中指定了非布爾類型的表達式。
出錯的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 [email protected]"。
經過一陣冥思苦想,在數據庫中嘗試了好多次後,才明確這究竟是為什麽。
。。。
先看在數據庫中測試的結果:
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值之間是不能夠有空格的([email protected]的變量;但假設where後面是一條語句的話(當然這一條語句的總體也是一個Boolean類型的值。比方“1=1”),那麽這條語句和where之間就必需要有空格。
未經處理的異常在 System.Data.dll 中發生。其它信息:在應使用條件的上下文(在 '***' 附近)中指定了非布爾類型的表達式。