Подключение к удаленной базе данных Firebird через FireDAC в Delphi
В среде разработки Delphi, особенно при использовании FireDAC для работы с базами данных Firebird, часто возникает задача подключения к удаленной базе данных, а также ее автоматического создания, если она отсутствует. В этой статье мы рассмотрим проблему, с которой столкнулся разработчик при попытке подключения к удаленной базе данных Firebird 2.5 через FireDAC в Delphi 12.2 Enterprise, и предложим решение, основанное на предоставленном коде и комментариях.
Проблема:
Разработчик столкнулся с тем, что при указании IP-адреса удаленного сервера Firebird в параметре Server и пути к базе данных на этом сервере в параметре Database, FireDAC игнорировал параметр Server и пытался подключиться к локальной базе данных, даже если она уже существовала.
Решение:
Предоставленный код демонстрирует решение, которое заключается в явном присваивании параметров соединения из объекта TFDConnectionDef в объект TFDConnection перед установкой соединения.
//does our definition exist?
oDef := FDManager.ConnectionDefs.FindConnectionDef(FConDefName);
if not Assigned(oDef) then begin
//no; create it
oDef := FDManager.ConnectionDefs.AddConnectionDef;
oDef.Name := FConDefName;
//build params
oParams := TFDPhysFBConnectionDefParams(oDef.Params);
with oParams do begin
DriverID := 'FB';
Pooled := FPooled;
Protocol := ipTCPIP;
Server := FDBHost;
Database := FDBName;
UserName := 'sysdba';
Password := 'masterkey';
OpenMode := omOpenOrCreate;
end;
//apply the changes
oDef.MarkPersistent;
oDef.Apply;
end;
//connect to the FDB if we can
try
dbConn.ConnectionDefName := FConDefName;
//these two lines should not be necessary!!
oParams := TFDPhysFBConnectionDefParams(oDef.Params);
dbConn.Params.Assign(oParams);
dbConn.Connected := True;
except
on E:Exception do begin
//save the error msg and re-raise
FLastError := E.Message;
raise;
end;
end;
Объяснение решения:
Создание или поиск определения соединения (TFDConnectionDef): Код сначала проверяет, существует ли определение соединения с заданным именем (FConDefName). Если нет, то создается новое определение и заполняется необходимыми параметрами, такими как DriverID, Protocol, Server, Database, UserName, Password и OpenMode. Важно установить OpenMode в omOpenOrCreate, чтобы Firebird создавал базу данных, если она не существует.
Присвоение параметров соединения (TFDConnection.Params.Assign): После выбора или создания определения соединения, параметры из TFDConnectionDefявно присваиваются параметрам TFDConnection. Это обходит, по-видимому, существующую проблему в FireDAC, где параметры из TFDConnectionDef не всегда корректно применяются к TFDConnection.
Установка соединения (TFDConnection.Connected := True): После присвоения параметров устанавливается соединение с базой данных.
Альтернативное решение (с использованием строки соединения):
Вместо использования TFDConnectionDef, можно напрямую использовать строку соединения (connection string) в TFDConnection. Этот подход может быть проще, если вам не нужно сохранять определения соединений.
uses
FireDAC.Comp.Client, FireDAC.Phys.FB;
procedure ConnectToRemoteDB(const AHost, AFDB: String);
var
FDConnection: TFDConnection;
ConnectionString: string;
begin
FDConnection := TFDConnection.Create(nil);
try
// Формируем строку соединения
ConnectionString := 'DriverID=FB;Protocol=TCPIP;' +
'Server=' + AHost + ';' +
'Database=' + AFDB + ';' +
'User_Name=sysdba;Password=masterkey;' +
'OpenMode=OpenOrCreate';
FDConnection.Params.Text := ConnectionString;
try
FDConnection.Connected := True;
// ... дальнейшая работа с базой данных ...
except
on E: Exception do
ShowMessage('Ошибка подключения: ' + E.Message);
end;
finally
FDConnection.Free;
end;
end;
Объяснение альтернативного решения:
Создание TFDConnection: Создается экземпляр компонента TFDConnection.
Формирование строки соединения: Формируется строка соединения, содержащая все необходимые параметры, включая DriverID, Protocol, Server, Database, User_Name, Password и OpenMode. Обратите внимание на OpenMode=OpenOrCreate, который обеспечивает создание базы данных, если она не существует.
Присвоение строки соединения: Строка соединения присваивается свойству FDConnection.Params.Text.
Установка соединения: Устанавливается соединение с базой данных.
Важные замечания:
Убедитесь, что на удаленном сервере Firebird разрешены подключения по TCP/IP. Проверьте конфигурацию firebird.conf.
Проверьте, что порт Firebird (обычно 3050) открыт в брандмауэре на удаленном сервере.
Убедитесь, что версия FireDAC совместима с версией Firebird.
Убедитесь, что модуль FireDAC.Phys.FB подключен в секции uses.
Заключение:
Подключение к удаленной базе данных Firebird через FireDAC в Delphi может потребовать явного присвоения параметров соединения из объекта TFDConnectionDef в объект TFDConnection или использования строки соединения. При правильной настройке и использовании OpenMode=OpenOrCreate, FireDAC автоматически создаст базу данных на удаленном сервере, если она не существует. Важно помнить о настройках Firebird и брандмауэра на удаленном сервере, чтобы обеспечить успешное подключение.
В статье рассматриваются проблемы и решения для подключения к удаленной базе данных Firebird через FireDAC в Delphi, включая явное присвоение параметров соединения и использование строки соединения для обхода возможных ошибок FireDAC.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS