由ADO(来自VBA)创build的数据库减lessMS Access中打开后的文件大小。 为什么?

我目前正在学习如何使用ADO从VBA(从Excel运行)创build数据库和表。 我能够创build格式.mdb(使用连接“Microsoft.Jet.OLEDB.4.0;”)或.accdb(使用连接“Microsoft.Ace.OLEDB.12.0;”)的数据库 – 我能够创build表格和插入logging。 到现在为止还挺好。

但是,我注意到,通过ADO创build这样一个数据库之后,如果我在MS Access中打开它,文件大小会大大减less。 注意:只要在Access中打开它的动作就有这个效果。 我没有对那里的数据做任何改变。

一个例子:一个新创build的ADO数据库是1304k; 然后在Access中打开后是816k。

据我所知,在Access中打开时没有数据丢失。 我只能猜测,Access是以某种方式在打开数据库时自动优化数据库,或者除去ADO插入的不必要的东西。 显然,我更喜欢文件大小尽可能小。 所以我想知道:

1)有人知道这里发生了什么事吗?

2)如果ADO插入不必要的数据,有什么办法可以通过编程来优化它吗? 我的最终用户只会运行Excel,所以我不能要求他们定期在Access中打开数据库来优化数据。

不知道你是如何创build表,导入logging,结构和模式; 或您的环境2000/02/03 mdb或2007/10/13 accdb版本,机器(32位/ 64位,笔记本电脑/台式机),Windows操作系统(XP,Vista,7,8,10),单CPU或局域网,只能推测。

首先了解奇怪的是很难定义MS Access的程序。 本质上,MS Access是一套连接对象:Jet / ACE SQL引擎,GUI前端应用程序,报告生成器和IDE编码接口。 它实际上并不是一个数据库,但默认情况下,ACE引擎顺便说一下,不仅限于MS Access,而且完全是可用于所有Office和其他PC应用程序的Windows技术(.dll文件)。 Excel甚至可以在没有Access的情况下运行accdb / mdb文件! 与其他文件服务器(stream行的,开放源码的),SQLite和客户端服务器(SQL Server,MySQL,PostgreSQL)等其他数据库相比,它是真正的Jet / ACE组件,它是被比较的关系引擎。 有趣的是,Access可以通过切换默认值来连接到上述的所有RDBMS。

因此,MS Access的多面性使得在SQL后端引擎和VBA前端中使用临时对象,与硬盘和内存交互,特别是在导入logging和各种查询中。 即使是MSN网站在其Compact和修复页面上也提到了它。

Access创build临时的隐藏对象来完成各种任务。 有时候,这些临时对象保留在您的数据库中后,Access不再需要它们。

此外,生成表和动作查询(append / update / delete)实际上在提交最终更改之前复制整个结果集。 因此,会提示用户在更改完成之前添加的logging数有回滚操作的机会。 所以在迁移数据之后,你的数据库可能会稍微回到原来的状态。 然后, VBA中的垃圾回收会在对象不再使用时释放内存,并且OLEDB驱动程序停止连接。 您可能会看到文件大小有所不同,因为在VBA处理完成并超出范围后,某些空间已被恢复。 我想知道你在什么情况下查看较大的Access文件? 刷新Windows资源pipe理器或CPU重新启动会改变视图? 您是否阅读过文件的属性(从右键单击)或资源pipe理器的细节部分,在近似方面有所不同? 你见证了其他文件大小的变化,如在Excel工作簿? 这是经常发生还是exception?

单纯以代码方式pipe理数据库创build过程可能是使用数据库而不是使用Access的graphics用户界面作为多用户访问locking和应用程序对象的最有效方式,这会增加一些开销。

总而言之,ADO不可能在没有开发知识的情况下添加任何数据或组件。 定期, 反编译,压缩 ,并显式删除VBA对象(即set obj = Nothing )。 查看有用的性能提示 。 此外,不要过分关注文件大小,但应用程序的性能和完整性,文件大小将是一个波动的指标。 最后要注意的是,虽然Excel非常stream行且易于使用,但是对于MS Access强大的本地组件,可以考虑在Access中开发您的最终用途需求(由于Jet是Windows技术,因此免费运行时可通过Microsoft获得)。 在各方面,Access提供了一个更加稳定的多用户应用程序和自动化环境。

在Access中打开“Access数据库文件”时,会在数据库文件内添加/创build/更新“Access应用程序项目”。 这基本上只是在数据库中添加一些额外的斑点/表格/数据,如果他们缺less。 它会检查文件并将文件长度截断为正确的文件长度。

当它这样做的时候,它可能会纠正文件长度错误,或者丢弃一些未使用的文件,或者只是调整为此目的而保留的空间量。 但无论如何,它实际上是在做一些无法做到的事情,它使用的是不同的默认值,而不是其他方式。

在较旧的版本中,当它这样做时,它总是使文件变大。 现在,在您的计算机上,使用您的版本,它使文件更小。 这可能是由于原始文件创build中的错误,或者可能是“行为是出于意图”。 你不能改变,所以你不应该担心。

但是,截断未使用的文件空间并不总是一个好主意:如果要将数据添加到文件中,则只需要请求更多的文件空间。 而mdb文件的不同版本库对于压缩数据库文件的“最佳”方式有不同的想法,并且会给出不同的文件长度。

话虽如此,过去有可能使用JRO或DAO来压缩和修复数据库文件(mdb)。 这将丢弃未使用的对象(压缩)并更正文件长度并删除挂起的引用(修复)。 我不知道ACE的任何类似的function,但我没有看。

访问可能会在closures数据库时压缩数据库。 有一个名为Compact on Close的设置,用于确定当您退出数据库时是否自动压缩数据库。

Microsoft Office支持 – 压缩并修复数据库