为啥 ADO 记录集返回的记录比基础 Access 查询多

Posted

技术标签:

【中文标题】为啥 ADO 记录集返回的记录比基础 Access 查询多【英文标题】:Why does ADO recordset return more records than the underlying Access query为什么 ADO 记录集返回的记录比基础 Access 查询多 【发布时间】:2016-06-21 08:46:25 【问题描述】:

我在 Access 2016 中有一个表 Table1(主键 = Code),其值如下:

=====+=============
Code + Name
=====+=============
A1   | AU All
A2   | AU Large
A3   | AU Size
A4   | Unassigned
=====+=============

我有一个查询,Query1 定义为:

SELECT Table1.Code
FROM Table1
WHERE (((Table1.Name) Not Like "AU *"));

在 Access 中,查询按预期返回 1 条记录:

Code
======
A4
======

但是,当我使用 ADO 2.8 或 6.1 打开查询时,使用以下代码:

Option Compare Database
Option Explicit

Sub test()
  Dim rst As ADODB.Recordset
  Set rst = New ADODB.Recordset

  With rst
    .Open "Query1", CurrentProject.Connection, adOpenStatic, adLockReadOnly
    Do While Not .EOF
      Debug.Print .Fields("Code").Value
      .MoveNext
    Loop
    Debug.Print "Record Count : " & .RecordCount
    .Close
  End With

End Sub

所有 4 条记录都返回,如调试输出所示:

A1
A2
A3
A4
Record Count : 4

为什么我得到不同的结果?

【问题讨论】:

将通配符从 * 更改为 % @nazark,它是 MS Access,而不是 SQL 服务器! 尝试将查询的名称替换为它的内容!让我知道会发生什么。 你误解了我想告诉你的内容。您必须将 SELECT Table1.Code FROM Table1 WHERE (((Table1.Name) Not Like "AU *")); 作为 ADO.Recodset 的 Open 方法的第一个参数传递,而不是 Query1! @MaciejLos 源是查询名称还是底层 SQL 没有区别。在查询中或在 SQL 字符串中将通配符从 * 更改为 %确实产生了预期的结果。 【参考方案1】:

尝试从 * 到 % 的通配符

  .Open "SELECT Table1.Code FROM Table1 
WHERE (((Table1.Name) Not Like 'AU %'))", 
CurrentProject.Connection, adOpenStatic, adLockReadOnly

查看更多details

【讨论】:

你是对的,在底层查询中将通配符更改为 %,或者在 SQL 中指定查询(并在 ADO 调用中使用 % 通配符都会产生预期的输出。通配符似乎让我想起了为什么我在过去有意识地决定在 in Access... 工作时使用 DAO 如果您希望内部和外部执行的行为更加一致,也可以考虑在保存的查询中使用ALIKE 而不是LIKE 感谢@GordThompson,我采用了ALiKE 方法,直到您发表评论我才知道它存在。这在 Access 表达式中可以追溯到多远?

以上是关于为啥 ADO 记录集返回的记录比基础 Access 查询多的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Access 中返回 835 条记录的查询会在 VBA 代码中返回一个空记录集?

将完整的 ADO 记录集插入现有的 ACCESS 表而不使用循环

MS Access ADO 记录集和二维数组

MS Access - ADO 记录集,使用 SQL 语句检索数据和建表

如何从 ADO 记录集字段将图片加载到 MS-Access Image 控件中?

获取从 PHP ADO 连接返回到 MS-Access DB 的 JSON