未處理的例外狀況在 System.Data.dll 中發生。其他資訊:在應使用條件的上下文(在 '***' 附近)中指定了非布爾類型的運算式。,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值之間是不可以有空格的(這時,My Code中的@strCondition就是一個Boolean類型的變數;但如果where後面是一條語句的話(當然這一條語句的整體也是一個Boolean類型的值,比如“1=1”),那麼這條語句和where之間就必須要有空格。
“SystemArgumentException”類型的未經處理的異出在 SystemDatadll 資訊: 列要有效 DataType
在操作資料庫相互關聯類型的時候 不應該使用.net中的類型吧 應該是有枚舉來擷取類型的
未處理的“SystemArgumentException”類型的異常出現在 SystemDatadll 中
System.Data.dll需要引用一下