Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как отследить 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;


Вот это непонятно. Что за двойная инициализация?


Наверх

Титульная страница Поиск, карта сайта Написать письмо