在Access 2007中使用ADO或DAO更好吗?

时间:2009-06-24 15:49:00

标签: vba ms-access ms-access-2007

在Access 2007中创建新数据库时,是否应使用ADO(ActiveX数据对象)或DAO(数据访问对象)?

编辑:此数据库的一部分将从Excel 2007电子表格导入数据。

7 个答案:

答案 0 :(得分:15)

[对于记录,曾经'Jet'的官方名称现在是'Access数据库引擎'。]

对于ACE(Access2007引擎.accdb格式)功能,它必须是ACEDAO。

对于Jet 4.0功能,它必须是ADO经典。

对于Jet 3.51功能及更早版本,请选择ADO或DAO。两者都有优点和缺点。绝大多数Access数据库引擎功能对两者都是通用的;相互排斥的功能是有争议的边缘。也许是生活方式的选择,但没什么大不了的。智能编码器使用两者中最好的:)

我已经使用了很多,ADO是我个人的偏好。它比DAO更现代,所以在架构上它是一种改进:更平坦的对象模型,没有DAO的拆卸问题等。更多的属性和方法并引入事件(DAO没有),例如用于异步连接和获取记录。 ADO记录集可以断开,分层和伪造,DAO记录集不能。基本上,他们采取了DAO的好处,并使他们更好。

DAO并非没有优点。首先,您将找到比ADO for Access / Jet更多的DAO代码示例。

P.S。出于某种原因,喜欢DAO的人真的不喜欢ADO。忽略宣传。 ADO不会被弃用。 ACE具有OLE DB提供程序,是目前在64位中使用ACE的唯一方法。 ADO.NET已经取代了ADO经典,而不是VB.NET取代了Access项目中的VBA6。

编辑:只是为了澄清,“对于Jet 4.0的功能,它必须是ADO经典版”,这是因为DAO 3.6仅对Jet 4.0的新功能进行了一些增强。例如,对于DECIMAL数据类型,您无法指定比例/精度。 DAO完全没有其他功能。例如,您可以使用DAO(或ACE中的ACEDAO)在Jet 4.0中执行以下操作吗?

CREATE TABLE Test (
   col1 CHAR(4) WITH COMPRESSION DEFAULT '0000' NOT NULL, 
   CHECK (NOT EXISTS (
                      SELECT T1.col1 
                        FROM Test AS T1 
                        WHERE T1.col1 <> '0000' 
                        GROUP 
                           BY T1.col1 
                       HAVING COUNT(*) > 1
                      ))
);

(提示:具有表级数据完整性约束的可压缩固定宽度文本列。)不,你不能。

AFAIK对ACEDAO的唯一增强是针对新的ACE功能,即他们没有返回并填写DAO中的Jet 4.0空白。他们为什么要这样?我们仍然有ADO来弥补差距。更好的是,团队更有成效地花时间,比如修复那个令人讨厌的DECIMAL排序错误,对我来说最好的关于ACE; - )

答案 1 :(得分:8)

DAO是这里推荐的技术。 ADO已被大量折旧,现在正在被ADO.net取代。

DAO不仅是使用MS访问的本机和推荐数据对象模型,它还在不断增强,现在拥有一大堆用于sharepoint的新功能。在Access 2007中,我们现在拥有对SharePoint列表的支持。这意味着2007的新DAO对象模型允许使用sharepoint列表并将其视为SQL Server表。这意味着您可以在sharepoint列表上使用SQL(在那里甚至没有允许您以这种方式使用SharePoint列表的oleDB提供程序,但是使用DAO,您现在可以执行此操作)。 ADO中没有添加任何此类内容。因此,从访问(dao)角度看,SharePoint列表将这些SharePoint列表视为标准表。

此外,访问中的DAO也支持我们所谓的复杂数据类型。这样做是为了支持sharepoint中的XML列表。请记住,对于下一版本的访问(2010),我们将看到更多新的附加功能被添加到DAO(JET现在称为ACE)。

毫无疑问,DAO是正确且优秀的模型。 ADO没有再接收任何增强功能,并且已被ADO.NET取代。

因此,未来属于DAO,很明显,微软正在将其资金投入到MS访问和升级条款中。

Access 2007为其字段定义提供了多值功能,这也是支持sharepoint的增强功能的结果。但是,这些功能是JET的一部分,这些增强功能可以在没有sharepoint的情况下使用。他们现在是DAO的一部分。


编辑: 也许我会稍微扩展一下这一点,并尝试澄清我们在这里有这样对立的答案,我可以向你保证,在使用Access 2007时,你最好使用DAO。

