Главная страница
    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
1-70676
SkyQuake
2002-07-09 10:09
2002.07.22
Length(string(P)) - маразм?


3-70644
NNH
2002-07-01 19:19
2002.07.22
Как считать String из Memo до символа # ?


6-70855
ananimous
2002-05-13 15:20
2002.07.22
Сервер-клиент на сокетах


14-70911
copyr25
2002-06-26 04:52
2002.07.22
Так скучно ночью! Я же знаю, многие


1-70723
nitro313
2002-07-11 14:37
2002.07.22
Как присвоить к Caption строковое значение в одинарных кавычках?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский