Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

запрос с параметрами вымахивается   Найти похожие ветки 

 
Malamba   (2005-09-26 18:28) [0]

Есть простенький запрос с параметрами, но он выполняется в цикле:

With ADOQuery do begin // здесь просто проход по датасету
...
...
While Not EOf do begin

 With ADOQuery1 do begin // тут в цикле выполняется второй запрос на добавление записи
       Parameters.ParamValues["myParam1"]:= 1;
       Parameters.ParamValues["myParam2"]:= "1";
       ExecSQL;
 end;
Next;
end;
end;

При первом проходе ADOQuery1 выполняется, добавляет запись,
при втором выдает ошибку, что параметры не определены или имеют неверный формат.
Никто не сталкивался с подобным?


 
msguns ©   (2005-09-26 19:42) [1]

А точный код ?


 
sniknik ©   (2005-09-26 20:27) [2]

все дело в волшебных пузырьках... вот именно в этих "..." "...". ;)

а еще видимо в отсутствии clear и/или присутствии лишнего кода, и т.д. все изза недостатка знаний по предмету. а так вполне возможно что вся "задача" в один запрос может уложится.


 
malamba   (2005-09-27 11:13) [3]

Сейчас, сейчас...
Преамбула:

есть запрос, который вызывает, условно список компонентов компьютера,
прохожу по каждой записи полученного набора и на следующем шаге
добавляю в другую таблицу по новой записи, которая добавляет конкретный элемент выбранного типа.

Это выглядит так

  With DataModule1.qrySelectTyp do begin
// в этом запросе простенький SELECT * FROM ... WHERE ... = true
   Active:=false;
   Active:=true;
   First;
   While Not EOf do begin
     iMax:= SelectMax(fKeyMesto, tblMesto);
// здесь процедура  - поиск макисмального номера в поле ключа, в принципе, это можно и не делать, это в расчете на базы, которые не поддерживают автоувеличение счетчика
     Inc(iMax);

     sStr:= VarToStr(FieldValues[fNameTyp]); // получаю из qrySelectTyp наименование типа
     iKey:= FieldValues[fKeyModel]; // и значение его ключевого поля

     With DataModule1.qryAddMesto do begin  
    // а в этом запросе заношу новую запись в другую таблицу
       Parameters.ParamValues["pKeyMesto"]:= iMax;
       Parameters.ParamValues["pTypId"]:= iKey;
       ...
      ExecSql;
       ... // тут заношу добавленный элемент в Treeview
      Next;
и дальше идут end-ы;

При первом проходе кнструкция срабатывает, при втором выдает на ExecSql ошибку. Думал, не срабатывает With DataModule1.qryAddMesto и обращается к первому датасету qrySelectTyp.
Ставил принудительно
DataModule1.qryAddMesto.Parameters.ParamValues["pKeyMesto"]:= iMax;
...

Но все тоже самое. Явно в чем-то лажанулся, но затупил и никак не могу взглянуть свежим взглядом.

Да, знаю, что эта конструкция так и просится в хранимую процедуру, но база-то на Accesse, все в программе, все в локальном коде.


 
-=S..S=-   (2005-09-27 11:20) [4]

Параметры SUXX.
Я лично в Адо использовал adocommand да и к adoquery тоже относиться

query = "SELECT * FROM table_name WHERE ID=?" AND user_id=?;
adocommand.commandtext :=  query;
adocommand.exec(vararrayof([ID,user_id]));

ну и скока параметров надо стоко и передавайте ... токо главное в той последовательности что указана в запросе и всё :)
enjoy


 
Malamba   (2005-09-27 11:25) [5]

Больше возни: у меня уже готовый запрос с параметрами лежит в DataModule.

Но главное, что он первый раз проходит. А во второй вроде как не обновляет или сбрасывает коллекцию параметров. Попробую Refresh.


 
Os ©   (2005-09-27 11:40) [6]


