【问题标题】:ADODB connection - SQL "NOT LIKE" query not workingADODB 连接 - SQL“不喜欢”查询不起作用
【发布时间】:2018-07-11 23:08:59
【问题描述】:

我有一个非常奇怪的问题。我有一个 Access 数据库(2013 64 位 .accdb) 以及基于其他查询“Q_ManifestedByStatus”的几个查询

所有查询在 Access 中都按预期工作,所以这里没有问题。

问题是当我使用 ADODB 连接将数据提取到 Excel(2013 64 位)时。其中一个查询具有“WHERE”子句 [PO No] LIKE '8*'。 当 sql 代码嵌入到 VBA 中时,它可以正常工作,当 sql 被访问时的查询名称替换时,它不会。

当我从访问中删除 WHERE 子句时,两种方式都可以正常工作... 当我将 LIKE 子句更改为 NOT LIKE 时,两种方式都可以正常工作...

欢迎提出任何建议!

请参阅下面的代码。

访问 SQL:

SELECT 
Int([Collection date]) AS [Date], 
Sum(IIf([Status]="Early",1,0)) AS Early, 
Sum(IIf([Status]="On Time",1,0)) AS [On Time], 
Sum(IIf([Status]="Late",1,0)) AS Late, 
Sum(IIf([Status]="Not Manifested",1,0)) AS [Not Manifested], 
[Early]+[on time]+[late]+[not manifested] AS [Sum], 
Round([Early]/[Sum],2)*100 & "%" AS [Early%], 
Round([On Time]/[Sum],2)*100 & "%" AS [On Time%], 
Round([Late]/[Sum],2)*100 & "%" AS [Late%], 
Round([Not Manifested]/[Sum],2)*100 & "%" AS [Not Manifested%]
FROM Q_ManifestedByStatus
WHERE [PO No] Like '8*' Or [PO No] Like '9*'
GROUP BY Int([Collection date]);

VBA - SQL 嵌入式 - 工作

Sub tt()

Dim objAdoCon       As Object
Dim rst             As Object
Dim provider        As String
Dim sql             As String

sql = "SELECT Int([Collection date]) AS [Date], Sum(IIf([Status]=""Early"",1,0)) AS Early," & _
"Sum(IIf([Status]=""On Time"",1,0)) AS [On Time], Sum(IIf([Status]=""Late"",1,0)) AS Late," & _
"Sum(IIf([Status]=""Not Manifested"",1,0)) AS [Not Manifested], [Early]+[on time]+[late]+[not manifested] AS [Sum]," & _
"Round([Early]/[Sum],2)*100 & ""%"" AS [Early%], Round([On Time]/[Sum],2)*100 & ""%"" AS [On Time%], Round([Late]/[Sum],2)*100 & ""%"" AS [Late%]," & _
"Round([Not Manifested]/[Sum],2)*100 & ""%"" AS [Not Manifested%] FROM Q_ManifestedByStatus WHERE [PO No] NOT Like '8*' GROUP BY Int([Collection date]);"

Set objAdoCon = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

If Application.Version = 15# Then provider = "Provider = Microsoft.ACE.oledb.12.0;" Else provider = "Provider = Microsoft.ACE.oledb.4.0;"
objAdoCon.Open provider & "Data Source = C:\Users\pplusa\Documents\SupplierCompliace.accdb"

'Get 81 POs data
'Daily
Worksheets("81 POs Daily").Select
Cells.Delete

rst.Open sql, objAdoCon
Range("A2").CopyFromRecordset rst

For i = 0 To rst.Fields.Count - 1
    Range(Cells(1, i + 1).Address).Value = rst.Fields.Item(i).Name
Next i

Cells.EntireColumn.AutoFit
rst.Close

End Sub

VBA - 按查询名称 - 不起作用

Sub tt()

Dim objAdoCon       As Object
Dim rst             As Object
Dim provider        As String

Set objAdoCon = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

If Application.Version = 15# Then provider = "Provider = Microsoft.ACE.oledb.12.0;" Else provider = "Provider = Microsoft.ACE.oledb.4.0;"
objAdoCon.Open provider & "Data Source = C:\Users\pplusa\Documents\SupplierCompliace.accdb"

'Get 81 POs data
'Daily
Worksheets("81 POs Daily").Select
Cells.Delete

rst.Open "Q_ManifestedByDate81", objAdoCon
Range("A2").CopyFromRecordset rst

For i = 0 To rst.Fields.Count - 1
    Range(Cells(1, i + 1).Address).Value = rst.Fields.Item(i).Name
Next i

Cells.EntireColumn.AutoFit
rst.Close

End Sub

【问题讨论】:

    标签: sql excel ms-access adodb


    【解决方案1】:

    SQL 不使用* 进行多字符匹配。它使用%

    【讨论】:

    • 我在 Access 应用程序中更改了它,它现在停止为 Access 工作,但适用于 Excel。是不是因为 VBA 使用不同的 SQL 语法来访问 SQL 查询?
    • @aberforth 这似乎很有可能。对于每种环境和每种方言,您都需要再次阅读手册。 SQL 不是单一通用语言的一个例子是,即使/ 在不同的实现中实现也是一样的。 (有些是整数除法,有些是定点除法。)
    • 那将是有道理的......换句话说,我不能使用 VBA 按查询名称提取查询数据,我需要将 SQL 嵌入 VBA 或更改 Access 中的 SQL 但那么访问将无法正常工作..我会弄清楚这一点。谢谢马特!
    • @aberforth ... VBA 字符串查询的效率低于 Access 存储查询,因为 Jet/ACE 引擎会缓存和预编译存储查询的最佳执行计划。 VBA 查询是即时运行的,您可以避免代码中出现长而混乱的字符串!
    【解决方案2】:

    这是在 MS Access 内部和外部通过 OLEDB/ODBC 运行 LIKE 之间的一个已知问题。回想一下,MSAccess 既是一个 GUI 程序,也是一个后端数据库。

    默认情况下,MS Access 通过其 GUI .exe 界面使用 ANSI-89 语法,* 作为通配符运算符。与 Excel 一样,通过 OLEDB 进行的 MS Access 使用 ANSI-92 语法,% 作为通配符运算符。请参阅有关 Access wildcard character reference 的 MS Office 支持文档。

    考虑两个选项之一以使两者保持一致:

    1. 在带有 % 运算符的 Access 查询中使用 ALIKE 运算符而不是 LIKE
    2. 或者,将 .accdb 数据库设置为使用文件 \ 选项 \ 对象设计器下的 SQL Server 兼容语法 (ANSI 92)。然后LIKE 将坚持% 而不是*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多