Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.037 c
3-1127427930
rosl
2005-09-23 02:25
2005.11.06
поиск в grideh


4-1125891164
LEXX_55
2005-09-05 07:32
2005.11.06
Как изменить кодировку в TXT


2-1129151326
Megabyte
2005-10-13 01:08
2005.11.06
SQL-инструкция для создания нового usera


2-1128957615
Gall
2005-10-10 19:20
2005.11.06
Получить список папок


3-1127894734
axx
2005-09-28 12:05
2005.11.06
FireBird SQL синтаксис