代码之家  ›  专栏  ›  技术社区  ›  Andrew Scagnelli

在Access2007中使用ADO或DAO更好吗?

  •  20
  • Andrew Scagnelli  · 技术社区  · 15 年前

    在Access2007中创建新数据库时,应该使用ADO(ActiveX数据对象)还是DAO(数据访问对象)?

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

    7 回复  |  直到 11 年前
        1
  •  15
  •   onedaywhen    15 年前

    [据记录,曾经是“jet”的官方名称现在是“access数据库引擎”。]

    对于ace(access2007引擎.accdb格式)功能,它必须是acedao。

    对于Jet4.0功能,它必须是ADO Classic。

    对于Jet3.51和更早版本的功能,选择ADO或DAO。两者都有优缺点。绝大多数的Access数据库引擎功能对两者都是通用的;互斥功能可以说是边缘功能。也许是一种生活方式的选择,但没什么大不了的。智能编码器使用两者的最佳方法:)

    我已经用了不少,ADO是我个人的偏好。它比DAO更现代,所以从架构上来说,它是一种改进:更平坦的对象模型,没有DAO的崩溃问题等。更多的属性和方法以及引入事件(DAO没有),例如异步连接和获取记录。ADO记录集可以断开连接、分层和生成,DAO记录集不能。基本上,他们把刀的好东西拿出来做得更好。

    道不是没有优点的。首先,对于access/jet,您将发现比ADO更多的DAO代码示例。

    另外,由于某种原因,喜欢刀的人真的不喜欢ADO。忽视宣传。ADO不受欢迎。ace有一个ole db提供程序,目前是64位使用ace的唯一方法。与vb.net在Access项目中取代vba6相比,ado.net不再取代ado classic。

    编辑:为了澄清,“对于Jet4.0的特性,它必须是ADO经典的,”这是因为DAO 3.6对于Jet4.0的新特性只接受了一些增强。例如,对于 DECIMAL 数据类型不能指定比例/精度。DAO中完全缺少其他功能。例如,您可以在Jet4.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对ace dao的唯一增强是针对新的ace功能,即它们没有返回并填补dao中的jet 4.0空白。为什么要这样?我们还有很多事情要做。最好是让团队更有效地利用他们的时间,比如解决那些烦人的问题。 十进制的 整理bug,对我来说是ace最好的东西;-)

        2
  •  8
  •   onedaywhen    15 年前

    DAO是这里推荐的技术。ADO已经大幅贬值,现在正被ADO.NET所取代。

    DAO不仅是用于MS Access的本机和推荐的数据对象模型,它还在不断增强,现在有了一系列新的SharePoint功能。在Access 2007中,我们现在支持SharePoint列表。这意味着2007年的新DAO对象模型允许将SharePoint列表用作SQL Server表并进行查看。这意味着您可以在SharePoint列表上使用SQL(在fac中,甚至没有一个OLEDB提供程序允许您以这种方式使用SharePoint列表,但对于DAO,您现在可以这样做)。没有任何此类添加到ADO中。因此,从访问(DAO)的角度来看,SharePoint列表将这些SharePoint列表视为标准表。

    此外,Access中的DAO还支持我们所称的复杂数据类型。这样做是为了支持来自SharePoint的XML列表。请记住,在下一个版本的Access(2010)中,我们将看到更多的新特性添加到DAO中(jet现在称为ace)。

    因此,毫无疑问,DAO是正确和良好的模型。ADO没有收到任何增强,已被ADO.NET取代。

    因此,未来属于DAO,很明显,微软在MS访问和升级SharePoint工作访问方面投入了大量资金。

    Access2007的字段定义具有多值功能,这也是支持SharePoint的增强的结果。但是,这些功能是Jet的一部分,这些增强功能可以在没有SharePoint的情况下使用。他们现在是道的一部分。


    编辑: 也许我要在这方面做一点扩展,并试图澄清我们在这里有哪些相反的答案,我可以向您保证,在使用Access 2007时,您使用DAO的情况要好得多。

    产生混淆的地方是,如果您在选择使用默认数据对象模型访问2007时查看工具引用,这里的问题是它不再称为DAO。现在它被称为ace。

    当您在Access 2007中使用DAO时,您会在工具引用中注意到,该引用未设置为DAO 3.6(该版本已贬值,现在也不再是MDAC下载的一部分)。您会注意到,在MS Access中使用DAO时,新的引用被称为:

    Microsoft Office 12.0 Access数据库引擎对象库

    现在,上面的内容有点满嘴,但当您要使用DAO代替ADO时,上面的内容对于参考访问2007是正确的。

    换言之,也许我们应该称之为道二。

    换句话说,这个数据引擎将继续得到增强,并且最有把握看到的是用于Office2010(Office14)的64位版本的这个引擎。

    因此,问题或困惑集中在,当我们在Access2007中提到使用DAO时,将使用什么术语。这里的混乱事实上是文档甚至工具引用都没有将其称为DAO。

    在Access2007的最后一天,如果您计划使用DAO,那么这意味着您设置了上述引用,而不设置对DAO 3.6的引用。无论如何,现在开始使用ADO是毫无意义的,因为它已经贬值了,而且新的用于访问的DAO对象模型继续得到微软的增强和投资。

    我希望这有助于消除这里的混乱。虽然DAO/Jet IT_s正在贬值,但新版本的Access 2007基于相同的代码库,只是它继续得到增强。因此,可以考虑并称为新的DAO对象模型。

    在这个问题上,我目前正处于保密协议之下,但我可以肯定地告诉您,对于下一个版本的Office(2010),我们将再次看到一系列的增强。

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

        3
  •  3
  •   David-W-Fenton    15 年前

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

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

        4
  •  2
  •   Smandoli    15 年前

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

    如果你没有ADO或DAO方面的经验,你会发现DAO要容易得多。所以,除非你需要ADO,否则使用DAO。

    您添加了此关键项:“我正试图将数据从外部源拉入到访问数据库中。”此连接可能需要ADO。

        5
  •  2
  •   Scott Ivey    15 年前

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

    看起来是从2000年开始的-根据 this link ,

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

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

        6
  •  1
  •   Brandon    15 年前

    与ADO相比,DAO在性能方面表现出色。没有比较。

        7
  •  0
  •   Community CDub    8 年前

    很抱歉,这是一个答案,当它应该是一个评论(我没有代表),但我想澄清一个错误的说法,即DAO/Acedao不支持Jet4.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