В чем разница между использованием currentproject.connection и строк подключения для объекта ADO? - PullRequest
0 голосов
/ 10 января 2019

Мы можем установить строку подключения для подключения 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.

У меня есть связанные таблицы без DSN, связанные с бэкэндом SQL Server. Я использовал этот код, предоставленный Microsoft, для создания соединения без 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 голосов
/ 11 января 2019

CurrentProject.Connection - это предварительно инициализированное и всегда существующее соединение с текущей базой данных Access.

Соединения, использующие строки подключения ODBC, строки подключения OLEDB или DSN ODBC, однако, могут подключаться напрямую к внешним источникам данных, сокращая накладные расходы и используя диалект SQL, параметры и особенности внешней системы.

CurrentProject.Connection может использовать связанные таблицы, но если это так, он фактически использует соединение DAO, соединяющее Access с сервером SQL (связанные таблицы всегда используют DAO, поскольку Access использует DAO внутри), а затем соединение ADO с Доступ к базе данных для получения данных из Access, что приводит к дополнительным расходам.

Это означает, что соединения, использующие драйвер ODBC-сервера SQL или поставщика OLEDB, могут быть значительно быстрее в определенных случаях, чем соединения, использующие CurrentProject.Connection при подключении к внешним источникам. Кроме того, прямые соединения с использованием драйвера ODBC или поставщика OLEDB могут предоставлять дополнительные функции, например возвращать информационные сообщения с сервера SQL.


Подробнее о том, что происходит:

Если вы используете CurrentProject.Connection для открытия связанной таблицы, происходит следующее:

  1. Вы используете уже открытое соединение с базой данных Access
  2. Вы отправляете команду SQL в базу данных Access, используя ее диалект SQL (JET / ACE SQL, используя режим синтаксиса, совместимый с SQL-сервером)
  3. Access идентифицирует таблицу, к которой он должен обратиться, определяет, что она связана, и переводит оператор SQL на соответствующий язык
  4. Access либо открывает новое (внутреннее / DAO) соединение с сервером SQL, либо использует существующее открытое соединение, если оно существует
  5. Access извлекает данные с сервера SQL в базу данных Access, используя выбранное соединение и переведенный оператор
  6. Затем Access отправляет данные в соединение ADODB.

Однако, если вы используете прямое ADODB-соединение, процесс будет намного проще:

  1. Вы открываете новое соединение ADODB с сервером SQL
  2. Вы отправляете команду SQL на сервер SQL
  3. Сервер SQL отправляет данные обратно вам через соединение ADODB

Механизм базы данных Access на 100% не знает, что вы запрашиваете что-либо здесь, поскольку он не участвует ни в одном из шагов.

Дополнительные примечания:

  • Если вы используете CurrentProject.Connection и курсор на стороне сервера, курсор управляется модулем базы данных Access, а не сервером SQL, даже если вы запрашиваете сервер SQL.

  • Если вы используете CurrentProject.Connection, вы должны использовать Access (JET / ACE) SQL с использованием синтаксиса, совместимого с SQL-сервером. Это означает, что в операторах LIKE вам нужно использовать % в качестве подстановочного знака, и у вас есть набор функций, отличный от обычного синтаксиса, но вы все равно должны использовать окто-типы при разделении вызовов, а оператор SQL по-прежнему обрабатывается Access, не SQL-сервер.

  • Хотя в общем случае прямое подключение к серверу SQL происходит быстрее, чем подключение через Access с использованием CurrentProject.Connection, могут применяться исключения (например, поскольку Access уже имеет открытое соединение, и вы выполняете только небольшое утверждение, поэтому относительные накладные расходы на установление нового соединения велики)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...