【问题标题】:What is the difference between using currentproject.connection vs connection strings for ADO object?使用 currentproject.connection 与 ADO 对象的连接字符串有什么区别?
【发布时间】:2019-01-10 20:16:07
【问题描述】:

我们可以使用 currentproject.connection 或使用 DSN (DSN=MyDSN;UID=MyID;PWD=MyPwd) 或 DSN-Less 连接字符串 (

DRIVER=\{SQL Server\};SERVER=
MyServer;DATABASE=pubs;
UID=MyID;PWD=MyPwd)

我的问题专门针对连接到 SQL Server 的链接表。

我有一个连接到 SQL Server 后端的无 DSN 链接表。我使用微软提供的this 代码来创建无 DSN 连接。如果我这样做了

debug.print currentproject.connection我得到类似的东西

Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=C:\Users\DAVE\Desktop\DATA.accdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database=C:\Users\DAVE\AppData\Roaming\Microsoft\Access\System3.mdw;Jet OLEDB:Registry Path=Software\Microsoft\Office\16.0\Access\Access Connectivity Engine;Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=True;Jet OLEDB:Bypass UserInfo Validation=False;Jet OLEDB:Limited DB Caching=False;Jet OLEDB:Bypass ChoiceField Validation=False

我猜,上面的字符串被转换成一个无 dsn 的连接字符串,看起来像这样:

DRIVER=\{SQL Server\};SERVER=
MyServer;DATABASE=pubs;
UID=MyID;PWD=MyPwd)

考虑到这种转换速度,使用连接字符串比使用currentproject.connection 更快吗?

【问题讨论】:

    标签: ms-access ado


    【解决方案1】:

    CurrentProject.Connection 是与当前 Access 数据库的预初始化且始终存在的连接。

    但是,使用 ODBC 连接字符串、OLEDB 连接字符串或 ODBC DSN 的连接可以直接连接到外部数据源,从而减少开销并使用外部系统的 SQL 方言、选项和怪癖。

    CurrentProject.Connection 可以使用链接表,但如果这样做,它实际上使用 DAO 连接将 Access 连接到 SQL 服务器(链接表总是使用 DAO,因为 Access 内部使用 DAO),然后是 ADO 连接到Access 数据库从 Access 中检索数据,导致额外开销。

    这意味着在特定情况下,使用 SQL 服务器 ODBC 驱动程序或 OLEDB 提供程序的连接在连接到外部源时比使用 CurrentProject.Connection 的连接速度要快得多。此外,使用 ODBC 驱动程序或 OLEDB 提供程序的直接连接可以公开其他功能,例如从 SQL 服务器返回信息消息。


    进一步详细说明会发生什么:

    如果使用CurrentProject.Connection打开链接表,会出现以下情况:

    1. 您使用已打开的 Access 数据库连接
    2. 您使用它的 SQL 方言向 Access 数据库发送一条 SQL 命令(使用 SQL 服务器兼容语法模式的 JET/ACE SQL)
    3. Access 识别它应该查询的表,识别它是链接的,并将 SQL 语句翻译成适当的语言
    4. Access 要么打开一个到 SQL Server 的新(内部/DAO)连接,要么使用现有的打开连接(如果存在)
    5. Access 使用它决定的连接和翻译后的语句将数据从 SQL 服务器拉入 Access 数据库
    6. Access 然后将数据发送到 ADODB 连接。

    但是,如果您使用直接 ADODB 连接,则该过程要简单得多:

    1. 您打开了与 SQL 服务器的新 ADODB 连接
    2. 您向 SQL 服务器发送 SQL 命令
    3. SQL 服务器使用 ADODB 连接将数据发回给您

    Access 数据库引擎 100% 不知道您在此处查询任何内容,因为它不涉及任何步骤。

    补充说明:

    • 如果您使用 CurrentProject.Connection 和服务器端游标,则游标由 Access 数据库引擎而不是 SQL Server 管理,即使您正在查询 SQL Server。

    • 如果您使用CurrentProject.Connection,您必须使用与 SQL 服务器兼容的语法来使用 Access (JET/ACE) SQL。这意味着在 LIKE 语句中,您需要使用% 作为通配符,并且您具有与使用普通语法不同的功能集,但是在分隔调用时仍然必须使用八字形,并且 SQL 语句仍然由 Access 处理,不是 SQL 服务器。

    • 虽然作为一般语句,直接连接到 SQL Server 比使用 CurrentProject.Connection 通过 Access 连接更快,但可能存在例外情况(例如,因为 Access 已经有一个打开的连接,而您只是在执行小语句,因此建立新连接的相对开销很大)

    【讨论】:

    • 谢谢。我经历了很大的速度差异,不明白为什么。请您进一步澄清您的第三段。使用currentproject.connection 进行ADO 连接,您是说访问SQL 是DAO 连接,而SQL 访问是ADO 连接?我从来没有听说过这样的事情。结果记录集是 ADO 还是 DAO?
    • @jedu 添加了进一步的说明。当然,使用 ADODB 连接时获得的任何记录集都是 ADODB 记录集
    猜你喜欢
    • 2015-05-05
    • 2012-10-10
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多