Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

Update в ADO   Найти похожие ветки 

 
Andy   (2004-08-02 16:57) [0]

Подскажите, плиз, что не так делаю при передаче параметров?

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 не заносятся? Хотя если простой запрос без параметров, то отлично выполнятеся.


 
Johnmen ©   (2004-08-02 17:15) [1]

>... но данные в поле num Seller не заносятся?

Это вопрос ? Тогда - да. Т.к. такого поля нет...:)


 
Andy   (2004-08-02 17:18) [2]

>> ... но данные в поле num Seller не заносятся?
Сори, в numProd естественно...


 
Johnmen ©   (2004-08-02 17:55) [3]

Значит ни одна запись не удовлетворяет условию...


 
сергей1   (2004-08-02 20:26) [4]

а на кой вообще делать так ? Запускай вот это :

procedure TForm1.Button2Click(Sender: TObject);
var mynum, numfirst, numlast:string;
begin
mynum:="10";
numfirst:="20";
numlast:="30";
form1.ADOQuery1.SQL.Text:="update  "Cards" set numProd = "
+quotedstr(mynum)+" where id between "+quotedstr(numfirst)
+" and " +quotedstr(numlast);
try
form1.ADOQuery1.ExecSQL;
except on E:exception do
begin
 if strpos(pchar(E.Message),"PRIMARY")<>nil then
  begin
   showmessage("Нарушение первичного ключа !");
  end
end;
end;
end;

в качестве бонуса показана обработка ошибки (первичного ключа, если конечно numProd им является, так же можно обработать любую ошибку), зачем выводить
в showmessage E.message, там все на английском и юзеры начинают нервничать.
У меня вся база построена на таких запросах и все отлично работает, а эта передача параметров, как у тебя, только путает код.


 
BoxTer   (2004-08-03 06:28) [5]

а вот здеся точка_с_запятой не лишняя?
Add("WHERE (id between :numFisrt and :numLast); ");


 
KSergey ©   (2004-08-03 07:48) [6]

> Andy   (02.08.04 16:57)
> но данные в поле
> num Seller

Так я и не нашел ничего подобного в запросе...
Из общих рассуждений: если динамически формируемый запрос содержит параметры - необходимо после формирования запроса до присвоения значения параметрам выполнить

ADOSQL.Parameters.ParseSQL(ADOSQL.SQL.Text, True);


 
Johnmen ©   (2004-08-03 09:12) [7]

>сергей1   (02.08.04 20:26) [4]
>У меня вся база построена на таких запросах и все отлично работает

И без конусов...тьфу, бонусов, этого не может быть...:)
Только если спроектирована криво.


 
сергей1   (2004-08-03 10:32) [8]

>И без конусов...тьфу, бонусов, этого не может быть...:)
>Только если спроектирована криво

спроектирована нормально, более сложные запросы, правда, организованы не так, а через ХП, которые клиенту возвращают код
завершения, а клиент уже действует по ситуации. И не надо
наезжать на хорошие решения, использование quotedstr() здесь
в самом деле лучше, чем вышеуказанная передача параметров


 
Johnmen ©   (2004-08-03 10:58) [9]

>наезжать на хорошие решения, использование quotedstr() здесь
>в самом деле лучше, чем вышеуказанная передача параметров

Странно видеть присваивание численному полю символьного значения...
И странно утверждение, что ЭТО работает :)


 
Andy   (2004-08-03 11:21) [10]

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 не найден.


 
sniknik ©   (2004-08-03 11:39) [11]

> Странно видеть присваивание численному полю символьного значения...
> И странно утверждение, что ЭТО работает :)
вполне возможно, что и работает. неуказана база, возможно это access, у него есть приведение типов
к примеру UPDATE Table1 SET IntField="1" вполне рабочая конструкция, ошибка будет только если приведение не состоялось.

лучше бы этого не было (имхо), и уж конечно на это закладыватся не стоит.

Andy   (03.08.04 11:21) [10]
убери with из кода, на 90% уверен заработает.


 
KSergey ©   (2004-08-03 11:48) [12]

Мне не понравилось вот это:

> Parameters.ParseSQL(Text, True);