> With DataModule1.qryAddMesto do begin  
>     // а в этом запросе заношу новую запись в другую таблицу
>        Parameters.ParamValues["pKeyMesto"]:= iMax;
>        Parameters.ParamValues["pTypId"]:= iKey;
>        ...
>       ExecSql;
>        ... // тут заношу добавленный элемент в Treeview
>       Next;

А что делает Next в этом месте.
Если я правильно понял должен быть DataModule1.qrySelectTyp.Next


 
Malamba   (2005-09-27 12:06) [7]

Да, он, может я неправильно расставил end в посте.

В коде все правильно.
Но я нашел!

Причем это приниципальный вопрос - выполнение запроса в цикле.

Странно, что Refresh не идет, хотя самое логичное, просто обновить значения параметров.
Зато пошло с Parameters.ParseSQL(SQL.Text, true);
Никак не переведу parse, но смысл, что он работает вроде обновителя параметров, перечитывая SQL.Text заново и заполняя параметры по-новому.
И цикл заработал.


 
sniknik ©   (2005-09-27 12:13) [8]

> Зато пошло с Parameters.ParseSQL(SQL.Text, true);
в цикле это совершенно излишнее действие.

вообще смотрю, чем дальше тем больше "наворачивается" лишнего кода. ;)


 
malamba   (2005-09-27 12:16) [9]

Но почему тогда пошло с этой строкой?
И почему лишнего?


 
sniknik ©   (2005-09-27 12:27) [10]

> Но почему тогда пошло с этой строкой?
вместо устранения ошибки ты пересоздаеш параметры. результат в итоге тот же ("исправные" параметры), нагрузка/врямя  выполнения цикла больше.

> И почему лишнего?
сорее всего все можно сделать единственным запросом... (сужу по описаию и своим домыслам о задаче, реальной не приведено). исходя из этого, все что больше кода из вызова 1-го запроса (циклы и т.д.) лишнее.


 
ANB ©   (2005-09-27 12:54) [11]


>    While Not EOf do begin
>      iMax:= SelectMax(fKeyMesto, tblMesto);
- получение максимального ID можно вынести из цикла (если БД не сетевая, а если сетевая, то один ф.. будут проблемы).
А вообще, если база однородная, (да частенько и с неоднородной можно), хватит простого insert into ... select from ...


 
malamba   (2005-09-27 13:40) [12]

Сейчас, сейчас...
Здравые идеи мне подкидываете.
Я-то в спешке набросал по ходу мысли: получить набор-найти то-то-вставить в другой.
...

А таблицы такие:

список типов элементов компьютера (CPU, HDD, RAM, мать, проч., периферия, внешнее оборудование)
в Проге есть пункт "добавить стандартный компьютер".
ПО нему я выбираю из первой таблицы все нужные мне элементы ( у них есть в одном поле true) и вставляю в таблицу кокретных элементов новую запись, например (условно): CPU, "тип не определен", "модель не определена", ...

В любом случае мне нужен перебор по первому запросу.
А вот как это реализовать в SQL 92 никак не соображу.

Тем более, что я добавляю свои значения, которых нет в первой таблице. Из нее мне нужны только названия типов.

Равзе что INSERT INTO ... SELECT "тип не определен" AS A,  "модель не определена" AS B, ...



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

Форум: "Базы";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.07 c
2-1128595845
norwikh
2005-10-06 14:50
2005.11.06
В Win98 проекты ведут себя весьма странно


3-1127742065
Dexter
2005-09-26 17:41
2005.11.06
Insert Into не пашет более 1 раза подряд


3-1127813135
Wolferio
2005-09-27 13:25
2005.11.06
Удаление всех записей в базе.


3-1127815585
Андрей Жук
2005-09-27 14:06
2005.11.06
Шифрование данных в блобе


14-1129555268
oldman
2005-10-17 17:21
2005.11.06
Нужен "сквозной почтовый сервер" :(





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