excel - 使用过滤和聚合函数查询预先存在的内存中 ADODB 记录集(高级 ADODB 库?)

标签 excel vba ms-access ado adodb

我有一些现有的代码,使用不同的参数重复查询 SQL 数据库,我认为如果我将其更改为在开始时选择一大块数据到 ADODB.Recordset 中,然后在循环查询此记录集而不是数据库本身。

一个额外的警告是,当我执行这些子查询时,我需要使用聚合函数(SUM、MIN、MAX、AVG)。

编码不会太困难,但是这种明显的事情似乎以前已经做过数千次了,这让我想知道是否可能有某种开源库包含这种类型的功能?我发誓几年前我遇到过一个,但无法在谷歌上找到它。

编辑:
评论中的一个很好的建议(TimW)是在数据库服务器上进行所有聚合并传回客户端,然后在客户端上进行过滤。 (不过,在这种情况下它不起作用,因为应用过滤的列中有 2 个是日期时间列)

更新

这是我以前遇到过的库:
http://code.google.com/p/ado-dataset-tools/

不确定作者是否放弃了它(他的计划似乎是更新它并转换为 c#),但各种库的 VBA 版本似乎可以在这里找到:
http://code.google.com/p/ado-dataset-tools/source/browse/trunk/ado-recordset-unit-tests.xls?spec=svn8&r=8#ado-recordset-unit-tests.xls

我感兴趣的具体 ADO 库在这里:
http://code.google.com/p/ado-dataset-tools/source/browse/trunk/ado-recordset-unit-tests.xls/SharedRecordSet.bas

具体请参见GroupRecordSet()函数。
似乎仅支持 SUM、MIN、MAX 聚合函数。

另一种可能的替代方案(如果在 Excel 中运行)

在 Excel VBA 中针对虚拟表编写 SQL 查询
http://www.vbaexpress.com/forum/showthread.php?t=260
不确定这将如何执行,但将原始数据(部分预聚合)拉入 Excel 中的本地工作表,然后在后续查询中使用该工作表作为数据源可能是一个可行的选择。

最佳答案

我自己的经验是,对数据库进行许多小调用实际上比将大量数据加载到记录集中然后尝试过滤/查询该数据要高效得多。

我还认为,与单​​独调用数据库相比,您在现有 ADO 记录集中过滤/查询数据的能力相当有限。当我尝试这样做时,我认为它应该像通过使用 SQL 查询第一个 ADO 记录集来创建第二个 ADO 记录集一样简单。我从来没有找到办法做到这一点;我很确定这是不可能的。

编辑1
为了帮助您理解差异,我编写了一些代码,使用 ADO 和 VFP OLE 驱动程序从文本文件读取新的价格数据并更新 Visual Foxpro 数据库中的价格。我查询的表大约有 650,000 条记录。我认为最好加载记录集中的所有记录,然后使用 ADO 的过滤方法。当我这样做时,我的代码需要三到四个小时才能运行。我将代码更改为只查找每条记录,一次一条,然后我的代码在一分零两秒内运行。我在 SO 上发布了这个问题。你可以看一下我收到的各种回复:Speed up this Find/Filter Operation - (VB6, TextFile, ADO, VFP 6.0 Database)

关于excel - 使用过滤和聚合函数查询预先存在的内存中 ADODB 记录集(高级 ADODB 库?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10032040/

相关文章:

vba - 如何根据特定单元格中的值插入行?

sql - MS Access中查询表达式中的语法错误(缺少运算符)

vba - Access 中没有 max(x,y) 函数

excel - VBA 运行时错误 -214724809 (80070057)

ms-access - 在MS Access中打开另一个窗体时关闭当前窗体

validation - 日期验证 : Setting minimum and maximum date in a Textbox

excel - Application.Caller 返回不正确的行号

vba - 通过创建时间戳来跟踪更改

excel - 将多个 csv 文件中的数据导入一个 Excel 工作表并计算平均值

json - curl URL 并在 Excel 单元格中发布结果?