![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Update в ADO
Andy © (2004-08-02 16:57:00)Подскажите, плиз, что не так делаю при передаче параметров?
with ADOSQL do
begin
with SQL do begin
Clear;
Add('UPDATE cards');
Add('SET numProd = :myNum ');
Add('WHERE (id between :numFisrt and :numLast); ');
end;
Parameters.ParamByName('myNum').Value := myNum;
Parameters.ParamByName('numFirst').Value := numBegin;
Parameters.ParamByName('numLast').Value := numEnd;
try
ExecSQL;
except
on E:Exception do ShowMessage(E.Message);
end;
end;
При выполнении не выдается никаких ошибок, но данные в поле num Seller не заносятся? Хотя если простой запрос без параметров, то отлично выполнятеся.
Sergey13 (2004-08-03 13:43:00) [1]2 Andy (03.08.04 13:33)
Вроде вообще без скобок можно. 8-)
Если диапазоны не пересекаются то вместо
Add('AND (id between :numFirts2 and numLast2)) ');
надо
Add(' OR (id between :numFirts2 and numLast2)) ');
Иначе ни одной записи не получишь.
Johnmen (2004-08-03 13:40:00) [2]>Andy
Насчет скобок я не прав. Не заметил их...:)
Sergey13 (2004-08-03 13:35:00) [3]and : numLast2
Andy (2004-08-03 13:33:00) [4]Господа, прошу прощения, но поясните чайнику где скобки расставить?
Add('UPDATE cards');
Add('SET numProd = :myNum ');
Add('WHERE ((id between :numFisrt and :numLast) ');
Add('AND (id between :numFirts2 and numLast2) )');
Тоже не работает :(
Johnmen (2004-08-03 13:19:00) [5]>KSergey © (03.08.04 13:14) [20]
>Правила - требуют.
Где можно почитать ?
>Но и без этого работает, иногда :)
У некоторых - всегда...:)
KSergey (2004-08-03 13:14:00) [6]> [19] Johnmen © (03.08.04 13:04)
> Не находишь противоречия в выделенном ?
Нет.
Правила - требуют.
Но и без этого работает, иногда :)
Почему - это уже другой вопрос.
Johnmen (2004-08-03 13:04:00) [7]>KSergey © (03.08.04 12:58) [17]
>Люди, чего спорите?? ParseSQL необходимо вызыватьпри
>динамическом формировании SQL-запроса! (хотя, не спорю, иногда
>и без этого проканывает)
Никто не спорит.
Не находишь противоречия в выделенном ?
>Andy
Скобки то расставь...
Andy (2004-08-03 12:59:00) [8]
with ADOSQL do
begin
with SQL do begin
Clear;
Add('UPDATE cards');
Add('SET numProd = :myNum ');
Add('WHERE (id between :numFisrt and :numLast); ');
end;
Parameters.ParseSQL(SQL.Text, True);
Parameters.ParamByName('myNum').Value := myNum;
Parameters.ParamByName('numFirst').Value := numBegin;
Parameters.ParamByName('numLast').Value := numEnd;
try
ExecSQL;
except
on E:Exception do ShowMessage(E.Message);
end;
end;
В таком виде все 'вдруг' заработало, но стоило только добавить в запрос еще один диапазон, как сразу перестало работать, причем ошибок опять тоже не выдает.
with ADOSQL do
begin
with SQL do begin
Clear;
Add('UPDATE cards');
Add('SET numProd = :myNum ');
Add('WHERE (id between :numFisrt and :numLast) ');
Add('AND (id between :numFirts2 and numLast2) ');
end;
Parameters.ParseSQL(SQL.Text, True);
Parameters.ParamByName('myNum').Value := myNum;
Parameters.ParamByName('numFirst').Value := numBegin;
Parameters.ParamByName('numLast').Value := numEnd;
Parameters.ParamByName('numFirst2').Value := numBegin2;
Parameters.ParamByName('numLast2').Value := numEnd2;
try
ExecSQL;
except
on E:Exception do ShowMessage(E.Message);
end;
end;
:(
KSergey (2004-08-03 12:58:00) [9]Люди, чего спорите?? ParseSQL необходимовызывать при динамическом формировании SQL-запроса! (хотя, не спорю, иногда и без этого проканывает)
sniknik (2004-08-03 12:48:00) [10]сделай так (не меняя!!!)
try
ADOCommand1.CommandType:= cmdText;
ADOCommand1.ParamCheck:= true;
ADOCommand1.CommandText:= 'UPDATE cards '+
'SET numProd = :myNum '+
'WHERE (id between :numFisrt and :numLast)';
ADOCommand1.Parameters.ParamByName('myNum').Value:= myNum;
ADOCommand1.Parameters.ParamByName('numFirst').Value:= numBegin;
ADOCommand1.Parameters.ParamByName('numLast').Value:= numEnd;
ADOCommand1.Execute;
except
on E:Exception do ShowMessage(E.Message);
end;
так находит?
> Возможно, но, согласись, очень чуднО...
сам тащусь и не пользуюсь, лишняя "интелектуальность" только дополнительная дырка для глюков.
Johnmen (2004-08-03 12:39:00) [11]>Andy
В целом в [0] ошибок нет.
СтОит написать попроще
Text:='UPDATE cards SET numProd = :myNum WHERE id between :numFisrt and :numLast';
Какая СУБД, кстати ? И употребляется ли где-то ешё ADOSQL ?
>sniknik © (03.08.04 11:39) [11]
Возможно, но, согласись, очень чуднО...
KSergey (2004-08-03 12:28:00) [12]> [13] Andy (03.08.04 12:03)
Я не пойму что еще? Все написано в [6] KSergey © (03.08.04 07:48) и в справке по Parameters.ParseSQL
Andy (2004-08-03 12:03:00) [13]2 KSergey
HELP:
ADOQuery1.Parameters.ParseSQL(ADOQuery1.Text, True);,
а не
ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQl.Text, True)
Или же я что-то недопонял?
2 sniknik
И без конструкции with, все тоже самое, как только доходит до "назначения значения" первому параметру, сразу же выдает ошибку, что этого параметра не находит.
KSergey (2004-08-03 11:48:00) [14]Мне не понравилось вот это:
> Parameters.ParseSQL( Text, True);
Мы уже за пределами with SQL do begin, а значит text берется не из SQL!!!
sniknik (2004-08-03 11:39:00) [15]> Странно видеть присваивание численному полю символьного значения...
> И странно утверждение, что ЭТО работает :)
вполне возможно, что и работает. неуказана база, возможно это access, у него есть приведение типов
к примеру UPDATE Table1 SET IntField='1' вполне рабочая конструкция, ошибка будет только если приведение не состоялось.
лучше бы этого не было (имхо), и уж конечно на это закладыватся не стоит.
Andy (03.08.04 11:21) [10]
убери with из кода, на 90% уверен заработает.
Andy (2004-08-03 11:21:00) [16]2 KSergey, BoxTer
Попробовал убрать ; - не помогло. Добавил
ADOQuery.Paramaters.ParseSQL(ADOQuery.Text, True):
with ADOSQL do
begin
with SQL do begin
Clear;
Add('UPDATE cards');
Add('SET numProd = :myNum ');
Add('WHERE (id between :numFisrt and :numLast); ');
end;
Parameters.ParseSQL(Text, True);
Parameters.ParamByName('myNum').Value := myNum;
Parameters.ParamByName('numFirst').Value := numBegin;
Parameters.ParamByName('numLast').Value := numEnd;
try
ExecSQL;
except
on E:Exception do ShowMessage(E.Message);
end;
end;
Тоже не помогло, зато как-только выполнение программы доходит до строчки
Parameters.ParamByName('myNum').Value := myNum;сразу переходит на строчку except и выдает сообщение, что параметр myNum не найден.
Johnmen (2004-08-03 10:58:00) [17]>наезжать на хорошие решения, использование quotedstr() здесь
>в самом деле лучше, чем вышеуказанная передача параметров
Странно видеть присваивание численному полю символьного значения...
И странно утверждение, что ЭТО работает :)
сергей1 (2004-08-03 10:32:00) [18]>И без конусов...тьфу, бонусов, этого не может быть...:)
>Только если спроектирована криво
спроектирована нормально, более сложные запросы, правда, организованы не так, а через ХП, которые клиенту возвращают код
завершения, а клиент уже действует по ситуации. И не надо
наезжать на хорошие решения, использование quotedstr() здесь
в самом деле лучше, чем вышеуказанная передача параметров
Johnmen (2004-08-03 09:12:00) [19]>сергей1 (02.08.04 20:26) [4]
>У меня вся база построена на таких запросах и все отлично работает
И без конусов...тьфу, бонусов, этого не может быть...:)
Только если спроектирована криво.
KSergey (2004-08-03 07:48:00) [20]> Andy (02.08.04 16:57)
> но данные в поле
> num Seller
Так я и не нашел ничего подобного в запросе...
Из общих рассуждений: если динамически формируемый запрос содержит параметры - необходимо после формирования запроса до присвоения значения параметрам выполнить
ADOSQL.Parameters.ParseSQL(ADOSQL.SQL.Text, True);