当混淆源于此时,如果您在选择使用默认数据对象模型访问2007时查看工具引用,那么这里的问题就是它不再被称为DAO。它现在被称为ACE。

在访问2007中使用DAO时您将在工具参考中注意到,引用未设置为DAO 3.6(该版本已被折旧,现在也不再是MDAC下载的一部分)。你会注意到在ms-access中使用DAO时的新引用被称为:

Microsoft Office 12.0访问数据库引擎对象库

现在上面有点满口,但是当你打算用DAO代替ADO时,上面的参考访问权限是正确的。

换句话说,或许我们应该称之为DAO II。

换句话说,这个数据引擎继续得到增强,并且最有可能在办公室2010(办公室14)看到这个引擎的64位版本。

因此,当我们在访问2007中使用DAO时,问题或混淆的中心是什么术语。这里的混淆实际上是文档甚至工具 - &gt;引用都不称它为DAO。

在访问2007年的一天结束时,如果您打算使用DAO,那么这意味着您设置了上述引用,并且不设置对DAO 3.6的引用。无论如何,在折旧时开始使用ADO毫无意义,并且用于访问的新DAO对象模型将继续得到Microsoft的增强和投资。

我希望这有助于消除这里的混乱。虽然DAO / JET正在被折旧,但新版本访问2007基于相同的代码库,除了它继续得到增强。因此,可以考虑访问中的新数据引擎并将其称为新的DAO对象模型。

我目前正在就这个问题进行NDA,但我可以肯定地告诉你,对于下一版本的办公室(2010年),我们将再次看到一大堆增强功能。

所以在Access开发人员中几乎一致认为,在开发访问应用程序和使用本机数据引擎时,这里的首选是使用DAO对象模型(但请记住,我们不再调用它了,我们称之为ACE)。

答案 2 :(得分:3)

问题的答案取决于你在做什么。如果您使用Access来处理ADO接口更通用的格式的数据,那么请使用ADO。如果你正在使用Jet数据,或者使用Jet数据库引擎来处理另一个数据库引擎(通过ODBC),那么DAO是正确的选择。

但是这个答案假设您正在从Access工作。如果您在其他编程环境中工作,答案可能会完全不同。

答案 3 :(得分:2)

ADO是当前推荐的访问方法。我认为DAO已被弃用了很多年。

看起来自Access 2000以来 - 根据this link

过时的数据访问技术列表 - http://msdn.microsoft.com/en-us/library/ms810810.aspx#mdac技术路线图old_topic9

引用上述文章,该文章于2008年12月修订 - “数据访问对象(DAO):DAO提供对JET(Access)数据库的访问。此API可用于Microsoft Visual Basic,Microsoft Visual C ++和脚本语言它包含在Microsoft Office 2000和Office XP中.DAO 3.6是该技术的最终版本。它不能在64位Windows操作系统上使用。“

答案 4 :(得分:2)

这取决于您的需求。预计这两种工具都不会很快消失。

如果您没有ADO或DAO的经验,您会发现DAO更容易。因此,除非您需要ADO,否则请使用DAO。

您添加了这个关键项:“我正在尝试将数据从外部源提取到Access数据库中。”此连接可能需要ADO。

答案 5 :(得分:1)

与ADO相比,DAO在性能方面略有不同。没有比较。

答案 6 :(得分:0)

道歉这是一个答案,当它应该是一个评论(我没有代表),但我想澄清一个错误的说法DAO / ACEDAO不支持Jet 4.0记录锁定。它确实存在,这是默认行为,无论某些MS文章声称什么。

问题是,当使用DAO编辑/更新时,这可能会引入巨大的膨胀(巨大碎片的DB文件),并且您无法在DAO / ACEDAO中将其关闭。

如果确实遇到此问题,可以通过首先使用正确的Jet OLEDB:数据库锁定模式设置通过OLEDB连接打开数据库来关闭它,这将允许您将数据库设置为页级锁定。然后,此属性将受到后续连接,DAO或其他因素的尊重,因此您可以使用DAO进行快速更新等。

与执行SQL语句相比,这将允许DAO恢复到通常的8X性能。

以下是一些指向该问题的链接:

Does ACEDAO support row level locking?

http://www.access-programmers.co.uk/forums/showthread.php?t=47040

MS知识库文章,包括使用ADO设置锁定模式的代码,然后在该数据库上使用DAO - http://support.microsoft.com/?id=306435