Как да предам NULL стойност от компонент Unidac Query в Delphi?

Когато използвам компонент StoredProc в Delphi, използвайки ParamByname('ParamName').Clear, мога да изпратя NULL стойност.

Но как мога да предам NULL стойност, когато използвам компонент Query?

with Query do
begin
 SQL.ADD('exec d_upd_calc'+Quoted(EditCalc.Text));
end

В горния сценарий искам да изпратя NULL, ако полето за редактиране е празно.

Използвам Delphi 2010, Unidac със Sybase.


person SSE    schedule 22.11.2011    source източник


Отговори (2)


Дори в Queries можете да работите с параметри:

Query.SQL.Text := 'exec d_upd_calc :myparam';
Query.Prepare;
Query.ParamByName('myparam').Clear;

И е по-добре да използвате параметри, отколкото да изграждате пълния низ, защото не трябва да обработвате кавички и да избягвате изтичане на сигурност чрез SQL-инжекция.

person Michael    schedule 22.11.2011
comment
Допълнение: може да се наложи да посочите тип данни на параметъра DataType := ftString или как иначе. - person da-soft; 22.11.2011

С Advantage DB бих направил нещо по следния начин:

var
  sqlText: string;

with Query do
begin
  if EditCalc.Text = '' then
    sqlText := 'exec d_upd_calc NULL' else
    sqlText := 'exec d_upd_calc '+Quoted(EditCalc.Text);
  SQL.ADD(sqlText);
end;

Ако ключовата дума също е NULL, това трябва да работи.

Quoted Премахва/избяга ли всяко опасно потребителско въвеждане, за да предотврати SQL инжектиране? Ако да, значи е добре. Ако не, тогава трябва.

person Heinrich Ulbricht    schedule 22.11.2011
comment
if Trim(CalcType.Text) ‹› '' then Calc:= Quoted(Trim(CalcType.Text)) else Calc := 'Null'; Преди добавяне към SQL давам като цитиран.. Така че сега не създава проблем.. благодаря - person SSE; 22.11.2011