SQL команда с параметри.
6 отговора
232 прегледа
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;
Написал съм ей това нещо. 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;
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;
Не съм много сигурен де ;-))) - пиша много наизуст.
---
Колкото повече, толкова повече.
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;
Не съм много сигурен де ;-))) - пиша много наизуст.
---
Колкото повече, толкова повече.
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!
При мен в D6/MySQL при заявка за ъпдейт на текстови полета (но не с параметри като при теб, а директно - 'UPDATE INTO xxx SET Field1="' + sVar1 + '"') гърмеше понякога. При CheckParams := false върви и записаните стойности са коректни (sVar1 e предварително искейпната, грешките не бяха от това).
Не ти предлагам този вариант като панацея, само обърни внимание :-))
p.s. Фантомас е много прав за нещо - заявки, които не връщат резултат (update, delete, insert), се изпълняват с ExecSQL, а не с Open!
Редактирано от bass на
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-сървъра)
ЧеФо
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-сървъра)
ЧеФо
Re: SQL команда с параметри.
Малко допълнение:
По-надеждно (по-малко изненади при развитието на системата в бъдеще) е
..........
SQL.Add ('Insert into VDATA (Field1,Field2,Field3) VALUES (:VDATA1,:VDATA2,:VDATA3)');
............
PS. И да не се забравя try except
По-надеждно (по-малко изненади при развитието на системата в бъдеще) е
..........
SQL.Add ('Insert into VDATA (Field1,Field2,Field3) VALUES (:VDATA1,:VDATA2,:VDATA3)');
............
PS. И да не се забравя try except
Редактирано от NDeu на
Re: SQL команда с параметри.
Field1,.... - пропуска е мой, копирах SQL-а директно от предния постинг.
А за try except си ужасно прав. Аз дори правя така:
with SQLQuery try try
//върша си работата
except
//обработвам изключенията
end;
finally
//Тук са всички Close, Free и каквото трябва...
end;
ЧеФо
А за try except си ужасно прав. Аз дори правя така:
with SQLQuery try try
//върша си работата
except
//обработвам изключенията
end;
finally
//Тук са всички Close, Free и каквото трябва...
end;
ЧеФо
Гепих го!
Абсолютно прави сте! Върви.
Това със смяната на Open е ясно. Проблема се оказа обаче във реда на операторите. Погледнато логично - подготвяш си командата, подготвяш си параметрите и накрая изпълняваш заявката. Не би трябвало да има никакво значение кой ред - къде е. Да ама се оказа, че ако
SQLQuery.SQL.Add е преди SQLQuery.Params нещата не стават - пробвайте, ако не вярвате.
Това със смяната на Open е ясно. Проблема се оказа обаче във реда на операторите. Погледнато логично - подготвяш си командата, подготвяш си параметрите и накрая изпълняваш заявката. Не би трябвало да има никакво значение кой ред - къде е. Да ама се оказа, че ако
SQLQuery.SQL.Add е преди SQLQuery.Params нещата не стават - пробвайте, ако не вярвате.