在同一个应用程序中混合 DAO 和 ADO 并不会真正带来任何问题或复杂性。我认为您的问题确实与您何时以及为什么要使用其中一个有关。
我自己在 Access 开发中的标准策略是仅当 DAO 不能用于我想做的事情时才使用 ADO。例如,使用 ADO,您可以访问 Access 以外的数据存储,例如 Visual Foxpro、Oracle、MySQL 等。但也并非总是需要 ADO 来实现这一点,因为您通常可以使用 ODBC,这意味着您将使用DAO 与 ODBC 链接表一起使用。
最近,我有点转向我更喜欢专门使用 ADO 的地方,但我认识到这不是许多有经验的 Access 开发人员的常见做法。我正在使用 SQL Server 2008/2012 Express 和绑定到 ADO 记录集的表单,并且我完全避免使用任何 ODBC 链接表。我的基本原因是 ADO 为我提供了更多选择和更多控制权,尽管它确实带来了成本。我使用了很多断开连接的记录集,然后只有当用户单击保存按钮时,我才“手动”(VBA)将更改写回数据库。这使用户可以选择对表单及其子表单进行大量更改,但如果他选择,仍然可以取消。对于断开连接的 ADO 记录集,由您决定如何将数据更改到服务器,尽管未断开连接的记录集会自动提交其更改。据我所知,唯一能自动从服务器接收所有添加、更改和删除的 ADO 记录集类型 (adOpenDynamic)不能绑定到表单,但如果您只想能够使用 ADO 绑定表单来添加/编辑/删除记录,那真的不是一个大问题。
我读过很多地方,ADO 与 DAO 相比没有任何性能优势,在某些情况下实际上可能更慢。我不能说任何一种方式,但我认为这不是一个大问题。ADO 的优势在于,您实际上可以使您的应用程序在缓慢和/或不稳定的网络连接(例如 WAN/Internet)上工作,而这对于 DAO/ODBC 来说实际上是不可行的。使用纯 ADO 解决方案,您负责处理连接对象和所有数据提取。您可以设置连接和命令超时,如果发生超时、连接失败等,由您决定如何处理。例如,您可以进行 X 次重新连接尝试。在 DAO/ODBC 中,这一切都是不可能的。据我所知,连接对象甚至没有使用 ODBC 公开,
在 ADO 中执行所有操作确实需要更多代码,特别是如果您想使用断开连接的记录集。必须使用代码获取(或制造)记录集。如果您使用断开连接的记录集,则必须使用代码将数据写回服务器。无论您使用断开连接还是连接记录集,表单上的主/子关系都必须使用代码手动管理(您不能使用主/子链接属性)。
ADO 的一个潜在缺点是,除非您使用 Access Data Project,否则无法将报表绑定到 ADO 记录集,目前不建议这样做,因为 MS 正在放弃对 ADP 的支持。如果您想对报表上的数据使用 DAO 以外的其他东西,则必须使用 Pass Through Queries,如果您的数据存储是 MS Access,那么这样做是没有意义的。
我认为任何关于绑定和非绑定表单的讨论都与任何关于 DAO 和 ADO 的讨论完全无关。表单可以绑定到 ADO 记录集,只需很少的权衡。未绑定的表单可以从 DAO 记录集或 ADO 记录集获取它的数据,并且没有区别,因此未绑定的表单和 ADO 与 DAO 和未绑定的表单相比,彼此之间不再相关或不相关。我真的只使用未绑定的表单来创建我自己的消息框和某些类型的输入框或记录选择框。通常情况下,我希望数据显示在触摸屏应用程序的按钮上,然后我就没有绑定了。如果我可以从文本框获得类似的行为(如果我足够努力的话,我可能会这样做),那么在少数情况下需要未绑定的表单。
在我看来,有一种观点认为,未绑定的表单是真正的专业人员开发 Access 应用程序的方式。或者,未绑定的表单是获得性能的唯一途径。或者,如果您不使用 MS Access 作为数据存储,则应使用未绑定的表单。但这些想法都没有真正经得起任何审查。将表单绑定到 ADO 记录集比完全解除绑定要容易得多。甚至不可能以不受约束的方式使用数据表视图或连续表单。如果您真的想在网格样式视图中不受限制,则必须使用 ActiveX 网格控件,例如 10tec 的 iGrid,或 MS List View 控件,因为需要时间来获取记录,因此通常会产生更多开销以及用数据填充网格控件所需的额外时间。未绑定的表单在将表单绑定到 ADO 记录集时没有任何性能提升。确实没有一种数据存储不能使用 ADO 记录集,即使您必须使用伪造的 ADO 记录集。
这是一个巨大的过度简化,但您在 MS Access 中的主要性能提升来自最大化数据存储的性能(这通常意味着迁移到 SQL Server)和仔细管理您加载和呈现给用户的数据量。实现后者的最简单方法是使用 ADO,但您也可以使用 DAO/ODBC 来实现。ODBC 实际上比 ADO 有一个优势,称为延迟加载。您可以将数据表表单或连续子表单绑定到非常大的表/DAO 记录集,并且在您滚动时会加载每条记录。这是一个我不太喜欢的功能,我有用户抱怨它,因为在你释放滚动条之前你看不到记录,但我不得不争辩说它是最喜欢的功能之一处理大量数据(> 50,000 条记录)的有效方法。
UtterAccess Wiki 上有一篇相当广泛的文章,详细介绍了 DAO 与 ADO 的优缺点(请注意,该文章已被删除,查看它的唯一方法是查看当时的历史。只要确保你在差异/比较下方向下滚动)。AccessExperts.com 上还有另一篇由 Juan Soto 撰写的关于未绑定表单的精彩文章。