четверг, 21 октября 2010 г.

Полезняшки. Запись в БД (FibPlus)

Очень часто при работе с Firevbird-ом мне приходилось генерировать различные скрипты для обновления БД. В основном это касалось скриптов вида Insert/Update. Так как большинство таких скриптов типовые, мне очень скоро пришла в голову мысль написать функцию помощник в записи/обновлении БД.


Итак родилось вот такое решение:

unit Func.FIBTools;

interface

Uses ExtendedDialogs, SysUtils, FIB, FIBQuery, pFIBQuery, Variants;

var
FQ : TpFIBQuery;

// записать в БД
function SaveDataToBase(Script : string; ParamByName, Data : Variant; showException : Boolean = true) : Boolean;

implementation

function SaveDataToBase(Script: string; ParamByName, Data : Variant; showException : Boolean = true) : Boolean;
var
I : Integer;
PN : string;
DataValue : Variant;
begin
Assert(VarArrayHighBound(ParamByName, 1) = VarArrayHighBound(Data, 1), 'SaveDataToBase: разные длины variant-массивов');
Assert(VarIsArray(ParamByName), 'SaveDataToBase: ParamByName не Variant массив');
Assert(VarIsArray(Data), 'SaveDataToBase: Data не Variant массив');
Assert(Assigned(FQ), 'SaveDataToBase: FQ = nil');

Try
Result := False;
VarArrayLock(ParamByName);
VarArrayLock(Data);
Try
FQ.SQL.Clear;
FQ.Transaction.Active := True;
FQ.SQL.Add(Script);
for I := VarArrayLowBound(ParamByName, 1) to VarArrayHighBound(ParamByName, 1) do
begin
PN := VarToStr(VarArrayGet(ParamByName, [I]));
DataValue := VarArrayGet(Data, [I]);
FQ.ParamByName(PN).AsVariant := DataValue;
end;
FQ.Prepare;
if FQ.Prepared then
begin
FQ.ExecQuery;
FQ.Transaction.Active := True;
end
else
Exception.Create('SaveDataToBase: Prepare не успешен.');
except
on E : exception do
begin
if showException then
KdnMessageV(['Ошибка записи в БД', 'Скрипт:', Script, '', 'Ошибка:', E.Message]);
Exit;
end;
End;
Result := True;
Finally
VarArrayUnLock(ParamByName);
VarArrayUnLock(Data);
End;
end;

end.


Функция принимает текст скрипта и массив параметров и значений, также можно задать обработку ошибок. Параметры и значения посылаются в Varrian-массиве.

Перед работой нужно связать переменную FQ с компонентом FIBQuery. Обычно я делаю это в DataModule (в DataModuleCreate)


Func.FIBTools.FQ := DM.FIBQuery; // Связываем с FibQuery

Вуаля, теперь если мы хотим выполнить скрипты мы можем написать примерно такой код:

Script :=
  'UPDATE MYTABLE SET '+
    ' STATE = :STATE, '+
    ' "START"= :START, '+
    ' ENDS = :ENDS, '+
    ' FLG_HLP1 = :F, '+
    '
FLG_HLP2 = :F, '+
    'WHERE '+
    ' FK_TASK = :TASK_ID AND';

SaveDataToBase(Script,
  // Переменные 

  VarArrayOf(['STATE','START','ENDS','TASK_ID', 'F']),
  // Данные

  varArrayOf([StateID,
             Null,
             Null,
             TaskId,
             False ])
);



Этим кодом мы передадим в функцию переменные (для Prepare) и их значения, причем значения могут быть разных типов.

Комментариев нет:

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