Форум: "Базы";
Текущий архив: 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