Перейти к содержанию
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

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

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

  • 1

Библиотеку нужно не забыть добавить в Deployment (release и debug).

У меня рядом с папкой проекта есть, т.е. на одном уровне, папка media, где лежат иконки, картинки, so-библиотеки и прочий мусор для деплоя.

В столбце Remote path указываем ".\assets\internal\db". Открываем "Project/Deployment", выбираем конфигурацию над таблицей,  жмякаем слева + и выбираем файл. Только обрати внимание ,что галочка слева должна быть отключена.

В проекте, в процедуре подключения к базе есть строка:

ClientLibrary := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db' + PathDelim + 'libfbclient.so.3.0.2';

ну или "'libfbclient.so.2'", в зависимости от версии Firebird сервера: 2.5 или 3.0.

Не забудь добавить в USES модуль System.IOUtils.

 

Сразу напишу, что Андроид, как и Линукс туповаты, поэтому подключиться к хост-машине с Firebird по имени компьютера не получится.

По крайне мере у меня не получилось.

Поэтому в качестве адреса (параметр "Data Source") выступает IP адрес.

 

Собираем строку подключения:

 

    UniConnectionFB.ConnectString := 'Provider Name=InterBase;' +
                                     'Data Source=' +     server +';' +
                                     'Database=' +        Database + ';' +
                                     'Port=' +            port +';' +
                                     'User ID=' +         Username +';' +
                                     'Password=' +        Password + ';'+
                                     'Client Library=' +  ClientLibrary + ';' +
                                     'Character Set='+    CharacterSet + ';' +
                                     'Use Unicode=True;Login Prompt=False';

 

Screenshot_40.png

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

Добрый день!

У меня вот не получается установить подключение к серверу Firebird через приложение Android.

Я разместил файл libfbclient.so.2.5.8 в папке assets\internal, в меню Project - Deployment указал путь сначала так:

image.thumb.png.848424ed726058dc833ef615c3ca6fa1.png

Потом сделал через кнопку image.png.a39efb033b982ece3911ccffd6d19ef3.png так:

image.thumb.png.d370f0717ae10737ac1d12f8cbb604f6.png

В самом проекте у меня есть DataModule, в котором есть IBConnection из библиотеки IBDac от Devart.

Путь к библиотеке я прописал в FormCreate этого модуля так:

image.png.a58730139ff667ba9710b6b235076d61.png

Когда пробую подключиться к моему удаленному серверу по IP адресу, то получаю ошибку:

Cannot load client library: /data/user/0/com.embarcadero.msccMobile/files/libfbclient.so.2.5.8.

 

Что я делаю не так? Как мне сделать, чтобы подключалось нормально?

Прошу помочь, только второй день работаю с этим направлением.

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

просто не нужно так делать

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

мобильные приложения чаще всего используют HTTP для связи с промежуточным сервером, а уж он подключается к базе

Ссылка на комментарий
  • 0
21 минуту назад, krapotkin сказал:

просто не нужно так делать

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

мобильные приложения чаще всего используют HTTP для связи с промежуточным сервером, а уж он подключается к базе

А можно пример как такое реализовать?

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

примеров полно, но нужно бы ТЗ иметь.

обращение из программы к серверу - через THttpClient

сервер - в зависимости от умений и знаний, на любом языке. традиционно у нас в ходу PHP

 

Ссылка на комментарий
  • 0
4 минуты назад, krapotkin сказал:

примеров полно, но нужно бы ТЗ иметь.

обращение из программы к серверу - через THttpClient

сервер - в зависимости от умений и знаний, на любом языке. традиционно у нас в ходу PHP

 

Да ну какое ТЗ, это мой личный проект)

А вот у меня сайт на Wordpress есть, пойдет в качестве сервера для работы мобильного приложения через http?

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

wordpress думаю не совсем та платформа))

тут на сайте полно примеров THttpClient

а по поводу сервера вам нужно читать что-то типа PHP REST API tutorial, например

https://klisl.com/php-api-rest.html

Ссылка на комментарий
  • 0
51 минуту назад, krapotkin сказал:

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

Прямо совсем совсем все плохо работает? Зачем-то же тогда созданы эти компоненты.

Ведь через них возможно же сделать прямое подключение? Если да, то я и прошу сказать, что я не так донастроил. С тем, что это плохо работает возможно, я разберусь позже.

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

Добрый день!

У меня вот не получается установить подключение к серверу Firebird через приложение Android.

