![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADOCommand.Parameters [D6, MSSQL]
Eduard © (2002-07-01 10:36:00)Здравствуйте, мастера !!! Запарился я уже с сабжем. Недавно задавал такой вопрос, после пары невразумительных ответов его удалили. Но проблема осталась, и я надеюсь, сегодня найдется кто-нибудь, кто может прояснить ситуацию.
Короче, дело такое. Есть компонент 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 *......"
T'Mon (2002-07-01 19:29:00) [1]Причем, даже если у тебя два параметра с одним именем:
INSERT INTO Processors (Processor, Processor2) VALUES (:Processor, :Processor)
то тебе придется написать:
Datamodule1.ADOCommand1.Parameters[0].Value := InValue;;
Datamodule1.ADOCommand1.Parameters[1].Value := InValue
Так что имена параметров мало облегчают жизнь, все равно ADOCommand их берет просто в том порядке, как они заданы в списке
ADOCommand1.Parameters
Shaman_Naydak (2002-07-01 19:16:00) [2]ДА НИ ЧЕРТА ПОДОБНОГО!!
Если в массиве запросов у тебя лежат запросы, все имеющие один параметр, то все желается элеметарно:
Datamodule1.ADOCommand1.CommandText := QueryArray[Form1.TreeView1.Selected.AbsoluteIndex+30];
Datamodule1.ADOCommand1.Parameters[ 0].Value := InValue;
Плевать хотел ADOCommand на твой массив запросов.. в параметрах лежат параметры конкретно загруженного в CommandText запроса, и ничего больше...
Извини за экспансивность :)
Eduard (2002-07-01 15:45:00) [3]Сейчас объясню. Массив 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 15:33:00) [4]Копай дальше..
А тебе не кажется, что у тебя очень странный текст..
Parameters присваивают тогда, когда используюь параметризованный запрос..
у тебя почему 1-ый раз выполняется.. потому что, для текста запроса, загнанного в query еще design"e есть такой по счету параметр, правда ты его ни черта не используешь, переприсваивая текст запроса..
Я предложил тебе поменять местами эти для исправления так-сказать ошибки набора.. но это не влияет ошибки алгоритма,
ибо у тебя судя по всему, присваиваемый запрос вообще не имеет параметров, а ты пытаешься присвоить.. причем почему-то не все, а именно один, который странным образом коррелирует с запросом.. бред какой-то, честно говоря..
Сядь и пройдись по шагам в отладчике.. что тут сложного?
Eduard (2002-07-01 11:23:00) [5]В этом случае процедура вываливается с той же ошибкой при первом же выполнении !!!!
Shaman_Naydak (2002-07-01 11:02:00) [6]переставь присваивание параметра с присваиванием запроса местами, и пребудет с тобой счастье
Datamodule1.ADOCommand1.CommandText := QueryArray[Form1.TreeView1.Selected.AbsoluteIndex+30];
Datamodule1.ADOCommand1.Parameters[Form1.TreeView1.Selected.AbsoluteIndex].Value := InValue;