Форум: "Базы";
Текущий архив: 2002.07.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c