Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-70625
Mike_2002
2002-07-01 10:49
2002.07.22
ExpressQuantumGrid


3-70590
dimanew
2002-06-27 09:24
2002.07.22
Подскажите как в IB создать генератор, котоый при добавлении


1-70717
Yuri Btr
2002-07-11 12:44
2002.07.22
Размер переменных в памяти


1-70780
DanilaBagrov
2002-07-09 02:36
2002.07.22
QuickRep


3-70620
ioRaptor
2002-07-01 12:28
2002.07.22
Как создать таблицу в отделном файле (InterBase)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский