Текущий архив: 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.038 c