Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Update в ADO


Страницы:   1 2

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);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо