Очень часто при работе с 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) и их значения, причем значения могут быть разных типов.
Комментариев нет:
Отправить комментарий