【问题标题】:Missing operator in query expression?查询表达式中缺少运算符?
【发布时间】:2016-02-25 11:11:11
【问题描述】:

这段代码给了我一个语法错误。

DataGridView1.DataSource = ""
dAdapt = New OleDb.OleDbDataAdapter("select CustName, CustMobileNo, SMSDate, OilChangeStatus from invoiceHeader_tb where SMSDate =" & DTPDueDate.Value & " order by SMSDate", con)
Dim dt As New DataTable
dAdapt.Fill(dt)
Me.DataGridView1.DataSource = dt
Me.DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
Me.DataGridView1.ReadOnly = True
con.Close()

错误:

查询表达式“SMSDate”中的语法错误(缺少运算符) =25-Feb-16 下午 4:05'

【问题讨论】:

  • New OleDb.OleDbDataAdapter("select CustName, CustMobileNo, SMSDate, OilChangeStatus from invoiceHeader_tb where SMSDate ='" & DTPDueDate.Value & "' order by SMSDate", con) 使用这个

标签: sql .net vb.net syntax-error


【解决方案1】:

在此处添加单引号

SMSDate = '" & DTPDueDate.Value & "'

所以会是这样的

dAdapt = New OleDb.OleDbDataAdapter("select CustName, CustMobileNo, SMSDate, OilChangeStatus from invoiceHeader_tb where SMSDate ='" & DTPDueDate.Value & "' order by SMSDate", con)

【讨论】:

  • 仍然面临标准表达式中的数据类型不匹配
  • SMSDate 是日期时间还是字符串?
  • smsDate 是一个短日期(格式 = 2/23/2016),我通过 DateTimePicker 工具存储。
【解决方案2】:

日期前后缺少撇号(单引号)。

where SMSDate ='" & DTPDueDate.Value & "' order

【讨论】:

  • 仍然面临表达式中的数据类型不匹配
【解决方案3】:

您的原始 SQL 缺少日期值周围的单引号,但这仍可能无法修复错误,因为 db 可能需要某种格式的日期。

您尚未指定您正在使用的数据库,但大多数人希望日期为 'yyy-MM-dd' 格式

此外,这种执行 sql 的方式也会让您面临SQL Injection 漏洞,因此您应该使用参数化查询正确执行此操作:

例如:

Public Function GetBarFooByBaz(ByVal Baz As String) As String
    Dim sql As String = "SELECT foo FROM bar WHERE baz= @Baz"

    Using cn As New SqlConnection("Your connection string here"), _
        cmd As New SqlCommand(sql, cn)

        cmd.Parameters.AddWithValue("@Baz", Baz)
        Return cmd.ExecuteScalar().ToString()
    End Using
End Function

来自这个答案的参考:How do I create a parameterized SQL query? Why Should I?

这样做意味着您不必以特定格式设置日期,也不必记住是否需要在值周围加上引号。

【讨论】:

  • 参数很重要,如果他不是,现在必须这样做。但是you don't have to set the date in a specific format我不同意这种说法。日期有不同的类型,查看SqlDBType 枚举,目前有三种,每种在上下文中都不同。取决于他的列类型和他在will make a difference 中传递的内容。另一方面,最好将命令包装在 using 语句中,它可以防止调用终结器,当命令被释放时,终结器是一种增强。
  • @Codexer - 我已更改答案以提供更多详细信息并使用AddWithValue,这不需要您指定SqlDbType
  • 还不错,但是AddWithValue 也好不到哪里去;它依赖于数据库来隐式地转换传递的值,因为它是一个对象。我喜欢指定我的类型,而不是仅仅依靠 SQL 的隐式转换来做到这一点。此外,AddWithValue 是一个性能问题,它是一种反模式,因为与参数类型及其大小相关的性能问题。
猜你喜欢
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2018-09-02
  • 2018-01-29
  • 2012-11-14
相关资源
最近更新 更多