Перейти к содержанию
Fire Monkey от А до Я
  • 0

Подключение к БД Firebird из Android


drbond

Вопрос

Пытаюсь соединиться с удалённой БД Firebird из приложения под Android. Прошу помочь мне с одним неясным моментом. А именно: где, по какому пути в приложении должна быть размещена клиентская библиотека?  Что прописать в deployment? Что прописать в свойстве ClientLibrary компонента UniConnection? Почему UniConnection не видит библиотеку libfbclient.so.3.0.3 когда я размещаю её в папке приложения?

Пытаюсь указывать путь к файлу для приложения:

procedure TForm2.FormCreate(Sender: TObject);
var
begin
UniConnection1.SpecificOptions.Values['ClientLibrary']:= TPath.Combine(TPath.GetDocumentsPath, 'libfbclient.so.3.0.3');
end;

В итоге получаю:

Screenshot_20180820-132427.png

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
8 минут назад, Slym сказал:
const DriverName='FB';
var DriverLink:TFDPhysDriverLink;
begin
      FDPhysManager().Open;
      DriverLink:=FDPhysManagerObj.FindDriverLink(DriverName);
      if not assigned(DriverLink) then
        DriverLink:=TFDPhysFBDriverLink.Create(nil);
      if DriverLink.DriverState<TFDPhysDriverState.drsLoaded then
      begin
      {$IFDEF MSWINDOWS}
        DriverLink.VendorHome:= '';
        DriverLink.VendorLib:= ExtractFilePath(ParamStr(0))+'fbclient.dll';
      {$ENDIF}
      {$IF DEFINED(iOS) or DEFINED(ANDROID)}
        DriverLink.VendorHome:= '';
        DriverLink.VendorLib:= IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'libfbclient.so.4.0.0';
      {$ENDIF}
        if FileExists(DriverLink.VendorLib) then
          DriverLink.DriverIntf.Load;
      end;

 

Этот код поместить в OnCreate формы?

procedure TForm1.FormCreate(Sender: TObject);
var
  DriverLink:TFDPhysDriverLink;
begin
  FDPhysManager().Open;
  DriverLink:=FDPhysManagerObj.FindDriverLink(DriverName);
  if not assigned(DriverLink) then
    DriverLink:=TFDPhysFBDriverLink.Create(nil);

  if DriverLink.DriverState<TFDPhysDriverState.drsLoaded then
  begin
    {$IF DEFINED(iOS) or DEFINED(ANDROID)}
      DriverLink.VendorHome:= '';
      DriverLink.VendorLib:= IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'libfbclient.so.3.0.10';
    {$ENDIF}
      if FileExists(DriverLink.VendorLib) then
        DriverLink.DriverIntf.Load;
  end;

  ClientLibrary := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db' + PathDelim + 'libfbclient.so.3.0.10';
  UniConnectionFB.ConnectString := 'Provider Name=InterBase;' +
                                   'Data Source=***.***.***.***;' +
                                   'Database=myDB;' +
                                   'Port=3050;' +
                                   'User ID=*****;' +
                                   'Password=******;'+
                                   'Client Library=' +  ClientLibrary + ';' +
                                   'Use Unicode=True;' +
                                   'Login Prompt=False';
end;

 

Изменено пользователем msccenter
Ссылка на комментарий
  • 0
const DriverName='FB';
...
FConnection.DriverName:=DriverName;
with FConnection do
begin
  Params.Database:= 'Database';
  Params.UserName := 'UserName';
  Params.Password := 'Password';
  Params.Values[S_FD_ConnParam_IB_Protocol]:='TCPIP';
  Params.Values[S_FD_ConnParam_Common_Server]:=Server;
  Params.Values[S_FD_ConnParam_Common_Port]:=Port;
  Params.Values[S_FD_ConnParam_IB_SQLDialect]:='3';
  Params.Values[S_FD_ConnParam_IB_RoleName]:=Role;
  Params.Values[S_FD_ConnParam_Common_CharacterSet]:=CharacterSet;
end;
FConnection.Connected:=true;

 

Изменено пользователем Slym
Ссылка на комментарий
  • 0
2 часа назад, Slym сказал:
const DriverName='FB';
...
FConnection.DriverName:=DriverName;
with FConnection do
begin
  Params.Database:= 'Database';
  Params.UserName := 'UserName';
  Params.Password := 'Password';
  Params.Values[S_FD_ConnParam_IB_Protocol]:='TCPIP';
  Params.Values[S_FD_ConnParam_Common_Server]:=Server;
  Params.Values[S_FD_ConnParam_Common_Port]:=Port;
  Params.Values[S_FD_ConnParam_IB_SQLDialect]:='3';
  Params.Values[S_FD_ConnParam_IB_RoleName]:=Role;
  Params.Values[S_FD_ConnParam_Common_CharacterSet]:=CharacterSet;