Я разместил файл libfbclient.so.2.5.8 в папке assets\internal, в меню Project - Deployment указал путь сначала так:

image.thumb.png.848424ed726058dc833ef615c3ca6fa1.png

Потом сделал через кнопку image.png.a39efb033b982ece3911ccffd6d19ef3.png так:

image.thumb.png.d370f0717ae10737ac1d12f8cbb604f6.png

В самом проекте у меня есть DataModule, в котором есть IBConnection из библиотеки IBDac от Devart.

Путь к библиотеке я прописал в FormCreate этого модуля так:

image.png.a58730139ff667ba9710b6b235076d61.png

Когда пробую подключиться к моему удаленному серверу по IP адресу, то получаю ошибку:

Cannot load client library: /data/user/0/com.embarcadero.msccMobile/files/libfbclient.so.2.5.8.

 

Что я делаю не так? Как мне сделать, чтобы подключалось нормально?

Прошу помочь, только второй день работаю с этим направлением.

Скорее всего, файл не деплоится.

Уберите библиотеку из \Android\Release\.... и поместите ее в другое место, к примеру, в корень проекта.

Заново добавьте в Deployment

Ссылка на комментарий
  • 0
9 минут назад, mazayhin сказал:

Скорее всего, файл не деплоится.

Уберите библиотеку из \Android\Release\.... и поместите ее в другое место, к примеру, в корень проекта.

Заново добавьте в Deployment

Вот это убрать?

image.thumb.png.4606a17d51d9514296f0325ea136e16a.png

Ссылка на комментарий
  • 0
4 минуты назад, mazayhin сказал:

Да. Сам файл перенести в другое место, и затем добавить заново. Remote Path оставить как на скрине

Можно ли его сюда положить?

image.png.4845d3b9a3352151cab57f8916204af8.png

И что считается "корнем" в контексте проекта приложения на Android?

Ссылка на комментарий
  • 0
30 минут назад, msccenter сказал:

Можно ли его сюда положить?

image.png.4845d3b9a3352151cab57f8916204af8.png

И что считается "корнем" в контексте проекта приложения на Android?

К примеру, положи в C:\msccMobile\

Ссылка на комментарий
  • 0
11 минут назад, mazayhin сказал:

К примеру, положи в C:\msccMobile\

Положил сюда:

image.png.a2966d21939e4e736915a67341efc9c7.png

Затем выполнил Deploy через кнопочку и получил такой список:

image.thumb.png.759a2e3ee680e5b6fcba8dc8a350c5df.png

И получается та же ошибка в приложении про то, что не может загрузить библиотеку libfbclient.so.2.5.8.

В самом коде надо менять что-то?

Ссылка на комментарий
  • 0
14 минут назад, msccenter сказал:

Положил сюда:

image.png.a2966d21939e4e736915a67341efc9c7.png

Затем выполнил Deploy через кнопочку и получил такой список:

image.thumb.png.759a2e3ee680e5b6fcba8dc8a350c5df.png

И получается та же ошибка в приложении про то, что не может загрузить библиотеку libfbclient.so.2.5.8.

В самом коде надо менять что-то?

А если до подключения проверить, существует ли файл на устройстве?
 

