在 Access 2007 中创建新数据库时,应该使用 ADO(ActiveX 数据对象)还是 DAO(数据访问对象)?
编辑:该数据库的一部分将从 Excel 2007 电子表格中导入数据。
在 Access 2007 中创建新数据库时,应该使用 ADO(ActiveX 数据对象)还是 DAO(数据访问对象)?
编辑:该数据库的一部分将从 Excel 2007 电子表格中导入数据。
[作为记录,曾经的“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 代码示例。
PS 出于某种原因,喜欢 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 完全缺少其他功能。例如,您可以在 Jet 4.0 中使用 DAO(或 ACE 中的 ACEDAO)执行以下操作吗?
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 是最好的 ;-)
DAO 是这里推荐的技术。ADO 已经贬值很多,现在被 ADO.net 取代。
DAO 不仅是使用 MS 访问的本机和推荐的数据对象模型,它还在继续得到增强,现在为 sharepoint 提供了一大堆新功能。在 access 2007 中,我们现在支持 SharePoint 列表。这意味着 2007 年的新 DAO 对象模型允许使用共享点列表并将其视为 SQL 服务器表。这意味着您可以在共享点列表上使用 SQL(事实上,甚至没有允许您以这种方式使用 SharePoint 列表的 oleDB 提供程序,但现在您可以使用 DAO 执行此操作)。没有任何此类添加到 ADO。因此,从访问 (dao) 的角度来看,SharePoint 列表将这些 SharePoint 列表视为标准表。
此外,访问中的 DAO 还支持我们所说的复杂数据类型。这样做是为了支持来自 sharepoint 的 XML 列表。请记住,对于 Access 的下一个版本(2010 年),我们将看到更多新的附加功能被添加到 DAO(JET 现在称为 ACE)。
因此毫无疑问,DAO 是正确且良好的模型。ADO 不再接受任何增强,并且已被 ADO.NET 取代。
所以未来属于 DAO,很明显这就是微软在 MS 访问和升级 Access 以使用 things sharepoint 方面投资的地方。
Access 2007 为其字段定义接收了多值功能,这也是对支持共享点的增强的结果。但是,这些功能是 JET 的一部分,并且可以在没有共享点的情况下使用这些增强功能。他们现在是 DAO 的一部分。
编辑:也许我会对此进行一些扩展,并尝试澄清我们在这里有这样相反的答案,我可以向您保证,在使用 access 2007 时,您最好使用 DAO。
混淆的根源在于,如果您在选择使用默认数据对象模型访问 2007 时查看工具引用,这里的问题是它不再称为 DAO。它现在称为 ACE。
当您在 access 2007 中使用 DAO 时,您会在工具参考中注意到,参考未设置为 DAO 3.6(该版本已被贬值,现在也不再是 MDAC 下载的一部分)。您会注意到在 ms-access 中使用 DAO 时的新引用被调用:
Microsoft office 12.0 访问数据库引擎对象库
现在上面有点吃饱了,但是上面是正确的参考访问 2007 当你打算使用 DAO 代替 ADO 时。
换句话说,也许我们应该称之为 DAO II。
换言之,此数据引擎将继续得到增强,并且肯定会看到适用于 office 2010 (office 14) 的该引擎的 64 位版本。
因此,当我们在 access 2007 中提到使用 DAO 时,问题或混淆集中在使用什么术语上。这里的混淆实际上是文档甚至工具 -> 参考都没有将其称为 DAO。
归根结底,在 access 2007 中,如果您打算使用 DAO,那么这意味着您设置了上述引用,而不是设置对 DAO 3.6 的引用。无论如何,现在开始使用 ADO 绝对没有意义,因为它已经被贬值了,而且用于访问的新 DAO 对象模型继续得到增强并由 Microsoft 投资。
我希望这有助于消除这里的混乱。虽然 DAO/JET 正在贬值,但新版本 access 2007 是基于相同的代码库,只是它继续得到增强。因此,可以考虑将访问中的新数据引擎称为新的DAO对象模型。
我目前在这个问题上处于 NDA 之下,但我可以肯定地告诉你,对于下一个版本的 Office (2010),我们将再次看到一系列增强功能。
因此,Access 开发人员几乎一致认为,在开发 Access 应用程序和使用本机数据引擎时,这里的首选是使用 DAO 对象模型(但请记住,我们不再这么称呼它,我们称之为 ACE)。
这个问题的答案取决于你在做什么。如果您使用 Access 处理 ADO 接口更通用的格式的数据,请使用 ADO。如果您使用 Jet 数据,或使用 Jet 数据库引擎与另一个数据库引擎(通过 ODBC)一起工作,那么 DAO 是正确的选择。
但该答案假设您正在使用 Access 工作。如果您在其他一些编程环境中工作,答案可能会完全不同。
这取决于您的需求。预计这两种工具都不会很快消失。
如果您没有 ADO 或 DAO 方面的经验,您会发现 DAO 要容易得多。因此,除非您需要 ADO,否则请使用 DAO。
您添加了这个关键项目:“我正在尝试将数据从外部源提取到 Access 数据库中。” 这种连接可能需要 ADO。
ADO 是当前推荐的访问方法。我认为 DAO 已经被弃用了很多年。
看起来它是自 Access 2000 以来的 - 根据此链接,
过时的数据访问技术列表 - 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 操作系统上不可用。
与 ADO 相比,DAO 在性能方面只是摇滚。没有可比性。
抱歉,这是一个答案,当它应该是一个评论时(我没有代表),但我想澄清一个错误的说法,即 DAO/ACEDAO 不支持 Jet 4.0 记录锁定。确实如此,这是默认行为,无论某些 MS 文章声称什么。
问题是这可能会在使用 DAO 编辑/更新时引入巨大的膨胀(非常碎片化的 DB 文件),并且您无法在 DAO/ACEDAO 中将其关闭。
如果您确实遇到此问题,您可以通过首先使用正确的 Jet OLEDB:Database Locking Mode 设置通过 OLEDB 连接打开数据库来关闭它,这将允许您将数据库设置为页面级锁定。然后,此属性将受到后续连接、DAO 或其他方式的尊重,因此您可以使用 DAO 进行快速更新等。
与执行 SQL 语句相比,这将允许 DAO 恢复到通常的 8 倍性能。
以下是一些指向该问题的链接:
http://www.access-programmers.co.uk/forums/showthread.php?t=47040
MS KB 文章,包括使用 ADO 设置锁定模式的代码,然后在该数据库上使用 DAO - http://support.microsoft.com/?id=306435