Как задать переменное количество именованных параметров 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 шт):
Если нужно именно именованные параметры, то можно попробовать использовать экземпляр класса 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;
Компонент может создаваться внутри как с готовым запросом, так и текст запроса можно передавать из вне.