Jet.OLEDB或ACE.OLEDB MS Access

时间:2019-03-22 14:47:09

标签: excel vba ms-access

我正在使用excel vba从MS Access数据库中提取数据-这是使用Excel 2013和Access 2013 32位。该代码历来使用:

Provider=Microsoft.Jet.OLEDB.4.0;

但是,某些计算机已升级到Excel 2016 64位,并且Jet提供程序不适用于64位。我已将代码更改为:

Provider=Microsoft.ACE.OLEDB.12.0;

适用于64位和32位系统。但是,我注意到仅更改此行即可大大降低加载/保存数据的速度。有谁知道为什么会这样以及我如何改善它?

1 个答案:

答案 0 :(得分:0)

您必须为x64位选择ACE提供程序是正确的。

JET的最大优势是默认情况下(现在仍然)将其安装在Windows的所有副本上。因此,无需安装Access或运行时,也无需安装Office连接包。

关于表现?关于ACE x64的性能已有一些评论。

但是,一种技巧或建议是确保连接保持打开状态。换句话说,您确定行处理的速度变慢了吗,还是整个时间?

(也许在消息框中放入一个测试消息框,或在您的代码中进行测试。

例如:

 Dim T    as single

 T = timer()

 ‘ your code here

 Debug.print timer() – t

因此,以上内容将花费时间到调试窗口(在VBA中,按ctrl-g显示立即/调试窗口。

我建议强制开放的原因通常是您发现ACE需要很长时间才能打开。但是一旦打开,数据读取将具有良好的性能(与以前相同)。

所以,我建议检查并尝试此修复程序。

因此打开一个表(任何表)并保持打开状态。现在运行您现有的代码(可能会打开+关闭其他表)。问题是当ACE尝试打开表时,它试图在mdb / accdb文件上放置锁,而此过程花费的时间非常长。

但是,如果您强制(保持)打开一个表,那么每次执行查询或在代码中创建其他记录集时,ACE尝试锁定文件以进行读/写的这种非常缓慢的过程就不会发生。 >

因此,如果行读取速度很快,但是开始+打开的时间很慢,则在运行+测试例程之前,强制将表打开到某种记录集(使其保持活动状态并在作用域内),然后然后尝试您的代码。

我发现10次中有9次,这消除了这种缓慢的速度,而且我经常看到结果无比壮观(它将比以前更快!)