1. 程式人生 > >未經處理的異常在 System.Data.dll 中發生。其它信息:在應使用條件的上下文(在 '***' 附近)中指定了非布爾類型的表達式。

未經處理的異常在 System.Data.dll 中發生。其它信息:在應使用條件的上下文(在 '***' 附近)中指定了非布爾類型的表達式。

命令類型 rtt 變量 pub 實例化 eas sel amp convert

機房收費系統中,有些人在聯合查詢這個模塊用的是存儲過程,我先嘗試著在數據庫中建立了一個視圖,然後在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 中發生。其它信息:在應使用條件的上下文(在 '***' 附近)中指定了非布爾類型的表達式。