【问题标题】:"LIKE" operator works in MS Access, but not ADO"LIKE" 运算符适用于 MS Access,但不适用于 ADO
【发布时间】:2014-10-27 08:59:48
【问题描述】:

我正在尝试使用带有星号的“喜欢”过滤记录,它在使用 Access 2010 返回许多记录时有效。我很困惑为什么它与 ADO 一起使用时什么也不返回。该代码包含多个表和列,因此为了排除故障,我做了一个简单的查询。代码如下:

strsql = "SELECT tproducts.Prod_Name FROM tproducts " _
& " WHERE tproducts.Prod_Name Like " & Chr(34) & "SO*" & Chr(34)

Set cn = New ADODB.Connection
cn = connString
cn.Open
Set rs = New ADODB.Recordset
rs.Open strsql, cn, adOpenStatic, adLockOptimistic

' test here
iRecCount = rs.RecordCount
rs.MoveFirst

记录数返回 -1。

当“Like”被“equals”替换时,它会返回正确的记录,所以我确信它能够连接到数据库,例如:

strsql = "SELECT tproducts.Prod_Name FROM tproducts " _
& " WHERE tproducts.Prod_Name = " & Chr(34) & "SONY Vaio SVD13213CXB" & Chr(34)

在 ADO 中使用 Like 运算符有什么特殊的方法吗?

我还可以通过哪些其他方式进行过滤以提供与使用“赞”相同的结果?例如,要查找所有“SVD”产品?

【问题讨论】:

    标签: ms-access vb6 ado sql-like


    【解决方案1】:

    在 MS Access 中,通配符几乎总是 *,在 MS Access 之外,它几乎总是 %,所以

    str = "SELECT tproducts.Prod_Name FROM tproducts) " _
    & " WHERE tproducts.Prod_Name Like ""SO%"""
    

    但是,我强烈建议您转而使用参数以避免出现一些严重的问题。

    到目前为止,DAO 是 ACE / Jet 的更好选择(粗略示例Loop table rows in Access, with or without use of Private Const

    【讨论】:

    • 是的,我使用了星号通配符。它曾经连接到 Mysql 数据库并使用 %,但是,% 在 MS Access 中不返回任何内容。我直接在 MS Access 上测试了这些语句。
    • 您使用的是 ADO,所以是 %,而不是 * 如果您使用的是 ACE/Jet,使用 DAO 效率更高。
    • 查询只是通过 ADO 传递到访问引擎(JET 引擎)。 ADO 不解析查询本身。
    • @Zippit 点是一样的,用ADO,查询必须用%,用DAO * 是一个选项。使用 ACE / Jet 时,DAO 更快。
    • 我切换到 % 通配符但结果相同,没有返回任何记录。
    【解决方案2】:

    您不能指望 RecordCount。即使返回了行,它也经常返回 -1。如果您使用的是客户端游标,它只会返回实际计数。

    相反,使用 rs.EOF 检查记录集的结尾。尝试以下方法:

    Set cn = New ADODB.Connection
    cn = connString
    cn.Open
    Set rs = New ADODB.Recordset
    rs.Open strsql, cn, adOpenStatic, adLockOptimistic
    
    ' very innefficient way to find the record count, but gives you the idea.  If you just care about record count use "COUNT(*)" in your query
    do while not rs.eof
      iRecCount = iRecCount + 1
      rs.MoveNext
    loop
    

    【讨论】:

    • 但问题是“Like”并不总是返回任何记录。
    • 你怎么知道它没有返回任何记录?正如我上面提到的,如果你只检查 rs.recordCount 那你就错了。您需要检查 rs.eof
    • rs.movenext 返回错误:运行时错误“3021”。 BOF 或 EOF 为真,或者当前记录已被删除。
    • 嘿...那你肯定不会拿回任何记录。
    • 因此,“Like”似乎不适用于 ADO。还有另一种使用通配符进行过滤的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2021-08-28
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多