end;
FConnection.Connected:=true;

 

Написал код в кнопке, вот так:

procedure TForm1.Button3Click(Sender: TObject);
const
  DriverName='FB';
var
  DriverLink:TFDPhysDriverLink;
begin
  FDPhysManager().Open;
  DriverLink:=FDPhysManagerObj.FindDriverLink(DriverName);
  if not assigned(DriverLink) then
    DriverLink:=TFDPhysFBDriverLink.Create(nil);

  if DriverLink.DriverState<TFDPhysDriverState.drsLoaded then
  begin
    {$IF DEFINED(iOS) or DEFINED(ANDROID)}
      DriverLink.VendorHome:= '';
      DriverLink.VendorLib:= IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'libfbclient.so.3.0.10';
    {$ENDIF}
      if FileExists(DriverLink.VendorLib) then
        DriverLink.DriverIntf.Load;
  end;

  FDConnection1.DriverName:=DriverName;
  with FDConnection1 do
  begin
    Params.Database:= '***';
    Params.UserName := '***';
    Params.Password := '***';
    Params.Values['S_FD_ConnParam_IB_Protocol']:='TCPIP';
    Params.Values['S_FD_ConnParam_Common_Server']:='*********';
    Params.Values['S_FD_ConnParam_Common_Port']:='***';
    Params.Values['S_FD_ConnParam_IB_SQLDialect']:='3';
    Params.Values['S_FD_ConnParam_IB_RoleName']:='';
  end;
  FDConnection1.Connected:=true;
end;

Выдалось такое сообщение:

Да, у меня нет InterBase. Для работы с Firebird я использую FireDAC, а не IB-компоненты...

9a7155ce-99e0-4980-b76c-c2e2db9931de.jpeg

Ссылка на комментарий
  • 0
2 часа назад, Slym сказал:
const DriverName='FB';
...
FConnection.DriverName:=DriverName;
with FConnection do
begin
  Params.Database:= 'Database';
  Params.UserName := 'UserName';
  Params.Password := 'Password';
  Params.Values[S_FD_ConnParam_IB_Protocol]:='TCPIP';
  Params.Values[S_FD_ConnParam_Common_Server]:=Server;
  Params.Values[S_FD_ConnParam_Common_Port]:=Port;
  Params.Values[S_FD_ConnParam_IB_SQLDialect]:='3';
  Params.Values[S_FD_ConnParam_IB_RoleName]:=Role;
  Params.Values[S_FD_ConnParam_Common_CharacterSet]:=CharacterSet;
end;
FConnection.Connected:=true;

 

 

30 минут назад, msccenter сказал:

Написал код в кнопке, вот так:

procedure TForm1.Button3Click(Sender: TObject);
const
  DriverName='FB';
var
  DriverLink:TFDPhysDriverLink;
begin
  FDPhysManager().Open;
  DriverLink:=FDPhysManagerObj.FindDriverLink(DriverName);
  if not assigned(DriverLink) then
    DriverLink:=TFDPhysFBDriverLink.Create(nil);

  if DriverLink.DriverState<TFDPhysDriverState.drsLoaded then
  begin
    {$IF DEFINED(iOS) or DEFINED(ANDROID)}
      DriverLink.VendorHome:= '';
      DriverLink.VendorLib:= IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'libfbclient.so.3.0.10';
    {$ENDIF}
      if FileExists(DriverLink.VendorLib) then
        DriverLink.DriverIntf.Load;
  end;

  FDConnection1.DriverName:=DriverName;
  with FDConnection1 do
  begin
    Params.Database:= '***';
    Params.UserName := '***';
    Params.Password := '***';
    Params.Values['S_FD_ConnParam_IB_Protocol']:='TCPIP';
    Params.Values['S_FD_ConnParam_Common_Server']:='*********';
    Params.Values['S_FD_ConnParam_Common_Port']:='***';
    Params.Values['S_FD_ConnParam_IB_SQLDialect']:='3';
    Params.Values['S_FD_ConnParam_IB_RoleName']:='';
  end;
  FDConnection1.Connected:=true;
end;

Выдалось такое сообщение:

