在Access应用程序中混合ADO和DAO

时间:2013-09-02 15:01:24

标签: ms-access access-vba ado ms-access-2010 dao

我正在制作一个将独家使用Jet(无SQL Server)的Access应用程序,并拆分为前端后端架构。我已经衡量了绑定/未绑定的利弊,并且仍然希望在这种情况下不受约束。

我有一些类和模块,我将导入到依赖于ADO记录集的项目中。但是,我已经阅读了几个建议,建议使用DAO填充Access表单http://support.microsoft.com/kb/281998 {Microsoft Jet的要求}。我知道这些是完全不同的库,不能彼此共享信息。但是,我认为我的类和其他ADO依赖对象可以使用本地表/查询和表单控制值的混合,以避免潜在的冲突。

所以我的问题:如果我只是我们DAO来填写这个项目的表格,我还在惹麻烦吗?如果是这样,我应该注意哪些问题?或者,如果我小心的话,期望这种分离可以共存是否合理,并且在应用程序文档中解释了这种区别?

1 个答案:

答案 0 :(得分:9)

在同一个应用程序中混合使用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)cannot be bound to a form的所有添加,更改和删除,但如果您只是想要,那真的不是一个大问题能够使用ADO绑定表单添加/编辑/删除记录。

我已经阅读了很多地方,ADO与DAO相比没有任何性能优势,在某些情况下可能实际上更慢。我不能说这种或那种方式,但我不认为这是一个大问题。 ADO的优势在于,您实际上可以使您的应用程序在缓慢和/或不稳定的网络连接(例如WAN / Internet)上工作,这对于DAO / ODBC来说实际上是不可行的。使用纯ADO解决方案,您负责处理连接对象和所有数据提取。您可以设置连接和命令超时,如果发生超时,连接失败等,由您决定如何处理它。例如,您可以进行X次重新连接尝试。在DAO / ODBC中,这一切都不可能。据我所知,除了可以设置ODBC连接字符串之外,连接对象甚至不会暴露在ODBC中。

在ADO中执行所有操作需要更多代码,特别是如果要使用断开连接的记录集。必须使用代码获取(或制作)记录集。如果使用断开连接的记录集,则必须使用代码将数据写回服务器。无论您使用断开连接还是已连接的记录集,表单上的主/子关系都必须使用代码手动管理(您不能使用主/子链接属性)。

ADO的一个潜在缺点是,除非您使用的是访问数据项目,否则无法将报告绑定到ADO记录集,此时此时并未真正推荐,因为MS是放弃对ADP的支持。如果你想在报告上使用DAO以外的东西,你必须使用Pass Through Queries,如果你的数据存储是MS Access,那么这样做是没有意义的。

我认为关于绑定和未绑定表单的任何讨论都与任何有关DAO和ADO的讨论完全无关。表单可以绑定到ADO Recordset,只需很少的权衡。未绑定的表单可以从DAO Recordset或ADO Recordset获取它的数据,并且没有区别,因此未绑定的表单和ADO与DAO和未绑定的表单之间不会相互关联或不相关。我真的只使用未绑定的表单来创建我自己的消息框和某些类型的输入框或记录选择框。通常情况下,我希望数据显示在触摸屏应用程序的按钮上,然后我会解除绑定。如果我可以从Textboxes获得类似的行为(如果我足够努力的话,我可能会这样做),很少有需要未绑定表单的情况。

在我看来,传播的想法是,未绑定的表单是真正的专业人员开发Access应用程序的方式。或者,未绑定的表单是获得性能的唯一方式。或者,如果您未使用MS Access作为数据存储,则应使用未绑定的表单。但这些想法都没有真正能够经得起任何审查。将表单绑定到ADO记录集要比完全未绑定更容易。并且甚至不能以未绑定的方式使用数据表视图或连续表单。如果你真的想在网格式视图中解除束缚,你必须使用ActiveX网格控件,例如来自10tec的iGrid,或者MS List View控件,它通常会有更多的开销,因为需要时间来获取记录和用数据填写网格控件所需的额外时间。未绑定的表单没有性能提升,我可以考虑将表单绑定到ADO记录集。即使您必须使用伪造的ADO记录集,也不存在无法使用ADO Recordset的数据存储。

这是一个极大的过度简化,但MS Access中的主要性能提升来自最大化数据存储的性能(通常意味着迁移到SQL Server)并仔细管理您加载并呈现给用户的数据量。执行后者的最简单方法是使用ADO,但您也可以使用DAO / ODBC。 ODBC实际上比ADO有一个优势,称为延迟加载。您可以将数据表表单或连续子表单绑定到一个非常大的表/ DAO记录集,并在滚动时进行每条记录的加载。它是一个我不太喜欢的功能,我已经让用户抱怨它,因为你没有看到记录,直到你发布滚动条,但我不得不认为这是处理大量数据的最有效方式之一(> 50,000条记录)。

有一个相当广泛的article on the UtterAccess Wiki that details the pros and cons of DAO versus ADO(请注意,该文章已删除,查看它的唯一方法是查看一次的历史记录。只需确保向下滚动差异/比较)。还有另一个great article on unbound forms at AccessExperts.com written by Juan Soto