TUniStoredProc - задаёт всем параметрам NULL
TUniStoredProc - задаёт всем параметрам NULL
Добрый день.
Есть база MS SQL 2014 и хранимая процедура, которую я пытаюсь вызвать через TUniStoredProc.
Я не заполняю никаких параметров, но ХП выполняется(что значительно усложняет отладку). Хотя должна выдать ошибку.
Как TUniStoredProc получает список параметров ?
Как сделать так, что бы он его не получал и выдавал ошибку в случае отсутствия параметров ?
Есть база MS SQL 2014 и хранимая процедура, которую я пытаюсь вызвать через TUniStoredProc.
Я не заполняю никаких параметров, но ХП выполняется(что значительно усложняет отладку). Хотя должна выдать ошибку.
Как TUniStoredProc получает список параметров ?
Как сделать так, что бы он его не получал и выдавал ошибку в случае отсутствия параметров ?
Re: TUniStoredProc - задаёт всем параметрам NULL
Для решения вашей задачи вы можете использовать следующий код:
После этого вам следует создавать параметры вручную.
Пожалуйста, обратите внимание, что, если параметр создан и вы не присваиваете ему значение, то по умолчанию значение параметра установится в NULL.
Код: Выделить всё
UniStoredProc.ParamCheck := False;
UniStoredProc.StoredProcName := 'SPName';
UniStoredProc.Prepare;
UniStoredProc.Params.Clear;
Пожалуйста, обратите внимание, что, если параметр создан и вы не присваиваете ему значение, то по умолчанию значение параметра установится в NULL.
Re: TUniStoredProc - задаёт всем параметрам NULL
Добрый день!
Спасибо за ответ.
Если я правильно понимаю, то UniStoredProc.Prepare соединяется с сервером и запрашивает у него параметры ? Это некий аналог ADO.Parameters.Refresh.
Что бы не обращаться к серверу лишний раз, у нас список параметров ХП закеширован на другом сервере в виде XML файла(С ним также работают другие программы на C#), и повторно кэшируется на клиентском приложении.
Можно сделать так, что UniDAC не запрашивал параметры ?
Спасибо за ответ.
Если я правильно понимаю, то UniStoredProc.Prepare соединяется с сервером и запрашивает у него параметры ? Это некий аналог ADO.Parameters.Refresh.
Что бы не обращаться к серверу лишний раз, у нас список параметров ХП закеширован на другом сервере в виде XML файла(С ним также работают другие программы на C#), и повторно кэшируется на клиентском приложении.
Можно сделать так, что UniDAC не запрашивал параметры ?
Re: TUniStoredProc - задаёт всем параметрам NULL
Вы можете использовать компоненты TUniQuery или TUniSQL. Установив свойство ParamCheck в False и необходимый вам SQL запрос в свойстве SQL.Text соответствующих компонентов вам не надо будет вызывать методы Prepare и Params.Clear для решения вашей задачи.
Re: TUniStoredProc - задаёт всем параметрам NULL
Попробовал сделать как вы сказали.
Но в таком случае ошибка возникает даже тогда, когда параметр присутствует.
Можно конечно заменить текст на 'spui_GetItemById 42', но тогда возможна SQL инъекция (если параметр берётся из контролов).
Можно сделать так, когда параметр отсутствует - ошибка. Когда присутствует - исполнятся. Без дополнительных обращений к базе.
Код: Выделить всё
var
Query : TUniQuery;
...
Query.SQL.Text:='spui_GetItemById';
Query.Params.CreateParam(ftInteger,'@ItemID',ptInput).AsInteger:=42;
Query.Open;
Можно конечно заменить текст на 'spui_GetItemById 42', но тогда возможна SQL инъекция (если параметр берётся из контролов).
Можно сделать так, когда параметр отсутствует - ошибка. Когда присутствует - исполнятся. Без дополнительных обращений к базе.
Re: TUniStoredProc - задаёт всем параметрам NULL
Для решения задачи, пожалуйста, попробуйте в вашем примере заменить строку
на
Код: Выделить всё
Query.SQL.Text:='spui_GetItemById';
Код: Выделить всё
Query.SQL.Text:='spui_GetItemById @ItemID = :ItemID';
Re: TUniStoredProc - задаёт всем параметрам NULL
Добрый день!
Мы ищем замену ClientDataSet
И не можем переделать весь проект на аналогичный код.
Кроме того, мы считаем подобный код не совсем безопасным в плане SQL инъекций.
Если я правильно понимаю, то заставить компонент TUniStoredProc НЕ обращаться за списком параметров - нельзя ?
Мы ищем замену ClientDataSet
И не можем переделать весь проект на аналогичный код.
Кроме того, мы считаем подобный код не совсем безопасным в плане SQL инъекций.
Если я правильно понимаю, то заставить компонент TUniStoredProc НЕ обращаться за списком параметров - нельзя ?
Re: TUniStoredProc - задаёт всем параметрам NULL
Для того, чтобы компонент TUniStoredProc не запрашивал параметры у сервера, вы можете устанавливать свойство TUniStoredProc.SQL.Text вместо свойства TUniStoredProc.StoredProcName. Например:
Код: Выделить всё
var
UniStoredProc : TUniStoredProc;
...
UniStoredProc := TUniStoredProc.Create(nil);
try
UniStoredProc.Connection := UniConnection1;
UniStoredProc.ParamCheck := False;
UniStoredProc.SQL.Text := 'EntityGet @ID = :ID';
UniStoredProc.Params.CreateParam(ftInteger,'@ID',ptInput).AsInteger:=1;
UniStoredProc.ExecProc;
finally
UniStoredProc.Free;
end;