【问题标题】:Syntax for DAO 'Like' Select QueryDAO 'Like' 选择查询的语法
【发布时间】:2015-06-16 13:41:44
【问题描述】:

很抱歉因为这可能是一个非常简单的问题而打扰大家。 我相当频繁地使用 DAO Select 查询,但从来不需要使用基于表单字段的“Like”进行过滤。

应根据组合框(comboRes)过滤的附加代码抛出一个

查询表达式错误中的语法错误(缺少运算符)。

我猜错误在于Like '*' " & strRes & " '*',但我尝试了很多组合,但没有任何乐趣。

有人可以整理一下我的语法/代码吗?

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Set db = CurrentDb

Dim strRes As String
strRes = Me.comboRes

Set qdf = db.QueryDefs("qryInst")

strSQL = "SELECT tblInst.*, tblInst.ResList " & _
        "FROM tblInst " & _
        "WHERE (((tblInst.ResList) Like '*' " & strRes & " '*'t ));"

qdf.SQL = strSQL

DoCmd.OpenQuery "qryInst"

qdf.Close
db.Close
Set qdf = Nothing
Set db = Nothing

【问题讨论】:

  • 首先,最佳实践要求您应该使用准备好的语句(例如here)。其次,该 SQL 查询相当不稳定;您查询的具体目的是什么?
  • 感谢您回复我。 “相当古怪”描述了我的大部分编码。对不起,我是个白痴,但我看过你的例子,但仍然不确定什么是“准备好的声明”。我将不得不花更多时间学习正确编码。
  • Prepared Statement 只是一个预先构建为字符串的查询,在将查询字符串编译为目的。它们处理值检查和对象文字格式(即正确的引号),并有助于防止 SQL 注入。
  • 我上面链接的答案显示了如何将未准备好的查询(在问题中)更改为准备好的语句。这是另一天的另一个改进。现在,努力让您的 LIKE 子句发挥作用,然后然后您可以考虑将其设为 Prepared Statement。
  • 太好了。现在我在 PaulFrancis 的帮助下完成了查询,我可以查看 Prepared Statements,你们的 cmets 给了我一个很好的开始。再次感谢。

标签: sql vba dao sql-like


【解决方案1】:

您需要将字符串变量连接到LIKE 子句,

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Set db = CurrentDb

Dim strRes As String
strRes = Me.comboRes

Set qdf = db.QueryDefs("qryInst")

strSQL = "SELECT tblInst.*, tblInst.ResList " & _
         "FROM tblInst " & _
         "WHERE tblInst.ResList Like '*" & strRes & "*';"

qdf.SQL = strSQL

DoCmd.OpenQuery "qryInst"

qdf.Close
db.Close
Set qdf = Nothing
Set db = Nothing

因此,如果您的strResPaul,您的 SQL 将转换为。

SELECT tblInst.*, tblInst.ResList FROM tblInst WHERE tblInst.ResList Like '*Paul*';"

【讨论】:

  • 这对保罗很有帮助。我知道是我对语法知识的缺乏使我绊倒了。非常感谢您抽出宝贵时间
【解决方案2】:

您的 SQL 需要稍作更改。 like 运算符采用字符串,通配符取决于 ANSI 查询模式 - 请参阅 here - 因此您可能需要使用 % 而不是 *。因此,要匹配tblInst.ResList 中任意位置的strRes 的内容,请使用以下命令:

"WHERE tblInst.ResList Like '*" & strRes & "*';"

请注意,当您使用这种代码风格时,您很容易受到SQL injection 的攻击。

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 2022-01-17
    • 2011-01-17
    • 2017-10-26
    • 2019-05-06
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多