由 ADO(来自 VBA)创建的数据库在 MS Access 中打开后减小了文件大小。为什么?
Database created by ADO (from VBA) reduces file size after opening in MS Access. Why?
我目前正在学习如何使用来自 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 中打开数据库来优化数据。
当您关闭数据库时,Access 可能正在压缩数据库。有一个名为 Compact on Close 的设置,用于确定数据库是否会在您退出时自动压缩。
在不知道具体如何创建 table 的情况下,导入记录、结构和模式;或者你的环境 2000/02/03 mdb or 2007/10/13 accdb version, machine (32-bit/64-bit, laptop/desktop), Windows OS (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 服务器,MySQL,PostgreSQL ) 它实际上是被比较的关系引擎的 Jet/ACE 组件。有趣的是,Access 可以通过关闭其默认设置来连接到所有上述 RDBMS。
话虽如此,MS Access 的多方面特性在 SQL 后端引擎和 VBA 前端都使用了临时对象,与硬盘和内存交互,尤其是在导入记录和各种查询。甚至 MSN 网站在其 Compact and repair 页面上也提到了它。
Access creates temporary, hidden objects to accomplish various tasks.
Sometimes, these temporary objects remain in your database after
Access no longer needs them.
此外,make-table 和操作查询 (append/update/delete) 实际上会在提交最终更改之前复制整个结果集。因此,系统会提示用户在更改完成之前添加的记录数,并有机会回滚操作。因此在迁移数据后,您的数据库可能会略微恢复到以前的状态。然后,当对象不再使用且 OLEDB 驱动程序断开连接时,garbage collection in VBA 会释放内存。您可能会发现文件大小有所不同,因为某些 space 在您的 VBA 处理完成并超出范围后被恢复。我想知道您在什么情况下查看了较大的 Access 文件?刷新 Windows Explorer 或 CPU 重新启动会改变视图吗?您是否阅读了文件属性(通过右键单击)或资源管理器的详细信息部分,它们的近似值不同?您是否看到 Excel 工作簿中的其他文件大小变化?这是经常发生还是异常?
管理数据库创建过程 purely in code 可能是使用数据库而不是使用 Access 图形用户界面的最有效方式,因为多用户访问锁定和应用程序对象会增加一些开销。
总而言之,ADO 不太可能在您不具备开发知识的情况下添加任何数据或组件。通常,decompile, compact, and explicitly remove VBA objects (i.e., set obj = Nothing
). See helpful performance tips. Also, don't focus too much on file size but performance and integrity as over the course of app, file size will be a fluctuating metric. One final note, though Excel is very popular and easy to use, as mentioned about the powerful native components of MS Access, consider developing your end use needs in Access (free runtimes 可通过 Microsoft 获得,这是允许的,因为 Jet 是一项 Windows 技术)。在每个方面,Access 都提供了一个更 stable 的多用户应用程序和自动化环境。
当您在 Access 中打开一个 "Access database file" 时,它 adds/creates/updates 一个 "Access application project" 在数据库文件中。如果缺少 are/it,它基本上只是在数据库中添加一些额外的 blobs/tables/data。它会检查文件并将文件长度截断为正确的文件长度。
执行此操作时,它可能会更正文件长度错误,或丢弃一些未使用的垃圾,或只是调整为此目的保留的 space 的数量。但无论如何,它实际上正在做一些其他方式无法做到的事情,而且它使用的默认值与您通过任何其他方式获得的默认值不同。
在旧版本中,当它这样做时,它总是使文件变大。现在,在您的计算机上,使用您的版本,它会使文件变小。这可能是因为原始文件创建中的错误,也可能是 "behavior is by intent"。你无法改变它,所以你不应该担心它。
但是截断未使用的文件并不总是一个好主意space:如果您要向文件添加数据,您只需要请求更多文件space。并且 mdb 文件的不同版本库对 "best" 压缩数据库文件的方式有不同的想法,并且会给出不同的文件长度。
话虽如此,过去可以使用 JRO 或 DAO 压缩和修复数据库文件 (mdb)。这将丢弃未使用的对象(紧凑)并更正文件长度并删除挂起的引用(修复)。我不知道 ACE 有任何类似的功能,但我没看过。
我目前正在学习如何使用来自 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 中打开数据库来优化数据。
当您关闭数据库时,Access 可能正在压缩数据库。有一个名为 Compact on Close 的设置,用于确定数据库是否会在您退出时自动压缩。
在不知道具体如何创建 table 的情况下,导入记录、结构和模式;或者你的环境 2000/02/03 mdb or 2007/10/13 accdb version, machine (32-bit/64-bit, laptop/desktop), Windows OS (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 服务器,MySQL,PostgreSQL ) 它实际上是被比较的关系引擎的 Jet/ACE 组件。有趣的是,Access 可以通过关闭其默认设置来连接到所有上述 RDBMS。
话虽如此,MS Access 的多方面特性在 SQL 后端引擎和 VBA 前端都使用了临时对象,与硬盘和内存交互,尤其是在导入记录和各种查询。甚至 MSN 网站在其 Compact and repair 页面上也提到了它。
Access creates temporary, hidden objects to accomplish various tasks. Sometimes, these temporary objects remain in your database after Access no longer needs them.
此外,make-table 和操作查询 (append/update/delete) 实际上会在提交最终更改之前复制整个结果集。因此,系统会提示用户在更改完成之前添加的记录数,并有机会回滚操作。因此在迁移数据后,您的数据库可能会略微恢复到以前的状态。然后,当对象不再使用且 OLEDB 驱动程序断开连接时,garbage collection in VBA 会释放内存。您可能会发现文件大小有所不同,因为某些 space 在您的 VBA 处理完成并超出范围后被恢复。我想知道您在什么情况下查看了较大的 Access 文件?刷新 Windows Explorer 或 CPU 重新启动会改变视图吗?您是否阅读了文件属性(通过右键单击)或资源管理器的详细信息部分,它们的近似值不同?您是否看到 Excel 工作簿中的其他文件大小变化?这是经常发生还是异常?
管理数据库创建过程 purely in code 可能是使用数据库而不是使用 Access 图形用户界面的最有效方式,因为多用户访问锁定和应用程序对象会增加一些开销。
总而言之,ADO 不太可能在您不具备开发知识的情况下添加任何数据或组件。通常,decompile, compact, and explicitly remove VBA objects (i.e., set obj = Nothing
). See helpful performance tips. Also, don't focus too much on file size but performance and integrity as over the course of app, file size will be a fluctuating metric. One final note, though Excel is very popular and easy to use, as mentioned about the powerful native components of MS Access, consider developing your end use needs in Access (free runtimes 可通过 Microsoft 获得,这是允许的,因为 Jet 是一项 Windows 技术)。在每个方面,Access 都提供了一个更 stable 的多用户应用程序和自动化环境。
当您在 Access 中打开一个 "Access database file" 时,它 adds/creates/updates 一个 "Access application project" 在数据库文件中。如果缺少 are/it,它基本上只是在数据库中添加一些额外的 blobs/tables/data。它会检查文件并将文件长度截断为正确的文件长度。
执行此操作时,它可能会更正文件长度错误,或丢弃一些未使用的垃圾,或只是调整为此目的保留的 space 的数量。但无论如何,它实际上正在做一些其他方式无法做到的事情,而且它使用的默认值与您通过任何其他方式获得的默认值不同。
在旧版本中,当它这样做时,它总是使文件变大。现在,在您的计算机上,使用您的版本,它会使文件变小。这可能是因为原始文件创建中的错误,也可能是 "behavior is by intent"。你无法改变它,所以你不应该担心它。
但是截断未使用的文件并不总是一个好主意space:如果您要向文件添加数据,您只需要请求更多文件space。并且 mdb 文件的不同版本库对 "best" 压缩数据库文件的方式有不同的想法,并且会给出不同的文件长度。
话虽如此,过去可以使用 JRO 或 DAO 压缩和修复数据库文件 (mdb)。这将丢弃未使用的对象(紧凑)并更正文件长度并删除挂起的引用(修复)。我不知道 ACE 有任何类似的功能,但我没看过。