我目前正在学习如何创建数据库&使用VBA中的ADO(从Excel运行)的表。我能够创建格式为.mdb(使用连接" Microsoft.Jet.OLEDB.4.0;")或.accdb(使用连接" Microsoft.Ace.OLEDB.12.0; ") - 我能够创建表格并插入记录。到目前为止一切都很好。
但是,我注意到,在通过ADO创建这样的数据库后,如果我在MS Access中打开它,文件大小会急剧减少。注意:只是在Access中打开它的操作有这种效果。我没有对那里的数据进行任何更改。一个例子:来自ADO的新创建的数据库是1304k;然后在Access中打开它的816k。
据我所知,在Access中打开数据时没有数据丢失。我只能猜测Access在打开时会以某种方式自动优化数据库,或以其他方式摆脱ADO插入的不必要的东西。显然,我希望文件大小尽可能小。所以我想知道:
1)有谁知道这里发生了什么?
2)如果ADO正在插入不必要的数据,有什么方法可以通过编程方式对其进行优化?我的最终用户将只运行Excel,因此我无法要求他们定期在Access中打开数据库以优化数据。
答案 0 :(得分:1)
不知道如何创建表,导入记录,结构和模式;或您的环境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可以运行accdb / mdb文件,甚至没有安装Access!与其他数据库(如另一个文件服务器(流行的,开源的)对应的,SQLite和客户端服务器(SQL Server,MySQL,PostgreSQL))相比,它实际上是Jet / ACE组件,它是被比较的关系引擎。有趣的是,Access可以通过切换其默认值来连接到上述所有RDBMS。
据说,MS Access的多面性使用SQL后端引擎和VBA前端中的临时对象,与硬盘和内存交互,尤其是在导入记录和各种查询时。甚至MSN网站也在其Compact and repair页面上提到了它。
Access创建临时隐藏对象以完成各种任务。 有时,这些临时对象之后会保留在您的数据库中 访问不再需要它们。
此外,make-table和action查询(append / update / delete)实际上会在提交最终更改之前复制整个结果集。因此,系统会提示用户在更改完成之前添加的记录数量以及回滚操作的机会。因此,在迁移数据后,您的数据库可能会稍微返回到以前的状态。然后,garbage collection in VBA在对象不再使用且OLEDB驱动程序停止连接时释放内存。您可能会看到文件大小有所不同,因为在您的VBA处理完成并超出范围后,某些空间已恢复。我想知道你在什么情况下查看了较大的Access文件?刷新的Windows资源管理器或CPU重新启动会更改视图吗?您是否阅读了文件的属性(从右键单击)或资源管理器的近似值不同的部分?您是否见过Excel工作簿中的其他文件大小更改?这是经常发生还是异常?
管理数据库创建过程purely in code可能是使用数据库的最有效方式,而不是使用Access'图形用户界面作为多用户访问锁定和应用程序对象增加了一些开销。
总而言之,如果没有您的开发知识,ADO不太可能添加任何数据或组件。定期decompile, compact,并明确删除VBA对象(即set obj = Nothing
)。见帮助performance tips。此外,在应用程序的过程中,不要过分关注文件大小但性能和完整性,文件大小将是一个波动的指标。最后一点,尽管Excel非常受欢迎且易于使用,正如提到的MS Access强大的本机组件,考虑在Access中开发最终用户需求(免费runtimes可通过Microsoft获得,因为Jet是一个允许的Windows技术)。在每个方面,Access都提供了更稳定的多用户应用程序和自动化环境。
答案 1 :(得分:1)
当您打开" Access数据库文件"在Access中,它添加/创建/更新了一个" Access应用程序项目"在数据库文件中。它基本上只是在数据库中添加一些额外的blob /表/数据,如果它们丢失了。它会检查文件并将文件长度截断为正确的文件长度。
当它这样做时,它可能正在纠正文件长度错误,或丢弃一些未使用的残余,或者只是调整为此目的而保留的空间量。但无论如何,它实际上正在做一些不能以任何其他方式完成的事情,而且它使用的是与你从其他方式不同的默认值。
在旧版本中,当它执行此操作时,它总是使文件更大。现在,在您的计算机上,使用您的版本,它会使文件变小。这可能是因为原始文件创建中的错误,或者可能是"行为是出于意图"。你不能改变它,所以你不应该担心它。
但是截断未使用的文件空间并不总是一个好主意:如果要将数据添加到文件中,则只需要请求更多的文件空间。并且mdb文件的不同版本库对于" best"压缩数据库文件的方法是,并且会给出不同的文件长度。
话虽如此,它曾经可以紧凑和使用JRO或DAO修复数据库文件(mdb)。这将丢弃未使用的对象(压缩)并更正文件长度并删除挂起引用(修复)。我不知道ACE有任何类似的功能,但我还没看好。
答案 2 :(得分:0)
访问可能会在关闭数据库时压缩数据库。有一个名为 Compact on Close 的设置,用于确定退出数据库时是否会自动压缩数据库。