Известно, что большинство производителей баз данных выпускают к ним драйвера, которые и помогают нашим приложениям работать быстро и правильно. Я, например, работаю с базой MySQL, и для 32 разрядных приложений существует драйвер libmysql.dll О том как его подключить, используя компоненты доступа к БД FireDAC мы и поговорим в данное статье.
За основу статьи, я взял официальную документацию
Старая версия мне нравится больше тем, что там удобное, раскрывающееся дерево с левой стороны, а новая версия хороша тем, что там практически весь код корректен. В старой версии использованы аббревиатуры AD, что означает AnyDAC, а в новой версии использованы аббревиатуры FD, что означает FireDAC.
Как подключить драйвер к нашему приложению?
Существует 2 способа
– через файл FDDrivers.ini
– через компонент TFDPhysXxxDriverLink
В данной статье мы рассмотрим оба способа.
Как подключить драйвер через FDDrivers.ini ?
Для начала посмотрим, где находится этот самый файл. По умолчанию, при установке Delphi он находится в директории
C:\Users\Public\Documents\Embarcadero\Studio\FireDAC\FDDrivers.ini
Когда я его открыл, он был у меня практически пустым и состоял всего из 2 строк
[FDDrivers.ini]
Encoding=UTF8
Теперь узнаем что позволяет сделать FDDrivers.ini?
-настроить параметры базового драйвера (для всех описаний драйверов обязательна секция BaseDriverID, например BaseDriverID=MySQL)
-настроить так называемые виртуальные драйвера для того, чтобы, например, в одном и том же приложении использовать возможность подключаться к разным версиям сервера БД, для того, чтобы дать понять FireDAC, что у нас виртуальный драйвер, нам надо саму секцию назвать с какой-нибудь добавкой, например, таким образом
1 2 3 4 |
[MySQL_Virtual] ; MySQL327 virtual driver will use specified LIBMYSQL.DLL BaseDriverID=MySQL VendorLib=C:\MySQLDriver\libmysql.dll |
Обратите внимание, мы подписали секцию [MySQL_Virtual], если бы мы оставили [MySQL], то FireDAC не стал бы регистрировать новое описание драйверов.
Базовые и виртуальные драйвера
Базовый драйвер – это то, что уже заложено в FireDAC, базовые драйвера можно просмотреть, например из выпадающего списка компонента FDConnection. Создадим VCL приложение, добавим на него компонент FDConnection, кликнем по нему 2 раза и у нас появится окно редактирования соединения. Далее, кликнем на выпадающий список, напротив DriverID
Виртуальный драйвер в этом списке отсутствует, но мы можем добавить его в файле FDDrivers.ini “ручками”, прописав туда следующий код.
1 2 3 4 |
[MySQL_Virtual] ; MySQL327 virtual driver will use specified LIBMYSQL.DLL BaseDriverID=MySQL VendorLib=C:\MySQLDriver\libmysql.dll |
Далее, чтобы воспользоваться услугами этого драйвера, нам нужно в компоненте FDManager прописать свойство DriverDefFileName и поставить DriverDefFileAutoLoad в True. После этого, например, при создании ConnectionDefinition, мы можем, например указать, в свойстве DriverID свойство MySQL_Virtual
То есть, код мог бы быть таким…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
procedure TForm1.AddConnectionDef(Sender: TObject); var myDef:IFDStanConnectionDef; i:integer; begin //Проверяем нет ли уже ConnDef с таким же именем for i := 0 to FDManager1.ConnectionDefs.Count-1 do begin if FDManager1.ConnectionDefs[i].Name='MySQL_Persistent_def' then exit; end; //Далее, добавляем, если ConnDef c именем MySQL_Persistent_def отсутствует myDef:=FDManager1.ConnectionDefs.AddConnectionDef; myDef.Name:='MySQL_Persistent_def'; myDef.Params.DriverID:='MySQL_Virtual'; // <<< Здесь указали на использование виртуального драйвера myDef.Params.Database:='test_db'; myDef.Params.UserName:='root'; myDef.Params.Password:='masterkey'; // Далее другая техника добавления параметров myDef.Params.Add('Server=127.0.0.1'); // Отмечаем myDef как Persistent, без этого был бы Private myDef.MarkPersistent; // Сохраняем изменения в файле FDConnectionDefs.ini myDef.Apply; end; |
А само подключение обработать таким образом
1 2 3 4 5 6 7 8 9 |
procedure TForm1.bConnectClick(Sender: TObject); begin Self.AddConnectionDef(Self); FDConnection1.ConnectionDefName:='MySQL_Persistent_def'; FDConnection1.Connected:=true; if FDConnection1.Connected then showmessage('Connected') else showmessage('could not connect'); end; |
Зачем нужны виртуальные драйвера?
-работать с различными версиями DBMS (DataBase Management System) в разных соединениях (FDConnections), думаю, можно работать одновременно даже с разными БД в разных соединениях
-настраивать параметры драйверов, например параметры MySQL Embedded
Как подключить драйвер через TFDPhysXxxDriverLink ?
Здесь все достаточно просто, нужно добавить компонент TFDPhysXxxDriverLink на форму и настроить следующие свойства
–VendorLib, например C:\MySQLDriver\libmysql.dll
–VendorHome это директория, в которую установлен сервер, например C:\Program Files\MySQL\MySQL Server 5.5
Если прописать VendorHome, то FireDac будет сначала искать libmysql.dll в этой директории.
Обратите внимание!
У меня, например 64 разрядная версия MySQL, и драйвер, соответственно там тоже 64 разрядный, если его использовать, будет выскакивать ошибка. Поэтому я свойство VendorHome не прописывал, а только свойство Vendorlib, здесь я прописал путь к 32 разрядной версии драйверов, так как в Delphi компилировал 32 разрядное приложение.
Практика. Подключение к БД MySQL
Сначала подключимся, используя файл FDDrivers.ini Для этого создадим VCL приложение следующим образом
Теперь пропишем в файле C:\Users\Public\Documents\Embarcadero\Studio\FireDAC\FDDrivers.ini следующую секцию
1 2 3 4 |
[MySQL_Virtual] ; MySQL327 virtual driver will use specified LIBMYSQL.DLL BaseDriverID=MySQL VendorLib=C:\MySQLDriver\libmysql.dll |
В FDManager пропишем пути к FDDrivers.ini и настроим DriverDefFileAutoLoad
1 2 3 4 |
....//Form1.Create FDManager1.DriverDefFileName:= 'C:\Users\Public\Documents\Embarcadero\Studio\FireDAC\FDDrivers.ini'; DriverDefFileAutoLoad:=true; .. |
Теперь напишем следующий код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
procedure TForm1.AddConnectionDef(Sender: TObject); var myDef:IFDStanConnectionDef; i:integer; begin //Проверяем нет ли уже ConnDef с таким же именем for i := 0 to FDManager1.ConnectionDefs.Count-1 do begin if FDManager1.ConnectionDefs[i].Name='MySQL_Persistent_def' then exit; end; //Далее, добавляем, если ConnDef c именем MySQL_Persistent_def отсутствует myDef:=FDManager1.ConnectionDefs.AddConnectionDef; myDef.Name:='MySQL_Persistent_def'; myDef.Params.DriverID:='MySQL_Virtual'; // <<< Здесь указали на использование виртуального драйвера myDef.Params.Database:='test_db'; myDef.Params.UserName:='root'; myDef.Params.Password:='masterkey'; // Далее другая техника добавления параметров myDef.Params.Add('Server=127.0.0.1'); // Отмечаем myDef как Persistent, без этого был бы Private myDef.MarkPersistent; // Сохраняем изменения в файле FDConnectionDefs.ini myDef.Apply; end; |
А само подключение обработаем таким образом
1 2 3 4 5 6 7 8 9 |
procedure TForm1.bConnectClick(Sender: TObject); begin Self.AddConnectionDef(Self); FDConnection1.ConnectionDefName:='MySQL_Persistent_def'; FDConnection1.Connected:=true; if FDConnection1.Connected then showmessage('Connected') else showmessage('could not connect'); end; |
Теперь пробуем подключиться
Подключение с использованием TFDPhysXxxDriverLink
Добавим на форму компонент TFDPhysXxxDriverLink и пропишем его свойство VendorLib следующим образом
TFDPhysXxxDriverLink1.VendorLib:=’C:\MySQLDriver\libmysql.dll’;
Теперь снова пробуем подключиться и получаем тот же результат
Когда использовать FDDrivers.ini а когда TFDPhysXxxDriverLink ?
Думаю, в случае, когда у нас одна версия БД и не предвидится использование нескольких версий – лучше пользоваться более простым способом – TFDPhysXxxDriverLink, но если у нас очень сложное приложение, которое использует разные БД и разные версии то лучше, конечно использовать FDDrivers.ini На этом всё, думаю основные моменты мы раскрыли.