使用 currentproject.connection 与 ADO 对象的连接字符串有什么区别?

What is the difference between using currentproject.connection vs connection strings for ADO object?

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

为 ADO 连接设置连接字符串
DRIVER=\{SQL Server\};SERVER=
MyServer;DATABASE=pubs;
UID=MyID;PWD=MyPwd)

我的问题特别针对连接到 SQL 服务器的链接表。

我有一个连接到 SQL 服务器后端的无 DSN 链接表。我使用了 Microsoft 提供的 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.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 更快?

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

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

CurrentProject.Connection 可以使用链接的 tables,但如果这样做,它实际上使用 DAO 连接连接访问 SQL 服务器(链接 table由于 Access 在内部使用 DAO,因此始终使用 DAO),然后使用 ADO 连接到 Access 数据库以从 Access 检索数据,从而导致额外的开销。

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


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

如果您使用 CurrentProject.Connection 打开链接 table,会发生以下情况:

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

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

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

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

进一步说明:

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

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

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