Примеры процедур, для минимизации кода при работе с БД в Delphi.

Delphi и программирование на нём

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

Теперь о том, как я делал давным давно и как (к моему удивлению) многие программисты делают до сих пор.

Ох уж эти базы данных, чего может быть проще, кинул на форму DBGrid, Connection, Query или Table, DataSource, связал всё это хозяйство и работает — Красота!.. Только если этих таблиц много и выборки очень разнообразны (даже в случае когда мы всё вынесем на отдельную формочку) получится жуть в которой очень легко запутаться и это только на форме, в то что творится внутри кода и заглядывать страшно — бардак.

Да и в любом случае, надо вам скажем выполнить один единственный запрос в коде, и поехало собирание Query с кучей строчек кода.

Что я делаю чтобы всего этого избежать (сразу оговорюсь — идею можно развить, причём значительно и вообще убрать визуальное упоминание о взаимодействии с БД и свести выполнение любых обращений к базе данных практически к одной строчке кода). Я просто добавляю на форме один единственный Connection — к базе данных (хотя и его можно в коде прописать) и создаю две процедуры в той же форме:

Первая процедура будет получать данные для Query:

procedure TDataModule.GetData(script:string; var Query :TADOQuery);
 var error:string;
     id_error:integer;
 label ErrorLabel;
begin
  //Делаем выборку данных - это чтобы не писать по десять раз одно и то-же.
  ErrorLabel:
  id_error:=0;
  Try
    Query.Free;
    Query := TADOQuery.Create(Application);
    Query.Connection := Connection;
    Query.SQL.Clear;
    Query.SQL.Add(script);
    Query.Open;
    Query.ExecSQL();
    Query.Active := true;
  Except
    on E : Exception do
      begin
      error:= 'Ошибка при работе с БД МЭИС! '+#13+#10+'Детально: '+E.Message+#13+#10+#13+#10+'Что делать:'
      +#13+#10+'1 - Попробовать повторить запрос к БД. [Retry]'+#13+#10+'2 - Перезагрузить приложение.'
      +#13+#10+'3 - Обратиться в отдел АСУ за помощью.';

        if (MessageDlg(error, mtError,[mbRetry,mbCancel],0, mbCancel)=mrRetry)
        then id_error:=1;

      end;
  End;
  //Если при ошибке выбрали повторить то повторяем выборку.
  if id_error=1 then
  begin
    //Переподключаемся к БД (тут надо осторожнее если много запросов к БД.)
    Connection.Connected:= false;
    Connection.Connected:= true;
    goto ErrorLabel;
  end;

end;


Вторая функция будет выполнять скрипты Insert и Delete:
function TDataModule.SetData(script:string): bool;
  var Command:TADOCommand;
      error:string;
     id_error:integer;
 label ErrorLabel;
begin
  //Делаем вставку данных выполняем скрипты на вставку и изсенение - это чтобы не писать по десять раз одно и то-же.
  ErrorLabel:
  id_error:=0;

  Try
    Connection.BeginTrans;
    Command:= TADOCommand.Create(Application);
    Command.Connection := Connection;
    Command.CommandText:= script;
    Command.Execute;
    Command.Free;
    Connection.CommitTrans;
    Result:=true;
  Except
    on E : Exception do
      begin
      error:= 'Ошибка при работе с БД МЭИС! '+#13+#10+'Детально: '+E.Message+#13+#10+#13+#10+'Что делать:'
      +#13+#10+'1 - Попробовать повторить запрос к БД. [Retry]'+#13+#10+'2 - Перезагрузить приложение.'
      +#13+#10+'3 - Обратиться в отдел АСУ за помощью.';

        if (MessageDlg(error, mtError,[mbRetry,mbCancel],0, mbCancel)=mrRetry)
        then id_error:=1;

      Result:=false;
      end;
  End;
  //Если при ошибке выбрали повторить то повторяем выборку.
  if id_error=1 then
  begin
    //Переподключаемся к БД (тут надо осторожнее если много запросов к БД.)
    Connection.Connected:= false;
    Connection.Connected:= true;
    goto ErrorLabel;
  end;

end;


Таким образом я избавляюсь от большого количества кода, захламления форм визуальными компонентами, и просто делаю процесс собственной разработки более простым.

Вот как эти процедура и функция используется в коде:
DataModule.GetData('SELECT * from my_table',MyQuery);

MyQuery — будет заполнен данными из таблицы my_table.

DataModule.SetData('update my_table set Name=''HabaHaba'' where ID=1');

Этот скрипт выполнит изменения на таблице my_table.

P.S. Помимо прочего, если присмотреться к процедурам — они имеют проверку на выполнение скрипта, в моём случае это оказалось полезным, в связи с нестабильностью сети, когда соединение рвётся, при этом в обычном случае будет необходимо перезапустить приложение, в случае с этими процедурами нажав кнопку «Повтор» — соединение будет восстановлено.

Delphi Базы данных разработка программирование

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