【问题标题】:VB.NET An expression of non-boolean type specified in a context where a condition is expected, near ')'VB.NET 在预期条件的上下文中指定的非布尔类型的表达式,靠近 ')'
【发布时间】:2011-09-22 01:00:02
【问题描述】:

我正在开发一个 VB.NET ASPX 文件并尝试在 VB.NET 中运行字符串查询,但现在我收到了上述错误消息。如何确定原因?此 ASPX 文件中的一些代码如下所示。它出错的行是: DSPageData = GlobalFunctions.GlobalF.GetSQLServerDataSet(SQL)

但同样的函数适用于我的其他 SQL 字符串之一,所以我认为问题出在这个 SQL 字符串的某个地方:

            arrType.Add("Product and Process")
            arrType.Add("Product")
            arrType.Add("Process")                          
            dType.DataSource = arrType
            dType.DataBind()

                arrPEType.Add("INC")
                arrPEType.Add("NC")
                arrPEType.Add("QC")
                peType.DataSource = arrPEType
                peType.DataBind()
...
        Select Case dType.SelectedValue
            Case "Product and Process": 
                TheType = "(SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION='PXP_PRODUCT_QXP' Or SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION)='PXP_PROCESS_QXP')"
            Case "Product": 
                TheType = "(SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION='PXP_PRODUCT_QXP')"
            Case "Process": 
                TheType = "(SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION='PXP_PROCESS_QXP')"
        End Select

            Select Case peType.SelectedValue
                Case "INC": 
                    PE_Type = "(substring(a.QXP_EXCEPTION_NO, charindex('-', a.QXP_EXCEPTION_NO)+1, 4)='INC')"
                Case "NC": 
                    PE_Type = "(substring(a.QXP_EXCEPTION_NO, charindex('-', a.QXP_EXCEPTION_NO)+1, 4)='NC')"
                Case "QC": 
                    PE_Type = "(substring(a.QXP_EXCEPTION_NO, charindex('-', a.QXP_EXCEPTION_NO)+1, 4)='QC')"
            End Select

            If dOrgUnit.SelectedValue = "All" then
                TheOrgUnit = "<> 'All'"
            Else
                TheOrgUnit = "='" & dOrgUnit.SelectedValue & "'"
            End If

            Dim SQL As String = "SELECT CASE SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION WHEN 'PXP_PROCESS_QXP' THEN SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_SHORT_DESC ELSE EPF_FAILURE_MODE END AS QXP_SHORT_DESC, " & _
                                "Count(distinct SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_EXCEPTION_NO) AS CountOfQXP_EXCEPTION_NO " & _
                                 "FROM SMARTSOLVE.V_QXP_ALL_EXCEPTION LEFT OUTER JOIN " & _
                                    "SMARTSOLVE.V_EPL_EXCEPTION_PART_LOT ON V_QXP_ALL_EXCEPTION.QXP_ID = V_EPL_EXCEPTION_PART_LOT.EPL_QXP_ID LEFT OUTER JOIN " & _
                                    "SMARTSOLVE.V_EPF_EXPN_PART_FMODE ON V_EPL_EXCEPTION_PART_LOT.EPL_EPA_ID = V_EPF_EXPN_PART_FMODE.EPF_EPA_ID " & _
                                    "LEFT OUTER JOIN SMARTSOLVE.V_PXP_PRODUCT_QXP ON SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_ID = SMARTSOLVE.V_PXP_PRODUCT_QXP.QXP_ID " & _
                                          "LEFT OUTER JOIN SMARTSOLVE.V_PXP_PROCESS_QXP ON SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_ID = SMARTSOLVE.V_PXP_PROCESS_QXP.QXP_ID " & _
   "WHERE SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_OCCURENCE_DATE >= CONVERT(DATETIME, '" & FirstMonthDate & " 00:00:00', 102) " & _
   "And SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_OCCURENCE_DATE <= CONVERT(DATETIME, '" & LastMonthDate & " 23:59:59', 102) AND " & _
   "SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_XRS_DESCRIPTION<>'Cancel' AND " & _
   "SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_ORU_NAME" & TheOrgUnit & _
   " and " & TheType & _
   "AND (CASE V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION WHEN 'PXP_PROCESS_QXP' THEN V_PXP_PROCESS_QXP.PXP_OPR_NAME ELSE V_PXP_PRODUCT_QXP.PXP_OPR_NAME END <> 'Non-Diagnostic' OR " & _
                                    "CASE V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION WHEN 'PXP_PROCESS_QXP' THEN V_PXP_PROCESS_QXP.PXP_OPR_NAME ELSE V_PXP_PRODUCT_QXP.PXP_OPR_NAME END IS NULL) " & _
                                 "GROUP BY CASE SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION WHEN 'PXP_PROCESS_QXP' THEN SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_SHORT_DESC ELSE EPF_FAILURE_MODE END " & _
                                 "ORDER BY Count(distinct SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_EXCEPTION_NO) DESC"

            Dim DSPageData as new System.Data.DataSet
            DSPageData = GlobalFunctions.GlobalF.GetSQLServerDataSet(SQL)

【问题讨论】:

  • 错误很可能出在SQL命令中。你能以可读的方式格式化该命令吗?它可以像一个不匹配的括号一样简单。
  • 不要使用这样的字符串连接来将参数替换到您的查询中!! 是的,我的意思是大喊大叫。这是一个巨大的问题。在做任何其他事情之前先阅读sql注入。
  • 我不想这么说,但从外观上看,您将不得不重新构建整个数据层,以便 GetSQLServerDataSet() 函数可以接受的不仅仅是用于查询的字符串参数。 这很重要。如果您不这样做,并且将您的页面放在公共互联网上,那么它在头两年内被黑客入侵。我可以向你保证。
  • 好点乔尔,但这个文件只能在内网上运行
  • sql 注入孔仍然很糟糕,应该堵塞。毕竟,大多数黑客都是内部工作。在内网运行不是借口。

标签: vb.net datasource


【解决方案1】:

你有太多了)在这里:

           Case "Product and Process"                 
TheType = "(SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION='PXP_PRODUCT_QXP' Or SMARTSOLVE.V_QXP_ALL_EXCEPTION.QXP_BASE_EXCEPTION)='PXP_PROCESS_QXP')"

【讨论】:

    【解决方案2】:

    您上面的代码中的 " and " &amp; TheType &amp; _ 看起来应该替换为:
    " and " &amp; PE_Type &amp; _

    我真的希望这并不意味着您在关闭 Option Explicit 的情况下运行。惭愧。

    但是请把我关于 sql 注入的 cmets 放在心上。有些人在运行软件,会随机控制网站寻找易受攻击的页面,即使您没有纯文本输入,我也可以制作一个 http 请求,该请求将通过 dOrgUnit 下拉列表提交我想要的任何内容。包括类似:='1';DROP Table SMARTSOLVE.V_QXP_ALL_EXCEPTION;--

    【讨论】:

    • 谢谢,但这不是问题。查看我更新的描述
    • @user - 下一个调试步骤是将 sql 字符串记录到某处,以便您可以将其直接粘贴到 sql server management studio 中并查看结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多