SQL команда с параметри.

6 отговора 232 прегледа
#1

SQL команда с параметри.

Delphi 7
Написал съм ей това нещо. SQLQuery1 e създадена по време на дизайна и се зачиства, защото при дизайна е зададена друга команда, с други параметри, изпълнява се при стартиране на приложението и всичко е О.К. След това искам да се изпълни това, дето е по-долу и като стигне до изпълнение на SQL заявката на последния ред дава грешка 'No value for parameter VDATA1'
Таблицата е с три колони тип символен низ.
Всичко е горе-долу като в примера в хелпа и не мога да разбера защо не работи


SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.Params.Clear;
For i:=1 to 3 do SQLQuery1.Params.Add;
SQLQuery1.Params[0].AsString:=Edit1.Text;
SQLQuery1.Params[1].AsString:=Edit2.Text;
SQLQuery1.Params[2].AsString:=Edit3.Text;
SQLQuery1.SQL.Add('Insert into VDATA VALUES (:VDATA1,:VDATA2,:VDATA3)');
SQLQuery1.Open;

Отговор
в отговор на Mитko #2

Re: SQL команда с параметри.

Пробвай да смениш Open с ExecSQL. Може би ще се наложи да ползваш Prepare -не съм много сигурен - вместо да добавяш параметрите - или вида ще бъде нещо от сорта

SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.Params.Clear;
SQLQuery1.SQL.Add('Insert into VDATA VALUES (:VDATA1,:VDATA2,:VDATA3)');
SQLQuery1.Prepare;
SQLQuery1.Params[0].AsString:=Edit1.Text;
SQLQuery1.Params[1].AsString:=Edit2.Text;
SQLQuery1.Params[2].AsString:=Edit3.Text;
SQLQuery1.ExecSQL;

Не съм много сигурен де ;-))) - пиша много наизуст.

---
Колкото повече, толкова повече.
Отговор
в отговор на Mитko #3

Re: SQL команда с параметри.

HINT: Пробвай какво се случва ако сетнеш SQLQuery.CheckParams := false;
При мен в D6/MySQL при заявка за ъпдейт на текстови полета (но не с параметри като при теб, а директно - 'UPDATE INTO xxx SET Field1="' + sVar1 + '"') гърмеше понякога. При CheckParams := false върви и записаните стойности са коректни (sVar1 e предварително искейпната, грешките не бяха от това).
Не ти предлагам този вариант като панацея, само обърни внимание :-))

p.s. Фантомас е много прав за нещо - заявки, които не връщат резултат (update, delete, insert), се изпълняват с ExecSQL, а не с Open!

Редактирано от bass на

Отговор
в отговор на Mитko #4

Re: SQL команда с параметри.

С Delphi7 по описания по-долу начин съм написал хиляди заявки. Работи безотказно.
with SQLQuery do begin
SQL.Clear;
SQL.Add ('Insert into VDATA VALUES (:VDATA1,:VDATA2,:VDATA3)');
ParamByName ('VDATA1').AsString := Edit1.Text;
ParamByName ('VDATA2').AsString := Edit2.Text;
ParamByName ('VDATA3').AsString := Edit3.Text;
ExecSQL;
end;

Забележка: Наистина за UPDATE, INSERT, DELETE се използва ExecSQL, а за SELECT - Open. Единствено за конструкцията "select * into table2 from table1" може да се използват и Open, и ExecSQL (все пак забелязал съм, че зависи от SQL-сървъра)

ЧеФо
Отговор
в отговор на Chefo #5

Re: SQL команда с параметри.

Малко допълнение:
По-надеждно (по-малко изненади при развитието на системата в бъдеще) е
..........
SQL.Add ('Insert into VDATA (Field1,Field2,Field3) VALUES (:VDATA1,:VDATA2,:VDATA3)');
............

PS. И да не се забравя try except

Редактирано от NDeu на

Отговор
в отговор на NDeu #6

Re: SQL команда с параметри.

Field1,.... - пропуска е мой, копирах SQL-а директно от предния постинг.

А за try except си ужасно прав. Аз дори правя така:

with SQLQuery try try
//върша си работата
except
//обработвам изключенията
end;
finally
//Тук са всички Close, Free и каквото трябва...
end;

ЧеФо
Отговор
в отговор на Mитko #7

Гепих го!

Абсолютно прави сте! Върви.
Това със смяната на Open е ясно. Проблема се оказа обаче във реда на операторите. Погледнато логично - подготвяш си командата, подготвяш си параметрите и накрая изпълняваш заявката. Не би трябвало да има никакво значение кой ред - къде е. Да ама се оказа, че ако
SQLQuery.SQL.Add е преди SQLQuery.Params нещата не стават - пробвайте, ако не вярвате.

Отговор