ADO和DAO的区别

22
这不是一个关于哪个更好的问题,而是一个关于它们在功能上为什么不同的问题。我遇到的问题已经解决了,但我很好奇为什么会发生这种情况。
背景 - 使用Excel vba从Access数据库中提取数据。当用户点击按钮时,会从Access获取记录集,并将各种数据填充到电子表格中。然后,从另一个查询中获取另一个记录集以填充电子表格的另一部分。
ADO的作用 - ADO非常适合我的第一个记录集。但是,我的第二个记录集进入Access中的查询,运行并返回零行。如果我在Access中运行此查询,它确实会打开(大约需要3到4秒钟)。此查询具有多个连接、计算项、限制和可能的Union查询(我尝试了许多不同的方式,包括/不包括union等)。我尝试关闭并重新打开ado连接。我尝试更改超时值,甚至测试使用ADO命令运行“制表”查询,然后从表中提取数据(顺便说一下,这样做是有效的,但不是最佳方案,因为数据不断变化,我不想每次有人使用此工具时都运行制表查询)。
所以,我将第二个数据提取更改为DAO,结果它有效了。第一个数据提取仍然是ADO(我通常更喜欢使用它),但现在考虑将其更改为DAO,因为我宁愿在代码中只使用一种数据访问方法。
那么,有人能够向我解释为什么在某些情况下ADO无法提取数据,而DAO可以吗?再次强调,这纯粹是为了信息目的。

1
如果没有看到你的代码,很难进行评论,但这可能是游标类型/记录集类型问题。你在代码中依赖默认设置吗?如果你仅使用Access,DAO是更好的选择,因为它是Access本地支持的并且比ADO提供更多的控制。 - SWa
2
你是否使用通配符?这是一个常见的问题,对于ADO来说,通配符是%,而对于DAO来说通常是*。 - Fionnuala
@Remou,我熟悉两者之间通配符的差异,但不幸的是我在查询中没有使用它们。 - APrough
@Kyle,cursortype 是 adClient,recordset 是 adDynamic 和 asLockOptimistic(不是很确定,代码不在我面前)。我使用一个标准例程来设置所有的记录集,因此所有的查询都通过它进行。第一个运行了,第二个没有,改为从表中获取,就成功了。因此,游标/记录集问题可能不是问题所在。 - APrough
3个回答

15

DAO是Jet(Ms-Access)数据表的本地数据访问方法。ADO "Active X Data Objects"则是与几乎所有类型的数据库友好连接的行业标准。

对于标准查询而言,如果ADO无法返回记录,而DAO可以的话,我怀疑是查询还涉及Access数据库中的项目参数。如果是这种情况,ADO将无法工作,因为它不具有使用这些参数的选项,只是Excel的外部引用。使用DAO方法将触发Access运行查询,从而能够访问自己的参数/引用。


@Matt Donnan - 参数不应该是问题;这两个查询都使用它们,在我将其更改为表格后,仍然使用它们。一定有其他地方,查询过程花费了太长时间或者其他原因。但是,我喜欢你的评论“使用DAO方法将触发Access运行查询而不是Excel,因此它将能够访问自己的参数/引用”。也许ADO正在让Excel尝试处理查询,结果丢失了? - APrough
@creamyegg 和 Kyle。我同意 DAO 可能是更好的选择,但我通常使用 ADO 对 SQL Server 进行操作,而且我的习惯难以改变,大多数情况下使用 ADO 是可以的,直到我遇到这样的问题 :P 哦,好吧,需要让自己从现在开始使用 DAO(在这些类型的项目中)。 - APrough
2
@APrough 是的,确认一下,ADO 将会让 Excel 运行查询并将 Access 当做数据源,而 DAO 则是让 Access 运行查询并将数据返回给 Excel。正如有些人所提到的,DAO 适用于 Access,而 ADO 则适用于专用服务器,如 MS SQL、Oracle、MySQL 等等。 - Matt Donnan

6

我认为这个问题已经被很好地回答了,但我想增加另一个优秀的(尽管有些难以找到)比较DAO和ADO的资源。它主要针对具有Access表单和报告的Access应用程序,但这里的许多信息也适用于在Excel中编写的解决方案。

UtterAccess维基文章:选择DAO和ADO之间的区别


请您能否澄清我在阅读这篇文章时遇到的困惑。我的问题在这里:https://stackoverflow.com/questions/54073174/how-does-cursors-work-in-ado-and-dao-connection - jedu

4
在Visual Basic中,有三种数据访问接口可供使用:ActiveX Data Objects(ADO)、Remote Data Objects(RDO)和Data Access Objects(DAO)。数据访问接口是表示访问数据的各个方面的对象模型。使用Visual Basic,您可以以编程方式控制连接、语句生成器和返回的数据,以用于任何应用程序。
为什么在Visual Basic中有三个数据访问接口?数据访问技术不断发展,每个接口代表了不同的技术水平。最新的是ADO,它具有比RDO或DAO更简单但更灵活的对象模型。对于新项目,您应该使用ADO作为数据访问接口。

所以 ADO 比 DAO 更加现代化。 - Timo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接