Главная страница
    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.48 MB
Время: 0.055 c
9-1119467426
Germany
2005-06-22 23:10
2005.11.06
Отрожение в воде


3-1127469418
WG
2005-09-23 13:56
2005.11.06
Можно ли запретить DBGrid создавать запись ?


6-1122116863
PSV84
2005-07-23 15:07
2005.11.06
сеть RS485/RS232


14-1128680845
SPeller
2005-10-07 14:27
2005.11.06
Бас-подгон от государства


1-1129093521
Ветер в голове
2005-10-12 09:05
2005.11.06
Как заменить слово в Richedit





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