![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не "догоню" поведение ADOCommand/ADOQuery [D7, MS Access]
Виталий Панасенко © (2005-12-19 12:06:00)Вопрос такого характера: есть запрос вида
update saldo
set count=count+:cnt
where key_field1=:key1 and key_field2=:key2
Использую как в ADOCommand так и в ADOQuery... На форме необходимое количество TEdit для заполнения параметров...
Выполняю ADOCommand.Execute() - не обновляет при первом старте.. Последующие вызовы работает как надо...
С Query вроди разобрался - установил Prepared=True начало обновлять... До этого обновление происходило только ПРИ ПЕРВОМ вызове... И это все притом, что данные в TEdit никто не менял !!! Я чего-то не догоняю... Что я мог(могу) такого противоестественного делать ?
Ost (2005-12-20 11:43:00) [1]У меня был такой прикол, с параметрами типа ДАТА, ВРЕМЯ.
Пока не поставил
вместо ParamByName().Value:= ....
ParamByName().asString:= ....
sniknik (2005-12-20 11:25:00) [2]Ost (20.12.05 11:21) [22]
> Close попробуй поставить до присвоения параметров.
предлагалось > [11], вроде не помогло.
Ost (2005-12-20 11:21:00) [3]................................................
> StrToInt(Flag.Text);
> {ParamByName('Produkt_kolvo').Value :=
> StrToFloat(Kolvo.Text);}
>
> {Close;
> Open;}
> Requery;
Close попробуй поставить до присвоения параметров.
sniknik (2005-12-20 10:49:00) [4]и делай имя парамерта покороче, только 10 символов можно (это про прогу, там ограничение)
sniknik (2005-12-20 10:44:00) [5]> Повторюсь - прикол только на машинах из одной поставки..
я тебе прогу высылал, ей пробовал? там также. на этой поставке? (параметры по правой кнопке на редакторе запроса задаются)
Виталий Панасенко (2005-12-20 10:09:00) [6]
> msguns © (20.12.05 10:00) [18]
> Присваивай строками:
>
> ParamByName('Owner_Code').Value := Own.Text;
Пробовал - отрабатывает первый раз.. Полседующие разы - фиг.. Повторюсь - прикол только на машинах из одной поставки.. Может, точно система кривоватисто поставлена, а е.. сексом занимаюсь ?
msguns (2005-12-20 10:00:00) [7]Присваивай строками:
ParamByName('Owner_Code').Value := Own.Text;
Виталий Панасенко (2005-12-20 09:40:00) [8]Вроди выяснил.. Слетает тип параметров, установленный в des-time... Какого ? Добовали ParamByName().DataType перед присвоением значения параметру - заработало...
Виталий Панасенко (2005-12-20 09:32:00) [9]Да, если вместо параметров использовать значения, то все отрабатывает без проблем... Ё, что такого может быть, ума не приложу !.. Я ведь как, положил ADOConnection, настроил строку подключения, положил ADOCommand, прописАл текст запроса, настроил типы параметров.. Т.е. ничего сверхъестественного не делал...У меня такое подозрение, что система криво поставлена... OEM версия...
Виталий Панасенко (2005-12-19 18:31:00) [10]Да, так... А вот если установить Prepared в True все работает... Так, зтрахался.. Завтра пересмотрю...:-)
sniknik (2005-12-19 18:14:00) [11]> ФИЗИЧЕСКИ не происходит изменение значениея поля...
т.е.
вот этот запрос не отрабатывает в первый раз?
update saldo
set produkt_kolvo=produkt_kolvo+:produkt_kolvo
where
owner_code=:owner_code and
produkt_code=:produkt_code and
postavshik_code=:postavshik_code and
produkt_cenap=:produkt_cenap and
produkt_cenar=:produkt_cenar and
produkt_box=:produkt_box and
flag=:flag
а если без параметров? т.к. именно с ними у тебя похоже путаница.
кстати еще одна "тонкость" ;)
попробуй последний задать так flag=(:flag) (с последним почемуто бывают проблемы...) или написать
...
flag=:flag and true
(чтобы перестал быть последним)
Виталий Панасенко (2005-12-19 18:02:00) [12]Я понял, что ты меня не понял :-)) Данные ДЕЙСТВИТЕЛЬНО НЕ МЕНЯЮТСЯ .. Т.е не неправильно отображаются, а ФИЗИЧЕСКИ не происходит изменение значениея поля...
Виталий Панасенко (2005-12-19 17:49:00) [13]Я сейчас на JET SP 8 поставлю.. просто это уже "под боком".. не на JET я не гоню :-))) Просто АДО дает кучу возможнойтсей и из-за этого, все-таки, сложновата технология для быстрого освоения, особенно, методом тыка...:-))...При чем в помощи обычно написано(для всяких тонокостей) "обращайтесь в Мелкий софт"..
Я прогу одну и ту же ведь проверял на ХР/2000/98, Prepared 100% не "взведен".. На 98/2000 измменения проходят успешно, на ХР - только первый раз...Трассировал, значения у параметров не теряются...Фиг его знает...
sniknik (2005-12-19 17:31:00) [14]> DataSet переоткрываю...
а не пробовал
Close;
параметры тут задать?
Open;
и, прежде чем на ADO/Jet "гнать", проверь другой прогой... (могу даже прислать тестовую. препаред там точно не делается. позволяется только 10 параметров, тебе хватит. пара запросов апдейт/селект на той машине где твое глючит и будет ясно "кто виноват". не исключено, что jet, но ...)
Виталий Панасенко (2005-12-19 17:20:00) [15]
> > получаю такую херню...
> пока никакой херни не вижу
Имелось ввиду первоначальное сообщение - не происходит изменение значения поля при одних и тех же значениях параметров...
Виталий Панасенко (2005-12-19 17:10:00) [16]Connection использую.Одно на все компонеты... DataSet переоткрываю...
with Tbl,Parameters
do
begin
ParamByName('Owner_Code').Value :=
StrToInt(Own.Text);
ParamByName('Produkt_Code').Value :=
StrToInt(Prd.Text);
ParamByName('Postavshik_Code').Value :=
StrToInt(Pst.Text);
ParamByName('Produkt_CenaP').Value :=
StrToFloat(CenaP.Text);
ParamByName('Produkt_CenaR').Value :=
StrToFloat(CenaR.Text);
ParamByName('Produkt_Box').Value :=
StrToFloat(ProduktBox.Text);
ParamByName('Flag').Value :=
StrToInt(Flag.Text);
{ParamByName('Produkt_kolvo').Value :=
StrToFloat(Kolvo.Text);}
{Close;
Open;}
Requery;
end;
Я смотрю собственно из Access и своего проектика... Да, и на 98 винь пашет.. Prepared в design-time установлен...
Строка подключения: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db2.mdb;Persist Security Info=False
Windows XP Professional
версия 2002
SP 2
sniknik (2005-12-19 16:59:00) [17]> Я не спорю... Пытаюсь разобраться.. Вот текст запроса:
??? а где ADODataSet ?
> Интересно, а у меня даже в ADODataSet выборка ПЕРВЫЙ РАЗ происходит
именно с ним "проблема необновления" или нет?
и где Prepared?
в любом случае, если обновление идет другой комендой(как видно приведенного) не в ADODataSet-е то его надо переоткрыть. именения сделаны в базе, в рекордсет они просто так не попадут.
off:
и потом судя по стилю кода ([6]), не скажу точно, но почемуто такое чуство, что ADOConnection ты не используеш. это так?
> получаю такую херню...
пока никакой херни не вижу
> JET не тот ?
а даже и так, что не надо чтобы работало под более новыми версиями? (в XP новее, если в 2000 не обовлялось).
Виталий Панасенко (2005-12-19 16:55:00) [18]Тут еще одна вещь обнаружилась - все отлично работает под 2000.. А у меня на ХР СП 2 (и на другой такой же машине) получаю такую херню... JET не тот ?
Виталий Панасенко (2005-12-19 15:37:00) [19]Я не спорю... Пытаюсь разобраться.. Вот текст запроса:
update saldo
set produkt_kolvo=produkt_kolvo+:produkt_kolvo
where owner_code=:owner_code and produkt_code=:produkt_code and
postavshik_code=:postavshik_code and produkt_cenap=:produkt_cenap
and produkt_cenar=:produkt_cenar and produkt_box=:produkt_box and
flag=:flag
Эо код вызова:
procedure TForm1.Button1Click(Sender: TObject);
var
I : Integer;
begin
cmd.Execute(I, VarArrayOf([StrToFloat(Kolvo.Text), StrToInt(Own.Text), StrToInt(Prd.Text),StrToInt(Pst.Text),
StrToFloat(CenaP.Text), StrToFloat(CenaR.Text), StrToFloat(ProduktBox.Text), StrToInt(Flag.Text)]));
Label1.Caption := IntToStr(I);
{with Cmd,Parameters
do
begin
ParamByName('Owner_Code').Value :=
StrToInt(Own.Text);
ParamByName('Produkt_Code').Value :=
StrToInt(Prd.Text);
ParamByName('Postavshik_Code').Value :=
StrToInt(Pst.Text);
ParamByName('Produkt_CenaP').Value :=
StrToFloat(CenaP.Text);
ParamByName('Produkt_CenaR').Value :=
StrToFloat(CenaR.Text);
ParamByName('Produkt_Box').Value :=
StrToFloat(ProduktBox.Text);
ParamByName('Flag').Value :=
StrToInt(Flag.Text);
ParamByName('Produkt_kolvo').Value :=
StrToFloat(Kolvo.Text);
Execute;
//Label1.Caption := IntToStr(RowsAffected);
end;}
end;
sniknik (2005-12-19 13:28:00) [20]> установил Prepared - теперь не глючит...
Prepared указывает обрабатывать или нет команду перед выполнением... но никак не пропускать вызовы после первого раза...
здается этой командой ты просто замаскировал глюки в проге, по работе с параметрами. (новые пересоздаются)
> теперь не глючит...
два взаимоуничтожающихся глюка (/замаскированные), это всетаки глюки. и то, что счас не глючит завтра будет, если код измениш хоть чуть.