if TFile.Exists(TPath.Combine(TPath.GetDocumentsPath, 'libfbclient.so.2.5.8)) then
	showmessage('Exists')

 

Ссылка на комментарий
  • 0
9 минут назад, mazayhin сказал:

А если до подключения проверить, существует ли файл на устройстве?
 


if TFile.Exists(TPath.Combine(TPath.GetDocumentsPath, 'libfbclient.so.2.5.8)) then
	showmessage('Exists')

Да, такой код говорит о том, что файл существует на устройстве.

Вот код кнопки подключения к серверу:

  if TFile.Exists(TPath.Combine(TPath.GetDocumentsPath,'libfbclient.so.2.5.8')) then
  begin
    ShowMessage('существует');
    Mobile_DM.IBCConnection1.Connected:=False;
    Mobile_DM.IBCConnection1.Connected:=True;
    if Mobile_DM.IBCConnection1.Connected then
    begin
      ShowMessage('+');
    end
    else
    begin
      ShowMessage('-');
    end;
  end
  else
  begin
    ShowMessage('не существует');
  end;

Но, что интересное, то выдается сначала сообщения, что Cannot load client library: /data/user/0/com.embarcadero.msccMobile/files/libfbclient.so.2.5.8

А потом уже выдается мое проверочное сообщение с текстом "существует". Хотя код говорит, что сначала должно быть оно выходить...

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

а so бинари под правельный cpu?
so - это нативная либа собранная под конкретный cpu, а не байткод докомпилируемый на месте

Изменено пользователем Slym
Ссылка на комментарий
  • 0
13 минут назад, Slym сказал:

а so бинари под правельный cpu?
so - это нативная либа собранная под конкретный cpu, а не байткод докомпилируемый на месте

Ну, у меня ОС на компе, где проект мобильного приложения, является Windows 10. 

Удаленный сервер развернут на Windows Server 2012.

В этом дело? Если да, то я не нашел нужной версии для Windows библиотеки libfbclient...

Но сам-то код правильный же?

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

Всем привет, а для FierDac Delphi 10.3.3 сработает? Вроде для android есть libfbclient.so.3.0.7  (взял тут https://github.com/FirebirdSQL/firebird/releases/download/R3_0_7/Firebird-3.0.7.33374-0.arm.tar.gz) для  FierBird 3.0.7 32bit . Из вне подключаюсь к бд из под wiт10, бд  развернута на MS Server 2019 там порт 3050 проброшен на внешний ip server запущен стандартно в виде службы , хотя 1.5 работал как приложение.

Интересно такой вариант прокатит :

procedure Tdm.FDConnectionSkladBeforeConnect(Sender: TObject);
begin
{$IFDEF MSWINDOWS}
  FDPhysFBDriverLink1.VendorHome:= 'C:\reztsoff\db' ;// под 1.5 в виде приложения прокатывало соединение
  FDPhysFBDriverLink1.VendorLib:= 'C:\reztsoff\db\fbclient.dll';
{$ENDIF}
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
  FDPhysFBDriverLink1.VendorHome:= IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) ;
  FDPhysFBDriverLink1.VendorLib:= IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + PathDelim + 'libfbclient.so.3.0.7';
{$ENDIF}
end;

Ссылка на комментарий
  • 0
В 20.08.2018 в 17:52, x11 сказал:

Библиотеку нужно не забыть добавить в Deployment (release и debug).

У меня рядом с папкой проекта есть, т.е. на одном уровне, папка media, где лежат иконки, картинки, so-библиотеки и прочий мусор для деплоя.

В столбце Remote path указываем ".\assets\internal\db". Открываем "Project/Deployment", выбираем конфигурацию над таблицей,  жмякаем слева + и выбираем файл. Только обрати внимание ,что галочка слева должна быть отключена.

В проекте, в процедуре подключения к базе есть строка:

ClientLibrary := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db' + PathDelim + 'libfbclient.so.3.0.2';

ну или "'libfbclient.so.2'", в зависимости от версии Firebird сервера: 2.5 или 3.0.

Не забудь добавить в USES модуль System.IOUtils.

 

Сразу напишу, что Андроид, как и Линукс туповаты, поэтому подключиться к хост-машине с Firebird по имени компьютера не получится.

По крайне мере у меня не получилось.

Поэтому в качестве адреса (параметр "Data Source") выступает IP адрес.

 

Собираем строку подключения:

 

    UniConnectionFB.ConnectString := 'Provider Name=InterBase;' +
                                     'Data Source=' +     server +';' +
                                     'Database=' +        Database + ';' +
                                     'Port=' +            port +';' +
                                     'User ID=' +         Username +';' +
                                     'Password=' +        Password + ';'+
                                     'Client Library=' +  ClientLibrary + ';' +
                                     'Character Set='+    CharacterSet + ';' +
                                     'Use Unicode=True;Login Prompt=False';

 

Screenshot_40.png

Добрый день!

Смотри, сделал как ты написал.

"Новая папка" - каталог, в котором лежат все файлы проекта.

"media" - каталог, который находится рядом с "Новая папка" и в котором находится файл libfbclient.so.3.0.10 (от Firebird 3.0).

Добавил через Project - Deployment для Debug:

image.thumb.png.41aa595aa6d8806a23e25e4ce31feca0.png

Сделал переменную ClientLibrary в секции private главной формы.

В событии OnCreate главной формы прописал:

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

Но, когда пробую подключиться, то получаю ошибку:

image.thumb.png.f3877b78ed3cac4922c4eea7671ad6f2.png

 

Что я делаю не так? Делал как написал...

Ссылка на комментарий
  • 0
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;

 

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

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

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

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

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

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

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

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

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

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

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