Как задать переменное количество именованных параметров SQL-запроса для TUniQuery?

Например есть такая функция как ExecSQLEx и в неё можно передавать переменное кол-во параметров:

if not DataModule1.UniConnection1.InTransaction then 
DataModule1.UniConnection1.StartTransaction;          
try          
  //тут выполняемый запрос
  DataModule1.UniConnection1.ExecSQLEx('UPDATE ...','name_parametr1', parametr1, 'name_parametr2', parametr2,'name_parametr3', parametr3 ...);
  DataModule1.UniConnection1.Commit;  
except on E: Exception do
  begin
    DataModule1.UniConnection1.Rollback;
  end;
end;

И ты можешь создать функцию, которая устраняет кучу шаблонного кода (чтобы не писать его каждый раз)

class function myExecSQLEx (SQL:string; params: array of Variant): String; 
...
 function TForm1.myExecSQLEx (SQL:string; params: array of Variant): String;
 begin
  if not DataModule1.UniConnection1.InTransaction then
  DataModule1.UniConnection1.StartTransaction;
  try

    DataModule1.UniConnection1.ExecSQLEx(SQL, params) //просто передаётся произвольное кол-во именованных параметров
    DataModule1.UniConnection1.Commit;
    Result:='ok';
  except on E: Exception do
    begin
      DataModule1.UniConnection1.Rollback;
      Result:='Ошибка: '+ E.Message;
    end;
  end;
 end;

Но это всё работает хорошо для функции ExecSQLEx, а так как я выполняю запрос именно в компоненте TUniQuery, то там есть только точное перечисление заранее указанных параметров:

...
UniQuery1:TUniQuery;
...
UniQuery1.Params.ParamByName('name_parametr1').AsInteger := parametr1;
UniQuery1.Params.ParamByName('name_parametr2').AsInteger := parametr2;
...
UniQuery1.Open;

Можно ли как то сделать для UniQuery передачу произвольного количества именованных параметров?


Ответы (1 шт):

Автор решения: Alex R.

Если нужно именно именованные параметры, то можно попробовать использовать экземпляр класса TParams, вроде он не сильно связан с TDataSet. Или передавать список TList<TPair<string, varinat>>

Но если делать по аналогии, то просто приходимся по параметрам. Следим за соответствием количества, которым значение не нашлось что-то делаем (очищаем, значением по умолчанию).

Код для совпадающего количества.

procedure myExecSQLInQuery (UniQuery1:TUniQuery; params: array of Variant); 
var
  i: integer;
begin
  for i := 0 to UniQuery1.ParamCount - 1 do
    UniQuery1.Params[i].Value := params[i];
end;

Компонент может создаваться внутри как с готовым запросом, так и текст запроса можно передавать из вне.

→ Ссылка