Параметры в запросах

отредактировано 09:08 Раздел: FastReport 3.0
Если в запросе написать один и более одинаковых параметров
в списке параметров они будут определятся как разные параметры.

например если текст запроса такой
select * from clients
where id= :par1
and fld1 <> :par1

открываем параметры и видим 2 записи
par1
что не есть правильно и не правильно работает.

Комментарии

  • SlasherXSlasherX Россия, Магнитогорск
    отредактировано 09:08
    Konst написал:
    Если в запросе написать один и более одинаковых параметров
    в списке параметров они будут определятся как разные параметры.

    например если текст запроса такой
    select * from clients
    where id= :par1
    and fld1 <> :par1

    открываем параметры и видим 2 записи
    par1
    что не есть правильно и не правильно работает.
    Судя по всему ты используешь дельфовые компоненты ADO... (в BDE такой проблемы не было)
    Сам сталкивался с подобной ситуацией.. Почему то ADO не может нормально работать, если параметр встречается более одного раза.

    Пути решения:
    1. назвать параметры разными именами
    2. формировать текст запроса динамически на этапе выполнения (Query.SQL.Text := '...')

    Если кто знает другие варианты, подскажите плиз ;)
  • отредактировано 09:08
    Нет это ФИБЫ

    в фибах такой проблемы не наблюдалось...
  • отредактировано 09:08
    написал:
    2. формировать текст запроса динамически на этапе выполнения (Query.SQL.Text := '...')
    убийство для SQL серверов, кеширующих запросы (Oracle например), только параметры.
  • SlasherXSlasherX Россия, Магнитогорск
    отредактировано 09:08
    Konst написал:
    Нет это ФИБЫ

    в фибах такой проблемы не наблюдалось...
    а по-русски сказать? что за ФИБЫ еще?
  • отредактировано 09:08
    и еще одно:
    написал:
    например если текст запроса такой
    select * from clients
    where id= :par1
    and fld1 <> :par1
    а не лучше ли
    select * from clients
    where id= :par1
    and fld1 <> id
    

    это, так в порядке бреда, а если серьезно, то для ODBC, например, параметры вообще без имен передаются, в твоем примере так:
    select * from clients
    where id= ?
    and fld1 <> ?
    
    т.е. вполне нормальная ситуация и ожидать другого поведения не приходится.
  • отредактировано 09:08
    Пример был просто на вскидку.

    Довольно много параметров таких

    AND( Code = :PCode or :PCode = 0)
  • отредактировано 09:08
    Konst написал:
    Пример был просто на вскидку.

    Довольно много параметров таких

    AND( Code = :PCode or :PCode = 0)
    Хи. Выбираем либо записи с заданным PCode <> 0 или все записи если он нулевой? А если записей миллион? ;) В любом случае такие случаи отдельно надо оформлять.
  • отредактировано 09:08
    не обязательно милион.....

    У всех своя специфика.


    Однако это не правильно что одноименные параметры распознаются как разные.

    DELPHI 7 + FIB
  • отредактировано 09:08
    Однако это неправильно, заявлять что это неправильно, потому что тебя это не удовлетворяет ;)
  • SlasherXSlasherX Россия, Магнитогорск
    отредактировано 09:08
    Stranger написал:
    Однако это неправильно, заявлять что это неправильно, потому что тебя это не удовлетворяет ;)
    это неправильно, потому что в одном месте работает так, а в другом по другому. Косяк Borland'а. Я что то сильно сомневаюсь, что тебе понравилось бы, если бы метод с одним названием у разных компонентов выполнял разные действия.
  • отредактировано 09:08
    написал:
    это неправильно, потому что в одном месте работает так, а в другом по другому. Косяк Borland'а. Я что то сильно сомневаюсь, что тебе понравилось бы, если бы метод с одним названием у разных компонентов выполнял разные действия.
    Как по мне, так возьми и напиши для себя малюсенькую програмку но не на борландовских накрывалках, а на API того, что ты используеш (ODBC, ADO, Native API). Сразу станет понятно что как и почему.
  • отредактировано 09:08
    SlasherX написал:
    это неправильно, потому что в одном месте работает так, а в другом по другому. Косяк Borland'а. Я что то сильно сомневаюсь, что тебе понравилось бы, если бы метод с одним названием у разных компонентов выполнял разные действия.
    А причем тут борланд? В каком месте у них параметры по разному работают?
    Ну так компоненты же разные. Если одинаковые по названию методы выполняют одинаковые действия то это одниковые компоненты ;)
    Двери тоже в разные стороны открываются, что ж теперь делать? ;)
  • отредактировано January 2005
    Как мне кажется все немного удалились от темы. Вопрос был про параметры в FR3. Подобная ситуация наблюдается и с DBX и с BDE. Как мне кажется надо смотреть всетаки в исходниках FR(возможно парсинг для поиска параметров), а не пенять на Dephi т.к. в среде это работает нормально.
    Ещё одна замеченая проблема если написать например
    [code]where :par1*100>200
    то в параметры упадёт :par1*100>200. Как заметил парсер считает что всё что идет после ":" до конца строки или пробела является параметром.
  • отредактировано 09:08
    Ну, это даже и не проблема, можно в скобки взять ;)
    А вот то, что он один и тот же параметр считает разными - бесит ;)
  • отредактировано January 2005
    Люди, ну при чем тут FR, если то же самое происходит и в среде Делфи? Напишите sql в обычном TQuery:
    select * from customer
    where CustNo >= :P1 and CustNo < :P1
    
    и посмотрите в редактор параметров...
  • отредактировано January 2005
    ;)
    Все пристыженно склонили головы и покаялись.

    To All: Будем жаловаться Борланду? ;)
  • отредактировано 09:08
    Прошу прощения ;) В своё оправдание могу только сказать, что давно не делал селектов с помощью query ;)
  • отредактировано January 2005
    Замечание ;)
    Все правильно, только в Делфе не ругается на одинаковые параметры и при определении одного определяет и другой.
    К примеру для подобного запроса:
    select *
    from Enrolls
    where Student_Id > :stud and Class_ID <:stud
    достаточно один раз написать:
    Query1.ParamByName('stud').Value:= par;
  • отредактировано 09:08
    Но и в дельфи при открытии параметра
    будет только одна запись параметра а не 2 как мы наблюдаем сейчас.

    в билде 9 так и осталось..
  • отредактировано 09:08
    To Konst
    написал:
    Но и в дельфи при открытии параметра
    будет только одна запись параметра а не 2 как мы наблюдаем сейчас

    Как выяснилось нет в дельфе также 2 параметра. Я проверял на D5 и D7 (BDE,DBX,IBX).

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.