基于Excel VBA,创建ADODB objects 还是使用DOCMD.RUNSQL 更好?哪些是赞成和反对?

Based on Excel VBA, is it better to create ADODB objects Or to use DOCMD.RUNSQL? Which are the pro & contra?

根据标题,创建 ADODB objects 还是访问 object 然后使用 DOCMD.runsql 更好?我通常使用 Excel 工作表并访问 table。哪种方法更快,哪种方法最灵活可靠?有一些具体的赞成或反对吗?

简短的回答是:

  1. ADODB 更快、更可靠,而且它可能具有 您需要的功能;
  2. Access Application 对象有更丰富的功能,如果你真的 需要它;
  3. Access Application 对象可能(也可能不会!)允许您运行 SQL 并查询嵌入了 VBA.
  4. 的对象

更详细...

如果您使用的是 DoCmd,则您已经将 MSAccess.exe 的副本实例化为您的 Access Application 对象的一部分 - 这会占用大量内存,并且需要几秒钟才能启动:不是你想为琐碎的任务做的事情。

但是,您现在可以使用所有 Access 应用程序对象的方法和属性 - 不仅仅是 DoCmd,您还可以使用所有 CurrentDB 对象,包括 querydefs 集合。因此,如果它是一项复杂的任务,而不仅仅是 'run this trivial query',Access Application 对象具有优势。

一个很大的缺点是您不能将此 sheet 分发给在其工作站上没有 MSAccess.exe 的用户:他们的 VBA 无法创建实例MS-Access 应用程序及其 DoCmd 方法。

创建 ADODB 对象要快得多,每个 MS-Office 的人都有 MS-Access 的 OLEDB 数据库驱动程序,即使他们没有 'Professional' 版本的 Office 或 MS-Access 在他们的机器上。

对象实例化是这里的大性能问题:MS-Access 的 ADODB 对象和 OLEDB 数据库驱动程序也将 运行 查询比 MS-Access.exe 稍快,但这不是您会注意到性能优势。

请注意,ADODB 连接对象将为您提供详细的错误和状态信息,并且您可以设置超时(在连接上,以及命令对象或记录集对象上)以防止查询缓慢或失败MS-Access 进程。

如果您是一位经验丰富的开发人员,并且精通 event-driven 编程和 Access 最新 OLEDB 驱动程序的详细属性,您可能 能够获得SQL 到 运行 异步 - 启动命令,将控制权交回 Excel 并让用户继续工作,直到 ADO 对象引发 'completed' 事件。因此,如果您不需要数据,您可以 运行 SQL 作为 fire-and-forget 操作,并且您可以在流程完成时使用事件过程在代码中启动响应 -或向用户报告错误。

但是,如果这是关于将数据返回到 Excel table 或图表对象,built-in 查询工具现在 (Office 2013) 比您在VBA,无论是 DoCmd 还是 ADODB:即使使用异步 ADO,第一块数据始终是同步的,并且您的 Excel 会话被 'asynchronous' VBA 命令锁定,直到到了。

您的 ADODB 对象肯定无法 运行 SQL 嵌入 VBA 命令 - 本机 VBA 或 [=62 中编写的自定义代码=] 数据库 - 这可能会让您大吃一惊:NZ() 函数在 Jet SQL 中非常常见,它是在 Access 中编写的,如果您的 SQL 它不会 运行在 MS-Access 环境之外调用。其他 VBA 内含物不太明显,string-handling 是一个特别的混淆来源:this Stack Overflow answer gives a detailed explanation。但是,我不确定您是否可以 运行 Jet_SQL 从 MS-Access 应用程序对象中使用嵌入式 VBA 查询,如果它在另一个 VBA-enabled 中实例化应用程序:我从来没有尝试过,很可能你只能 运行 一个 VBA-encumbered Jet-SQL 与 MS-Access 的实际用户会话。 你需要测试一下!

一个快速性能提示:您的 SQL 实际上是 MS-Access 数据库中保存的查询(DAO Querydef 对象)的名称吗?如果是这样,请将其 运行 视为 ADODB.Command 对象而不是将其作为 SQL 文本执行;或使用 'adCmdStoredProc' 选项打开记录集(和 运行 'execute' 方法):

rst.Open SQL, , , , adCmdStoredProc

此外,如果 beginner-to-intermediate 开发人员正在阅读本文以寻找相关问题的答案,请检查您的 SQL 是否在查询 externally-defined 链接的 table 或MS-Access 数据库中的 'pass-through' 查询:直接连接到任何实际托管数据的 ADODB 对象将 运行 快得多。

目前我能想到的就是这些,我希望其他 Stackers 继续添加这个答案,以便我们得到一个全面的列表。