【问题标题】:SQL Syntax error, expression of non-boolean typeSQL 语法错误,非布尔类型的表达式
【发布时间】:2016-07-26 08:39:25
【问题描述】:

此代码应该创建一张通过活动门票获得的收入的图表。

代码在返回错误时只执行到da.Fill(ds),可以在代码末尾看到。

有人知道原因吗

  Private Sub frmRevenue_Load(sender As Object, e As EventArgs) Handles Me.Load

    frmMDI.addFormToCMS()

    Dim dt As DataTable
    dt = New DataTable
    dt.Columns.Add("Fee")

    Dim sales As Integer = 0

    Dim gridtable As New DataTable
    gridtable.Columns.Add("Month")
    gridtable.Columns.Add("Total")
    gridtable.Columns.Add("#")

    For i = 1 To 12
        sql = "SELECT Fee FROM tblTickets WHERE MONTH(DatePurchased) = " & i & " AND (YEAR(DatePurchased) = " & Today.Year & " OR " & Year(Today.AddYears(1)) & ") AND (Status = 'SOLD' OR RESERVED" _
& " = 'AWAITING CONFIRMATION' OR Status = 'AVAILABLE' OR Status = 'AWAITING PAYMENT');"

        da = New OleDb.OleDbDataAdapter(sql, con)
        ds = New DataSet
        da.Fill(ds)

        Dim dr As DataRow

        For Each dr In ds.Tables(0).Rows
            monthly(i) = monthly(i) + 1
            contracts = sales + 1
            total(i) = total(i) + dr.Item("Fee")
            yearlytotal = yearlytotal + dr.Item("Fee")
        Next
    Next

    For i = 1 To 12
        Dim month As String
        Select Case i
            Case 1
                month = "Jan"
            Case 2
                month = "Feb"
            Case 3
                month = "Mar"
            Case 4
                month = "Apr"
            Case 5
                month = "May"
            Case 6
                month = "Jun"
            Case 7
                month = "Jul"
            Case 8
                month = "Aug"
            Case 9
                month = "Sep"
            Case 10
                month = "Oct"
            Case 11
                month = "Nov"
            Case 12
                month = "Dec"
            Case Else
                month = "ERR"
        End Select

        gridtable.Rows.Add(month, FormatCurrency(total(i)), monthly(i))
    Next

    ugTickets.DataSource = gridtable
    ugTickets.DisplayLayout.Bands(0).Columns("Month").Width = 35
    ugTickets.DisplayLayout.Bands(0).Columns("#").Width = 20
    ugTickets.DisplayLayout.Override.AllowUpdate = DefaultableBoolean.False
    txtAnnual.ReadOnly = True
    txtAnnual.BackColor = Color.White
    txtAnnualContracts.ReadOnly = True
    txtAnnualContracts.BackColor = Color.White
    chRevenue.Titles("chTitle").Text = "Predicted revenue for " & Today.Year & " - " & Year(Today.AddYears(1))
    txtAnnual.Text = FormatCurrency(yearlytotal, 2)
    txtAnnualContracts.Text = contracts
    chRevenue.Series("Series1").Name = "Revenue"

    For i = 1 To 12
        chRevenue.Series("Revenue").Points.AddY(total(i))
    Next

    Try
        chRevenue.BackColor = Color.Transparent
        chRevenue.Legends("Revenue").BackColor = Color.Transparent
        chRevenue.Series("Revenue").ChartArea = "ChartArea1"
        chRevenue.Series("Revenue").Color = Color.SkyBlue
        chRevenue.Series("Revenue").ToolTip = FormatCurrency("#VALY", 2)
    Catch
    End Try

End Sub

在预期条件的上下文中指定的非布尔类型表达式,靠近 ')'。

【问题讨论】:

    标签: vb.net sql-server-2008


    【解决方案1】:

    问题在于这段 SQL:

    (YEAR(DatePurchased) = " & Today.Year & " OR " & Year(Today.AddYears(1)) & ")
    

    应该是这样

    (YEAR(DatePurchased) = " & Today.Year & " OR YEAR(DatePurchased) = " & Year(Today.AddYears(1)) & ")
    

    SQL(以及大多数其他语言)中的 OR 需要在每一侧都有两个独立的有效条件。左侧目前如下所示:

    YEAR(DatePurchased) = 2016
    

    ...这很好。但是右边是这样的:

    2017
    

    ...这不是一个有效的布尔值。

    当您在 da.Fill() 行(即在数据库中实际运行 SQL 的行)收到类似错误时,最简单的调试方法是打印出“sql”的值变量。

    通常,您只需查看它生成的 SQL,问题就会很明显。其他时候,您必须复制它并直接针对您的数据库运行它以查看问题所在。

    【讨论】:

    • 和这部分(状态 = 'SOLD' OR Status = 'AWAITING CONFIRMATION' OR Status = 'RESERVED' OR Status = 'AVAILABLE' OR Status = 'AWAITING PAYMENT')
    • @F0r3v3r-A-N00b 你可能是对的,但没有看到我不知道的表定义。所示代码将生成有效的 SQL。这仅取决于是否存在名为 RESERVED 的列。
    【解决方案2】:

    可能是你的 SQL,试试:

    "SELECT Fee FROM tblTickets WHERE MONTH(DatePurchased) = '" & i &
    "' AND (YEAR(DatePurchased) = '" & Today.Year & 
    "' OR '" & Year(Today.AddYears(1)) & "') " & 
    "AND (Status = 'SOLD' OR RESERVED = 'AWAITING CONFIRMATION' " &
                          "OR Status = 'AVAILABLE' " &
                          "OR Status = 'AWAITING PAYMENT');"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多