Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

У этого поста сразу две цели. Во-первых, я хочу немного рассказать о своих экспериментах с FireDAC, а во-вторых – о том, как продвигаются дела с DB2Clipboard. Все же данный пост будет не информационно-развлекательным (чем я часто грешу в последнее время), а техническим.

Как ни странно, не смотря на достаточно интенсивную информационную поддержку продукта, многие не понимают что из себя представляет FireDAC и зачем он включен в состав Delphi/C++ Builder/RAD Studio.  Поэтому вкратце…

FireDAC это новая библиотека компонентов доступа к данным, созданная на базе хорошо известной AnyDAC. Фактически она стала заменой альтернативой  dbExpress. Сочетает в себе простоту использования, стабильность работы и широкие функциональные возможности. Кроме этого впечатляет набор поддерживаемых СУБД.

Владельцы старших редакций Delphi получают FireDAC бесплатно. Владельцы Professional редакции могут купить Пакет дополнений к Delphi XE4 Professional для клиент-серверного подключения FireDAC .

Подобный продукт для меня представляет особый интерес, хотя бы потому, что мне есть с чем сравнивать (о чем еще будет отдельный разговор). И практически-прикладная задача сразу же нашлась. Я уже писал о том, что в утилите DB2Clipboard реализовал импорт модели, создаваемой ER/Studio из XML формата. Теперь же, с использованием FireDAС,  никто не мешает подключаться к БД напрямую. При правильной подходе можно организовать импорт структуры из любой СУБД, поддерживаемой FireDAC.

Настройка подключения.

В силу определенных причин, первым делом я попробовал настроить соединение с БД MS Access. Все оказалось достаточно просто. На форму водружаются компоненты
TADConnection, TADPhysMSAccessDriverLink и TADGUIxWaitCursor. Даблклик по компоненту TADConnection вызывает диалог настройки соединения.

Актуальные настройки я привел в фрагменте .dfm файла.

  object ADConnection: TADConnection
    Params.Strings = (
      'Database=C:ATR0ATR.mdb'
      'User_Name=Admin'
      'DriverID=MSAcc')
    TxOptions.ReadOnly = True
    LoginPrompt = False
    Left = 24
    Top = 24
  end
  object ADGUIxWaitCursor1: TADGUIxWaitCursor
    Left = 200
    Top = 200
  end
  object ADPhysMSAccessDriverLink1: TADPhysMSAccessDriverLink
    Left = 144
    Top = 16
  end 

Не сложно догадаться, что свойство Connected отвечает за состояние соединения (подключено или нет), а для подключения к другим СУБД необходимо использовать другой DriverLink.

В режиме проектирования все прекрасно работает и без TADGUIxWaitCursor. Но при запуске программы FireDAC попросит разместить этот компонент на форме. Собственно, нам не жалко – разместили. При работе с FireMonkey не забудьте установить свойство Providrer в значение FMX.

Но исходя из конкретики DB2Clipboard нам требуется настраивать соединение в run-time.

Здесь мы можем вызвать метод класса TfrmADGUIxFormsConnEdit.Execute

 if TfrmADGUIxFormsConnEdit.Execute(DM.ADConnection, '') then
 begin
  DM.ADConnection.Connected:= true;
 end;

Следует не забыть объявить модуль uADGUIxFormsfConnEdit. Таким образом, вызывается стандартный диалог настройки соединения в режиме выполнения.

Создание списка Recent Connections

Список недавних подключений дает дополнительные удобства и избавляет пользователя от нудного ввода настроек соединения при каждом запуске программы. Здесь пришлось создать немного кода. Выглядит он примерно так:

procedure TfMain.FormCreate(Sender: TObject);
var
  s, sfn, recFn: TFileName;
begin
 lstRecentCon:= TStringList.Create;

   recFn:= GetCustIniFileName('Recent.ini'); // Получаем имя файл с путем

   if FileExists(recFn) then
   begin
    lstRecentCon.LoadFromFile(recFn);
    CreateRcntMnu();
   end;

