ConnectionDefinition
Что такое ConnectionDefinition?
Перед тем как создать соединение в FireDac, необходимо создать так называемое ConnectionDefinition – определение соединения. Это набор параметров – сервер, пользователь, пароль и др. параметры, которые, впоследствии используются для установки соединения.
В FireDac существует как минимум 3 вида ConnectionDefinition. Подробно об этом написано в документации.
Постоянное ConnectionDefinition (Persistent)
Имеет уникальное имя. Настраивается из FDManager и хранится в ini файле. Определяется один раз, далее может использоваться всеми соединениями и приложениями. Файл, в котором хранятся определения, находится по адресу
C:\Users\Public\Documents\Embarcadero\Studio\FireDAC\FDConnectionDefs.ini
Опасность здесь заключается в том, что данные относительно открыты и могут быть изменены. После обновления ConnectionDefinition через FDExplorer или FDAdministrator необходимо либо реактивировать FDManager либо перезапустить IDE.
Частное ConnectionDefinition (Private)
Имеет уникальное имя. Аналогично постоянному, но данные не хранятся во внешнем файле и поэтому могут быть использованы только в одном приложении несколько раз.
Временное ConnectionDefinition (Temporary)
Не имеет уникального имени. Не хранится во внешнем файле, не управляется через FDManager.
FDConnectionDefs.ini
Если открыть файл
C:\Users\Public\Documents\Embarcadero\Studio\FireDAC\FDConnectionDefs.ini
то мы увидим примерно следующую картину
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
[FDConnectionDefs.ini] Encoding=UTF8 [DBDEMOS] DriverID=MSAcc Database=C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\data\dbdemos.mdb [EMPLOYEE] DriverID=IB Protocol=TCPIP Database=localhost:C:\ProgramData\Embarcadero\InterBase\gds_db\examples\database\employee.gdb User_Name=sysdba Password=masterkey CharacterSet= ExtendedMetadata=True [Access_Demo] DriverID=MSAcc Database=C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\data\FDDemo.mdb [Access_Demo_Pooled] DriverID=MSAcc Database=C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\data\FDDemo.mdb Pooled=True [SQLite_Demo] DriverID=SQLite Database=C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\data\FDDemo.sdb LockingMode=Normal [SQLite_Demo_Pooled] DriverID=SQLite Database=C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\data\FDDemo.sdb LockingMode=Normal Pooled=True [MSSQL_Demo] DriverID=MSSQL Server=127.0.0.1 Database=Northwind User_Name=sa Password= MetaDefSchema=dbo MetaDefCatalog=Northwind ExtendedMetadata=True [MySQL_Connection] Database=test_db User_Name=root Password=masterkey DriverID=MySQL [MySQL_Demo] DriverID=MySQL Database=addemo User_Name=root [ConnectionDef1] Database=array_db User_Name=root DriverID=MySQL [ConnectionDef2] Database=array_db User_Name=root DriverID=MySQL [MySQL_array_db] Database=array_db User_Name=root Password=masterkey DriverID=MySQL |
То есть, по сути, в секциях записаны наборы параметров, которые IDE Delphi и наше приложение используют при организации подключения.
Как правильно изменить файл FDConnectionDefs.ini ?
Изменить его можно несколькими способами
-Если разобрались с параметрами, то просто вписать или изменить туда свои параметры для своего ConnectionDefinition
-Можно работать через File | DataExplorer | Fire Dac | MySQL Server –> правой кнопкой мыши Add Connection… Как ни странно, это способ прекрасно работает, хоть и не описан в официальной документации
-Можно работать через FDExplorer или FDAdministrator
В общем, на вкус и цвет. А суть проста – мы сохраняем параметры того или иного подключения, чтобы воспользоваться ими после.
Как помочь найти приложению FDConnectionsDefs.ini?
Очень просто. Нужно добавить в приложение FDManager и прописать в свойстве FDManager.ConnectionDefFileName путь к нашему файлу FDConnectionDefs.ini
Вообще, по этому поводу в документации написана следующая информация
An application can specify a connection definition file name in the FDManager.ConnectionDefFileName property. FireDAC searches for a connection definition file in the following places:
- If ConnectionDefFileName is specified:
- search for a file name without a path, then look for it in an application EXE folder.
- otherwise just use a specified file name.
- If ConnectionDefFileName is not specified:
- look for FDConnectionDefs.ini in an application EXE folder.
- If the file above is not found, look for a file specified in the registry key HKCU\Software\da-soft\FireDAC\ConnectionDefFile. By default it is $(ADHome)\DB\ADConnectionDefs.ini.
Note: At design time, FireDAC ignores the value of the ADManager.ConnectionDefFileName, and looks for a file in a Delphi Bin folder or as specified in the registry. If the file is not found, an exception is raised.
Иными словами, лучший способ – прямо указать приложению где лежит файл через FDManager.ConnectionDefFileName, если этого не сделать, то приложение будет искать данный файл в папке EXE, и после этого будет пытаться искать через реестр
Опять же, нужно в FDManager поставить свойство ADManager.ConnectionDefFileAutoLoad в True, иначе придется явно вызывать метод ADManager.LoadConnectionDefFile до первого использования FDConnection, например до FDConnection:=true;
Практика. Создание ConnectionDefs и FDConnections
Создание Persistent ConnectionDefinition
Создадим VCL проект, на форму добавим одну кнопку и следующие компоненты
В uses напишем
1 2 |
uses FireDAC.Comp.Client, FireDAC.Stan.Intf; |
Далее напишем вспомогательную процедуру
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 31 |
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'; myDef.Params.Database:='test_db'; myDef.Params.UserName:='root'; myDef.Params.Password:='masterkey'; // Далее другая техника добавления параметров myDef.Params.Add('Server=127.0.0.1'); // << я не нашел в свойствах Server, поэтому добавил так // Отмечаем myDef как Persistent, без этого был бы Private myDef.MarkPersistent; // Сохраняем изменения в файле FDConnectionDefs.ini myDef.Apply; end; |
Далее, обработаем кнопку bConnection таким образом
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; |
Также мое приложение запросило компонент FDPhysMySQLDriverLink1, в свойстве VendorLib я напрямую указал где находится файл libmysql.dll
Результат
Создание Private Connection Definition
В этом случае можно повторить предыдущий пример, но не писать строчку
1 2 |
// Отмечаем myDef как Persistent, без этого был бы Private myDef.MarkPersistent; |
Создание Temporary Connection Definition
Здесь все просто. Если в дизайн тайм, то нужно на форму добавить FDConnection, 2 раза кликнуть на нем, заполнить параметры и нажать галочку Connected в Object inspector.
Если в run-time, то тогда можно таким образом
1 2 3 4 5 6 |
FDConnection1.DriverName := 'MySQL'; FDConnection1.Params.Add('Server=127.0.0.1'); FDConnection1.Params.Add('Database=test_db'); FDConnection1.Params.Add('User_name=root'); FDConnection1.Params.Add('Password=masterkey'); FDConnection1.Connected := True; |
Основные моменты мы рассмотрели, остальное дело техники и экспериментов. Удачи в разработке !!!