Мы уже за пределами with SQL do begin, а значит text берется не из SQL!!!


 
Andy   (2004-08-03 12:03) [13]

2 KSergey
HELP:
ADOQuery1.Parameters.ParseSQL(ADOQuery1.Text, True);,
а не
ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQl.Text, True)

Или же я что-то недопонял?

2 sniknik

И без конструкции with, все тоже самое, как только доходит до "назначения значения" первому параметру, сразу же выдает ошибку, что этого параметра не находит.


 
KSergey ©   (2004-08-03 12:28) [14]

>  [13] Andy   (03.08.04 12:03)

Я не пойму что еще? Все написано в [6] KSergey ©   (03.08.04 07:48) и в справке по Parameters.ParseSQL


 
Johnmen ©   (2004-08-03 12:39) [15]

>Andy

В целом в [0] ошибок нет.
СтОит написать попроще
Text:="UPDATE cards SET numProd = :myNum WHERE id between :numFisrt and :numLast";
Какая СУБД, кстати ? И употребляется ли где-то ешё ADOSQL ?

>sniknik ©   (03.08.04 11:39) [11]

Возможно, но, согласись, очень чуднО...


 
sniknik ©   (2004-08-03 12:48) [16]

сделай так (не меняя!!!)
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;

так находит?

> Возможно, но, согласись, очень чуднО...
сам тащусь и не пользуюсь, лишняя "интелектуальность" только дополнительная дырка для глюков.


 
KSergey ©   (2004-08-03 12:58) [17]

Люди, чего спорите?? ParseSQL необходимо вызывать при динамическом формировании SQL-запроса! (хотя, не спорю, иногда и без этого проканывает)


 
Andy   (2004-08-03 12:59) [18]


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;

:(


 
Johnmen ©   (2004-08-03 13:04) [19]

>KSergey ©   (03.08.04 12:58) [17]
>Люди, чего спорите?? ParseSQL необходимо вызывать при
>динамическом формировании SQL-запроса! (хотя, не спорю, иногда
>и без этого проканывает
)

Никто не спорит.
Не находишь противоречия в выделенном ?

>Andy  

Скобки то расставь...


 
KSergey ©   (2004-08-03 13:14) [20]

> [19] Johnmen ©   (03.08.04 13:04)
> Не находишь противоречия в выделенном ?

Нет.
Правила - требуют.
Но и без этого работает, иногда :)
Почему - это уже другой вопрос.


 
Johnmen ©   (2004-08-03 13:19) [21]

>KSergey ©   (03.08.04 13:14) [20]

>Правила - требуют.

Где можно почитать ?

>Но и без этого работает, иногда :)

У некоторых - всегда...:)


 
Andy   (2004-08-03 13:33) [22]

Господа, прошу прощения, но поясните чайнику где скобки расставить?

Add("UPDATE cards");
Add("SET numProd = :myNum ");
Add("WHERE ((id between :numFisrt and :numLast) ");
Add("AND (id between :numFirts2 and numLast2)) ");


Тоже не работает :(


 
Sergey13 ©   (2004-08-03 13:35) [23]

and :numLast2


 
Johnmen ©   (2004-08-03 13:40) [24]

>Andy

Насчет скобок я не прав. Не заметил их...:)


 
Sergey13 ©   (2004-08-03 13:43) [25]

2 Andy   (03.08.04 13:33)
Вроде вообще без скобок можно. 8-)
Если диапазоны не пересекаются то вместо
Add("AND (id between :numFirts2 and numLast2)) ");
надо
Add("OR (id between :numFirts2 and numLast2)) ");
Иначе ни одной записи не получишь.



Страницы: 1 вся ветка

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.057 c
11-1079975222
DillerXX
2004-03-22 20:07
2004.08.29
Power


14-1092070430
MC
2004-08-09 20:53
2004.08.29
Помогите найти загадки?


4-1090178018
Петр
2004-07-18 23:13
2004.08.29
Hello world Используя ReadFile при отключенном девайсе от порта


3-1091681955
Марат
2004-08-05 08:59
2004.08.29
Счетчик DBGrid


3-1091719334
}|{yk
2004-08-05 19:22
2004.08.29
Как получить день недели в Oracle?