![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запрос с параметрами вымахивается [D7, Access]
Malamba © (2005-09-26 18:28:00)Есть простенький запрос с параметрами, но он выполняется в цикле:
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 выполняется, добавляет запись,
при втором выдает ошибку, что параметры не определены или имеют неверный формат.
Никто не сталкивался с подобным?
malamba (2005-09-27 13:40:00) [1]Сейчас, сейчас...
Здравые идеи мне подкидываете.
Я-то в спешке набросал по ходу мысли: получить набор-найти то-то-вставить в другой.
...
А таблицы такие:
список типов элементов компьютера (CPU, HDD, RAM, мать, проч., периферия, внешнее оборудование)
в Проге есть пункт "добавить стандартный компьютер".
ПО нему я выбираю из первой таблицы все нужные мне элементы ( у них есть в одном поле true) и вставляю в таблицу кокретных элементов новую запись, например (условно): CPU, 'тип не определен', 'модель не определена', ...
В любом случае мне нужен перебор по первому запросу.
А вот как это реализовать в SQL 92 никак не соображу.
Тем более, что я добавляю свои значения, которых нет в первой таблице. Из нее мне нужны только названия типов.
Равзе что INSERT INTO ... SELECT 'тип не определен' AS A, 'модель не определена' AS B, ...
ANB (2005-09-27 12:54:00) [2]
> While Not EOf do begin
> iMax:= SelectMax(fKeyMesto, tblMesto);
- получение максимального ID можно вынести из цикла (если БД не сетевая, а если сетевая, то один ф.. будут проблемы).
А вообще, если база однородная, (да частенько и с неоднородной можно), хватит простого insert into ... select from ...
sniknik (2005-09-27 12:27:00) [3]> Но почему тогда пошло с этой строкой?
вместо устранения ошибки ты пересоздаеш параметры. результат в итоге тот же ("исправные" параметры), нагрузка/врямя выполнения цикла больше.
> И почему лишнего?
сорее всего все можно сделать единственным запросом... (сужу по описаию и своим домыслам о задаче, реальной не приведено). исходя из этого, все что больше кода из вызова 1-го запроса (циклы и т.д.) лишнее.
malamba (2005-09-27 12:16:00) [4]Но почему тогда пошло с этой строкой?
И почему лишнего?
sniknik (2005-09-27 12:13:00) [5]> Зато пошло с Parameters.ParseSQL(SQL.Text, true);
в цикле это совершенно излишнее действие.
вообще смотрю, чем дальше тем больше "наворачивается" лишнего кода. ;)
Malamba (2005-09-27 12:06:00) [6]Да, он, может я неправильно расставил end в посте.
В коде все правильно.
Но я нашел!
Причем это приниципальный вопрос - выполнение запроса в цикле.
Странно, что Refresh не идет, хотя самое логичное, просто обновить значения параметров.
Зато пошло с Parameters.ParseSQL(SQL.Text, true);
Никак не переведу parse, но смысл, что он работает вроде обновителя параметров, перечитывая SQL.Text заново и заполняя параметры по-новому.
И цикл заработал.
Os (2005-09-27 11:40:00) [7]
> With DataModule1.qryAddMesto do begin
> // а в этом запросе заношу новую запись в другую таблицу
> Parameters.ParamValues['pKeyMesto']:= iMax;
> Parameters.ParamValues['pTypId']:= iKey;
> ...
> ExecSql;
> ... // тут заношу добавленный элемент в Treeview
> Next;
А что делает Next в этом месте.
Если я правильно понял должен быть DataModule1.qrySelectTyp.Next
Malamba (2005-09-27 11:25:00) [8]Больше возни: у меня уже готовый запрос с параметрами лежит в DataModule.
Но главное, что он первый раз проходит. А во второй вроде как не обновляет или сбрасывает коллекцию параметров. Попробую Refresh.
-=S..S=- (2005-09-27 11:20:00) [9]Параметры 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:13:00) [10]Сейчас, сейчас...
Преамбула:
есть запрос, который вызывает, условно список компонентов компьютера,
прохожу по каждой записи полученного набора и на следующем шаге
добавляю в другую таблицу по новой записи, которая добавляет конкретный элемент выбранного типа.
Это выглядит так
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, все в программе, все в локальном коде.
sniknik (2005-09-26 20:27:00) [11]все дело в волшебных пузырьках... вот именно в этих "..." "...". ;)
а еще видимо в отсутствии clear и/или присутствии лишнего кода, и т.д. все изза недостатка знаний по предмету. а так вполне возможно что вся "задача" в один запрос может уложится.
msguns (2005-09-26 19:42:00) [12]А точный код ?