![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как отследить sql запрос [D6, IB6.x]
cherman © (2005-10-28 12:10:00)Есть приложение которое работает с IB. в базе используется лревовилная таблица. нужно вывести все поля (ветви подветви) но не в TreeView. Ниже приведен код где parent - идентификатор родителя а prosm - строка которая содержит идентификаторы уже проспотренных(выведенных) ветвей, соответственно при выборке уже просмотренные исключаются (переменная prosm) , но при выполнение запроса (сам запрос проходит без ошибок ) параметр (sql запрос ... and where id_naprav not in (:prosm)) игнорируется тоесть ограничения ни как не работают . Может проблема в создании строки - параметра или кодиковки (в бд кодировка win1251). Помогите разабраться в этом plz.
parent:=0;
prosm:='0';
label1:
IBQuery1.SQL.Clear;
IbQuery1.SQL.Add('select * from napravlenie where id_parent=:parent and id_naprav not in (:prosm)' );
ibquery1.ParamByName('parent').AsInteger:=parent;
IBquery1.ParamByName('prosm').asstring:=',';
IBquery1.ParamByName('prosm').asstring:=prosm;
IBQuery1.Open;
IBQuery1.First;
while not IBQUERy1.Eof do
begin
Memo1.Lines.add(IBquery1.Fieldbyname ('name_naprav').AsString);
prosm:=prosm+','+ IBquery1.Fieldbyname('id_naprav').AsString;
Memo1.Lines.Add(prosm);
If IBQuery1.FieldByName('potomki_naprav').asinteger=1 then
begin
parent:=IBquery1.FieldByname('id_naprav').AsInteger;
IBQuery1.Close;
goto label1;
end
else
begin
IBquery1.Next;
end;
end;
parent:=IBquery1.FieldbyName('id_parent').asinteger;
IBQUeRY1.Close;
IBQuery1.SQL.Clear;
IbQuery1.SQL.Add('select * from napravlenie where id_naprav=:parent');
ibquery1.ParamByName('parent').AsInteger:=parent;
IBQuery1.Open;
parent:=IBQuery1.Fieldbyname('id_parent').asinteger;
IBquery1.Close;
prosm:='0,2,3';
goto label1;
Seg (2005-10-28 14:39:00) [1]Это называется "динамический" SQL. Поздравляю.
cherman (2005-10-28 14:15:00) [2]to Seg
Спасибо большое так и сделал и все заработало!!!
Seg (2005-10-28 13:46:00) [3]Тогда затолкай текст запроса сначала в переменную, потом добавь параметры, а потом уже в запрос.
Digitman (2005-10-28 13:16:00) [4]
> cherman © (28.10.05 12:33) [5]
см. TIBSQLMonitor
Desdechado (2005-10-28 13:03:00) [5]списки IN нельзя передавать параметром
msguns (2005-10-28 12:57:00) [6]>cherman © (28.10.05 12:49) [7]
>а мне надо..
Может все-таки глянешь [2] ?
А мне надо полсотни до завтра.
Детский сад какой-то..
cherman (2005-10-28 12:49:00) [7]to serg
при использовании Query1.SQL.TEXT;
Memo1.Lines.Add(IBQuery1.sql.Text);
выводит
select * from naprav where id_parent=:parent and id_naprav not in (:prosm);
а мне надо не :parent а их числовые значения для определения параметра prosm
Seg (2005-10-28 12:39:00) [8]sql запрос (его текст с параметрами уже в иде чисел или строк
Query1.SQL.Text
cherman (2005-10-28 12:33:00) [9]и еще есть ли в delphi возможность отследить sql запрос (его текст с параметрами уже в иде чисел или строк а не :param) который передается серверу для выполнения
cherman (2005-10-28 12:25:00) [10]to seg
древовидная структура. первый sql запрос для вывода потомка - углубление а второй для выхода на уровень выше.
> IBquery1.ParamByName('prosm').asstring:=',';
> IBquery1.ParamByName('prosm').asstring:=prosm;
но ведь параметр уже использованных записывется в prosm увеличивается с каждой просмотренной ветвью и соответственно строка параметра все время увеличивается
prosm:=prosm+','+ IBquery1.Fieldbyname('id_naprav').AsString;
и если использовать
IBquery1.ParamByName('prosm').asstring:=',';
IBquery1.ParamByName('prosm').asstring:=prosm;
то что записывать в prosm если прости идентификаторы то получится
... and where id_naprav not in (,3345676)
Seg (2005-10-28 12:20:00) [11]prosm:='0,2,3';
ботва еще может быть из-за кавычек, которые есть в символьной строке.
msguns (2005-10-28 12:17:00) [12]
ALTER PROCEDURE DRGOODS_GET_ALLCHILD (
GID INTEGER)
RETURNS (
PID INTEGER,
ID INTEGER,
FLAG CHAR(1),
NAME VARCHAR(1024))
AS
begin
/* Процедура извлечения из древовидного справочника всех
потомков указанного узла */
/* Внешний цикл по непосредственным потомкам */
FOR SELECT G.gdpid, G.gdid, G.gdgroup, G.gdname
FROM DRGOODS G
WHERE G.gdpid=:gid
INTO :pid, :id, :flag, :name
DO
BEGIN
suspend; /* Передача вы вых. НД */
/* Проверка на наличие потомков у полученного пряиого потомка */
IF (EXISTS(
SELECT GDID FROM drgoods
WHERE GDPID=:id))
THEN
BEGIN /* Запуск этой же процедуры рекурсивно */
FOR SELECT pid, id, flag, name
FROM DRGOODS_GET_ALLCHILD(:id)
INTO :pid, :id, :flag, :name
DO
BEGIN
suspend;
END
END
END
end
Seg (2005-10-28 12:16:00) [13]IBquery1.ParamByName('prosm').asstring:=',';
IBquery1.ParamByName('prosm').asstring:=prosm;
Вот это непонятно. Что за двойная инициализация?