end;

После создания главной формы приложения считываем сохраненный список подключений из файла (если он существует) и вызываем подпрограмму формирования меню.

procedure TfMain.CreateRcntMnu();
var
newcl, newSubCl : tactionclientitem;
NewAction: TAction;
s: string;
begin
newcl:=ActionMainMenuBar1.ActionControls[0].ActionClient.items.Add;
newcl.items:= nil;
newcl.UsageCount:= -1;
newcl.caption:='Recent';
newcl.visible:=true;
CodeSite.Send(IntToStr(newcl.Index));
newcl.Index:=3;

for s in lstRecentCon do
begin
newSubCl:=  newcl.items.Add;

newSubCl.items:= nil;
newSubCl.UsageCount:= -1;

NewAction:= TAction.Create(am);
NewAction.Caption:= s;
NewAction.OnExecute:= Action1Execute;
newSubCl.Action:= NewAction;
newSubCl.visible:=true;
end;
end;

Формируем меню из списка, а заодно добавляем для каждого из вновь сформированных пунктов компонент TAction. Обработчик OnExecute для него будет выглядеть следующим образом:

procedure TfMain.Action1Execute(Sender: TObject);
var
i: integer;
begin
if Sender.ClassNameIs('TAction') then
begin
DM.ConnectWithString((Sender as TAction).Caption);

  if not DM.ADConnection.Connected then
  begin
    MessageDlg('Connection is failed.', mtError, [mbOK], 0);
    Exit;
  end;

{...skiped...}

end;

Просто закрываем текущее  соединение и устанавливаем ему в качестве ConnectionString значение свойства Caption (а его мы взяли из списка соединений). И осуществляем подключение.

И, наконец, при подключении с помощью диалога нам требуется добавить новое соединение в список и сохранить его в файл:

  if lstRecentCon.IndexOf(DM.ADConnection.ConnectionString)<0 then
  begin
  lstRecentCon.Insert(0,DM.ADConnection.ConnectionString);
  lstRecentCon.SaveToFile(GetCustIniFileName('Recent.ini'));
  end;

Как видите, все довольно не сложно. Хотя, возможно,  показывать в списке недавних подключений всю строку соединения и не лучшая идея, зато наглядно.

Больше СУБД

С настройкой соединения с БД Access мы разобрались? А как же подключить другие СУБД? Оказывается все проще простого. Достаточно на форму с соединением (TADConnection) положить другие компоненты DriverLink.

Соединение с SQLite и MySQL базами данных заработало без изменения кода. В списке Driver Id появилось два новых драйвера. К слову, процедура импорта структуры, которая у меня уже была реализована, так же заработала без проблем.

Единственной проблемой было то, что при подключении к MySQL, FireDAC попросил актуальный файл libmysql.dll, получив который успешно установил соединение. Но это уже вопрос деплоймента.

Таким образом, на текущий момент DB2Clipboard поддерживает прямой импорт структуры из трех СУБД. Вполне вероятно, что без модификации кода этот список может быть существенно расширен. После надлежащего оформления интерфейса я планирую рискнуть опубликовать программу. Жду ваших комментариев.


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

4 комментария: FireDAC. Работа с ADConnection.

  • Спасибо, понятно. А как все это можно сделать програмно? Как получить список таблиц в базе?

  • Настроил подключение, но при коннекте выскакивает ошибка:
    Failed to connect to DBMS !
    [FireDAC][Phys][ODBC][Microsoft][Драйвер ODBC Microsoft Access] Недостаточно системных ресурсов.

    Перерыл все что можно было, так и не нашел причину

  • Здравствуйте!
    Помогите! Не могу подключиться к MySQL пишет что нет библиотеки libmysql.dll, но она блин есть. Я её уже в сам проект пихал, и в windows\system32 и в windows\sysWOW64 и ничего не помогает. Даже ставил mysql-connector и бестолку.

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика