Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.033 c
14-1092056709
SaneK
2004-08-09 17:05
2004.08.29
ПОМОГИТЕ ПЛИЗ!!!


3-1091531793
Valer
2004-08-03 15:16
2004.08.29
Перевод строки (возврат каретки)


14-1092244273
Паскальные надписи
2004-08-11 21:11
2004.08.29
Есть тут кто с Физтеха?


1-1092307659
shc
2004-08-12 14:47
2004.08.29
Docking Panel


14-1091964279
Piter
2004-08-08 15:24
2004.08.29
Интересно :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский