将currentproject.connection与连接字符串用于ADO对象之间有什么区别?

时间:2019-01-10 20:16:08

标签: ms-access ado

我们可以使用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链接表。我使用了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\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更快吗?

1 个答案:

答案 0 :(得分:2)

CurrentProject.Connection是到当前Access数据库的预先初始化且永远存在的连接。

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

CurrentProject.Connection可以使用链接表,但是如果使用链接表,它实际上使用将Access连接到SQL Server的DAO连接(链接表始终使用DAO,因为Access在内部使用DAO),然后使用ADO连接。到Access数据库以从Access检索数据,从而导致额外的开销。

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


进一步详细说明发生的情况:

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

  1. 您使用已经打开的与Access数据库的连接
  2. 您使用SQL的方言将SQL命令发送到Access数据库(使用与SQL Server兼容的语法模式的JET / ACE SQL)
  3. Access标识应查询的表,标识已链接的表,并将SQL语句转换为适当的语言
  4. 访问要么打开与SQL Server的新(内部/ DAO)连接,要么使用现有的打开连接(如果存在)
  5. Access使用它决定的连接和转换后的语句将数据从SQL Server提取到Access数据库中
  6. 然后,Access将数据发送到ADODB连接。

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

  1. 您打开与SQL Server的新ADODB连接
  2. 您将SQL命令发送到SQL Server
  3. SQL Server使用ADODB连接将数据发送回给您

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

更多说明:

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

    < / li>
  • 如果使用CurrentProject.Connection,则必须使用与SQL Server兼容的语法的Access(JET / ACE)SQL。这意味着在LIKE语句中,您需要使用%作为通配符,并且与普通语法相比,您具有不同的功能集,但是在定界调用时仍然必须使用八叉戟,并且SQL语句仍由访问,而不是SQL Server。

  • 作为一般语句,与SQL Server的直接连接比使用CurrentProject.Connection通过Access进行连接要快,但可能会出现例外情况(例如,因为Access已经有一个开放的连接,而您只是执行一条小语句,因此建立新连接的相对开销很大)