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

Вниз

ADOCommand.Parameters   Найти похожие ветки 

 
Eduard ©   (2002-07-01 10:36) [0]

Здравствуйте, мастера !!! Запарился я уже с сабжем. Недавно задавал такой вопрос, после пары невразумительных ответов его удалили. Но проблема осталась, и я надеюсь, сегодня найдется кто-нибудь, кто может прояснить ситуацию.

Короче, дело такое. Есть компонент TADOCommand, у него 21 параметр типа string. Следующая процедура выводит окно Inputquery, полученное значение присваивает параметру, потом забивает его в базу. Проблема в том, что эта процедура выполняется ТОЛЬКО ОДИН РАЗ !!! При следующей попытке вываливается List Index out of bounds, независимо от значения Treeview.Selected.AbsoluteIndex. Вот такие дела....

case Form1.TreeView1.Selected.AbsoluteIndex of
5..16:
begin
if not InputQuery("....", "......", InValue) then Exit;

begin
Datamodule1.ADOCommand1.Parameters[Form1.TreeView1.Selected.AbsoluteIndex].Value := InValue;
Datamodule1.ADOCommand1.CommandText := QueryArray[Form1.TreeView1.Selected.AbsoluteIndex+30];

if not DataModule1.ADOConnection1.InTransaction then
DataModule1.ADOConnection1.BeginTrans;
Datamodule1.ADOCommand1.Execute();
DataModule1.ADOConnection1.CommitTrans;
DataModule1.ADODataSet1.Requery();
end; // if not input query
end; // inserting

........

end; //case

QueryArray - массив строк с запросами, типа QueryArray[20]="SELECT *......"


 
Shaman_Naydak ©   (2002-07-01 11:02) [1]

переставь присваивание параметра с присваиванием запроса местами, и пребудет с тобой счастье
Datamodule1.ADOCommand1.CommandText := QueryArray[Form1.TreeView1.Selected.AbsoluteIndex+30];
Datamodule1.ADOCommand1.Parameters[Form1.TreeView1.Selected.AbsoluteIndex].Value := InValue;


 
Eduard ©   (2002-07-01 11:23) [2]

В этом случае процедура вываливается с той же ошибкой при первом же выполнении !!!!


 
Shaman_Naydak ©   (2002-07-01 15:33) [3]

Копай дальше..
А тебе не кажется, что у тебя очень странный текст..
Parameters присваивают тогда, когда используюь параметризованный запрос..
у тебя почему 1-ый раз выполняется.. потому что, для текста запроса, загнанного в query еще design"e есть такой по счету параметр, правда ты его ни черта не используешь, переприсваивая текст запроса..
Я предложил тебе поменять местами эти для исправления так-сказать ошибки набора.. но это не влияет ошибки алгоритма,
ибо у тебя судя по всему, присваиваемый запрос вообще не имеет параметров, а ты пытаешься присвоить.. причем почему-то не все, а именно один, который странным образом коррелирует с запросом.. бред какой-то, честно говоря..
Сядь и пройдись по шагам в отладчике.. что тут сложного?


 
Eduard ©   (2002-07-01 15:45) [4]

Сейчас объясню. Массив QueryArray содержит строки с запросами типа :
QueryArray[12] := "INSERT INTO Processors (Processor) VALUES (:Processor)"
Соответственно, параметр в ADOCommand под нумером 12 имеет имя Processor.

Проблему эту я решил извратным способом. Дело в том, что по номерам параметры не находятся, а по именам - без проблем. Я придумал еще один массив (ParamArray), в котором храню имена параметров, потом вместо строки

Datamodule1.ADOCommand1.Parameters[Form1.TreeView1.Selected.AbsoluteIndex].Value := InValue;

пишу

Datamodule1.ADOCommand1.Parameters.ParamByName(ParamArray[Form1.TreeView1.Selected.AbsoluteIndex]).Value := InValue;

... и все у меня получается. Но это же изврат !!!


 
Shaman_Naydak ©   (2002-07-01 19:16) [5]

ДА НИ ЧЕРТА ПОДОБНОГО!!
Если в массиве запросов у тебя лежат запросы, все имеющие один параметр, то все желается элеметарно:
Datamodule1.ADOCommand1.CommandText := QueryArray[Form1.TreeView1.Selected.AbsoluteIndex+30];
Datamodule1.ADOCommand1.Parameters[ 0].Value := InValue;

Плевать хотел ADOCommand на твой массив запросов.. в параметрах лежат параметры конкретно загруженного в CommandText запроса, и ничего больше...
Извини за экспансивность :)



 
T'Mon ©   (2002-07-01 19:29) [6]

Причем, даже если у тебя два параметра с одним именем:
INSERT INTO Processors (Processor, Processor2) VALUES (:Processor, :Processor)
то тебе придется написать:
Datamodule1.ADOCommand1.Parameters[0].Value := InValue;
Datamodule1.ADOCommand1.Parameters[1].Value := InValue
;
Так что имена параметров мало облегчают жизнь, все равно ADOCommand их берет просто в том порядке, как они заданы в списке
ADOCommand1.Parameters



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

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

Наверх




Память: 0.48 MB
Время: 0.016 c
14-70921
mifi
2002-06-25 00:42
2002.07.22
Скрипт


1-70827
Andrew_k
2002-07-02 11:09
2002.07.22
трабл с ParamStr!!! Хелп, плз!!!


14-70859
Goblinus
2002-06-23 23:42
2002.07.22
Описание формата RTF


3-70653
Roughneck
2002-06-20 11:00
2002.07.22
Компонент - запрос в фоновом режиме


1-70708
artko
2002-07-08 14:47
2002.07.22
как создать форму, имея только имя ее класса(string)?