Да, у меня нет InterBase. Для работы с Firebird я использую FireDAC, а не IB-компоненты...

9a7155ce-99e0-4980-b76c-c2e2db9931de.jpeg

А сейчас вот дописал и поправил код так:

  FDConnection1.DriverName:=DriverName;
  with FDConnection1 do
  begin
    Params.Database:= '***';
    Params.UserName := '***';
    Params.Password := '***';
    Params.Add('Server=***.***.***.***');
    Params.Add('Port=3050');
    Params.Add('Protocol=ipTCPIP');
  end;
  FDConnection1.Connected:=true;

Получил ошибку такую:

image.thumb.png.d2a535c147dfb15db0a04fabf38896b7.png

Причем, через тот же IBExpert, либо в Design Time из IDE Delphi, с теми же параметрами, подключаюсь отлично.

В брандмауере порт открыт, раз по IP подключаюсь. 

Причем, в том же приложении мобильном, я спокойно подключаюсь к SQL Server Express, тоже по IP.

 

Может для подключения через FireDAC надо отдельно как-то правило настраивать в брандмауэре?

Изменено пользователем msccenter
Ссылка на комментарий
  • 0

заметь - ругается на сетевое подключение... либо порт либо ip неправильно указаны...
мой uses
  FireDAC.Comp.Client, FireDAC.Comp.DataSet,
  FireDAC.Stan.Def, FireDAC.Stan.Param, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.Stan.Consts, FireDAC.Stan.Async,
  FireDAC.DApt,
  FireDAC.Phys, FireDAC.Phys.Intf, FireDAC.Phys.FB, FireDAC.Phys.FBDef, FireDAC.Phys.IBBase;
 

    Params.Values['S_FD_ConnParam_IB_Protocol']:='TCPIP';
    Params.Values['S_FD_ConnParam_Common_Server']:='*********';
    Params.Values['S_FD_ConnParam_Common_Port']:='***';
константы без кавычек ключ в uses FireDAC.Stan.Consts
Изменено пользователем Slym
Ссылка на комментарий
  • 0
9 минут назад, Slym сказал:

заметь - ругается на сетевое подключение... либо порт либо ip неправильно указаны...
мой uses
  FireDAC.Comp.Client, FireDAC.Comp.DataSet,
  FireDAC.Stan.Def, FireDAC.Stan.Param, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.Stan.Consts, FireDAC.Stan.Async,
  FireDAC.DApt,
  FireDAC.Phys, FireDAC.Phys.Intf, FireDAC.Phys.FB, FireDAC.Phys.FBDef, FireDAC.Phys.IBBase;
 

    Params.Values['S_FD_ConnParam_IB_Protocol']:='TCPIP';
    Params.Values['S_FD_ConnParam_Common_Server']:='*********';
    Params.Values['S_FD_ConnParam_Common_Port']:='***';
константы без кавычек ключ в uses FireDAC.Stan.Consts

А то, что я прописал параметры сервера и порта- это неправильно?

Я просто снес InterBase как бы, т.к. он мешал мне при работе с Firebird по IP.

Ссылка на комментарий
  • 0
1 час назад, Slym сказал:

заметь - ругается на сетевое подключение... либо порт либо ip неправильно указаны...

Ну, данные те же, что и в IBExpert прописаны, в котором работает подключение...

Прописал как ты сказал, без кавычек, ошибки нет, но выдается ошибка как на скрине выше...

Буду думать, в чем может быть дело, что может блокировать удаленное подключение... :(

Ссылка на комментарий
  • 0
2 часа назад, Slym сказал:

заметь - ругается на сетевое подключение... либо порт либо ip неправильно указаны...
мой uses
  FireDAC.Comp.Client, FireDAC.Comp.DataSet,
  FireDAC.Stan.Def, FireDAC.Stan.Param, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.Stan.Consts, FireDAC.Stan.Async,
  FireDAC.DApt,
  FireDAC.Phys, FireDAC.Phys.Intf, FireDAC.Phys.FB, FireDAC.Phys.FBDef, FireDAC.Phys.IBBase;
 

    Params.Values['S_FD_ConnParam_IB_Protocol']:='TCPIP';
    Params.Values['S_FD_ConnParam_Common_Server']:='*********';
    Params.Values['S_FD_ConnParam_Common_Port']:='***';
константы без кавычек ключ в uses FireDAC.Stan.Consts

А может быть такое, что у меня по этому пути .\assets\internal\db\ не находится что-то?

Может быть надо было написать .\assets\internal\?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...