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

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

SQL выражение в ADO вызывает исключение в msvcrt.dll


Страницы:   1 2 3 4 5 6 7 8

oxffff ©   (2007-11-19 09:59:00) 

Добрый день.

Кто нибудь встречался с такой ситуацией.
Имеется TADOQuery и следующий запрос

select value,
 (select count(*) from SourceTrains B join SourceVagons C
  on  B.TrainID=C.TrainID
  where convert(char(10),B.Traindate,2)=A.value
 ) as 'Total',
 (select count(*) from SourceTrains B join SourceVagons C
  on B.TrainID=C.TrainID
  where convert(char(10),B.Traindate,2)=A.value and    
               convert(char(2),B.Traindate,8)>=0 and
               convert(char(2),B.Traindate,8)<6                                    
   ) as '0-6 Total',

  ..............
   from (select convert(char(10),Traindate,2) as value
            from SourceTrains  group by convert(char(10),Traindate,2)
          ) A
  where trainId=:param1

После того как делаем

AdoQuery.SQL.add(Это SQL выражение )
вызывает исключение в msvcrt.dll

Самое интересное что если обрамить в скобки(даже в одну скобку выражение FROM,  т.е.

(

from (select convert(char(10),Traindate,2) as value
            from SourceTrains  group by convert(char(10),Traindate,2)
          ) A
  where trainId=:param1

)    <-  эту скобку можно даже не ставить.

то исключение не генерируется.
Но само SQL выражение не корректно.

Что это за баг? и Как его обойти


oxffff   (2007-11-20 13:23:00) [1]


> sniknik ©   (20.11.07 11:01) [146]
> > Да почему же, я всегда открыт к обсуждению.
> оно и видно, ни на одно предложение нет "конструктива" типа
> "не понимаю зачем но возможно это чтото даст. обьясните",
>  только "я вам сказал что так делать нельзя и я сделал единственно
> правильным способом".
> если кто решит перечитать ветку, тот думаю со мной согласится,
>  подтекст всего именно такой. (с примесью "я вот делаю правильно,
>  а оно еще и не работает. а вы еще и говорите что ошибка
> эта правильная", хотя так никто говорит, говорят лиш что
> делаешь неправильно)

То есть вы в очередной раз утверждаете, что мой запрос является причиной бага.
И что запросы нужно обязательно писать в строго определенной форме, чтобы не вызывать баги
Слышай от вас это более чем странно.
Запрос не является причиной бага. Причиной бага является ошибка.
Если вы забыли, то я сам и нашел способ обхода бага, без именения конструкции.
А вы же на протяжение всей ветки доказываете, что мой запрос является причиной бага.
Но я вам в очередной раз повторяю, что я не пытался изменить запрос (и даже не рассматривал это)
и не обращал внимания на ваши выпады в сторону изменения запроса, поскольку к делу отношения не имеют.

Далее вы пытались обвинить меня в другом мною найденном баге, но уже в Delphi.
И пытались доказать что этот баг, это не баг вовсе. Что так и должно быть  
Это уже еще более чем странно.

>
> > Генератору указываются какие фильтры использовать. И предоставляется
> поставщик параметров. Это динамика.
> программе указывается какие параметры использовать. и предоставляется
> список их значений. это динамика.
> несогласен? я ведь не перекомпилю программу на каждый твой
> внесенный запрос/смененного провайдера...

Ваша программа это просто обыкновенный текстовый редактор, не более того.
А вся функциональность сводится к набору текста.
Т.е. формирование всей логики запроса статично прописано пользователем и не может измениться.

Более того параметры вообще приделаны где-то сбоку.
Где  сопоставление реально используемых параметров и заданных?

Синтаксис проверяется на этапе выполнения SQL выражения.
ТО есть ваша программа оперирует с понятием текст, а не запрос
Нужно OR, AND, NOT, EXISTS, iN, соединение  и т.п. Надо? Пиши текст?

>
> > Однако сформировать фильтры придется статично.
> с чего это бы "придется"?
> > Однако есть возможность часть фильтров  формировать в
> динамике.
> она и есть.
> нажми Ctl+F в гриде. поиск сделан на фильтрах. и опять таки
> никаких перекомпиляций на неизвестный мне еще запрос...

А почему тогда сразу не в текстовом редакторе?
Запрос формируется статично пользователем, и не может изменять свою форму без участия пользователя - т.е. нет динамичности

Во это меня вообще удивило.

SELECT * INTO [Сведения о заказах] FROM [Сведения о заказах]

А что мне здесь опять править вручную destenation?
Могу я выбрать таблицу назначения отдельно. Или опять текст

Вообщем, не позорьтесь со своей детской неподелкой.

>
> > поскольку голова погружена только в этот небольшой Framework.
>
> глупости этот твой Framework. (по описанию в [137])

Если у вас нет фантазии, какое отношение это имеет ко мне?

> а объяснению не подлежит, я и более простые(/грубые такие
> что просто в хелпе можно посмотреть, про createparameter
> например) вещи зарекся тебе объяснять. а тут все на "тонких"
> материях...

Ну в свете того, что вы мне пытались доказать, что нарушение семантики - это не баг.
А ваши параметры, которые вообще сбоку и нет их контроля.
Читать хелп явно нужно не мне, а вам и начать с самых азов.


sniknik   (2007-11-20 11:09:00) [2]

> ... не обрабатывается и нам он "сваливается".
... не обрабатывается и на чем он "сваливается".


sniknik   (2007-11-20 11:01:00) [3]

> Да почему же, я всегда открыт к обсуждению.
оно и видно, ни на одно предложение нет "конструктива" типа "не понимаю зачем но возможно это чтото даст. обьясните", только "я вам сказал что так делать нельзя и я сделал единственно правильным способом".
если кто решит перечитать ветку, тот думаю со мной согласится, подтекст всего именно такой. (с примесью "я вот делаю правильно, а оно еще и не работает. а вы еще и говорите что ошибка эта правильная", хотя так никто говорит, говорят лиш что делаешь неправильно)

> Генератору указываются какие фильтры использовать. И предоставляется поставщик параметров. Это динамика.
программе указывается какие параметры использовать. и предоставляется список их значений. это динамика.
несогласен? я ведь не перекомпилю программу на каждый твой внесенный запрос/смененного провайдера...

> Однако сформировать фильтры придется статично.
с чего это бы "придется"?
> Однако есть возможность часть фильтров  формировать в динамике.
она и есть.
нажми Ctl+F в гриде. поиск сделан на фильтрах. и опять таки никаких перекомпиляций на неизвестный мне еще запрос...

> поскольку голова погружена только в этот небольшой Framework.
глупости этот твой Framework. (по описанию в [137])
устрой голосование.
мой голос за это, +1.
а объяснению не подлежит, я и более простые(/грубые такие что просто в хелпе можно посмотреть, про createparameter например) вещи зарекся тебе объяснять. а тут все на "тонких" материях...

> Гарантии, того что он не свалиться на case нет.
а я и не давал гарантий, я говорил что парсер будет "счастлив" видеть вместо монстра с кучей подзапросов (вложенность то и связи ему обрабатывать), удобочитаемый и однопроходной запрос... и возможно (!!! только возможно, хотя и с высокой долей вероятности. а возможно и там написать монстра), он не впадет в рекурсию, не израсходует все ресурсы, не выйдет за пределы какихто ограничений, не сделает в общем того что у него счас не обрабатывается и нам он "сваливается".
если перечитаешь, кстати я и ошибку то вижу не в том в чем ты... для меня ошибка это то, что она не конкретизированна, т.е. не обработана. была бы не просто AV а чтото вроде "выход за пределы ограничений на количество вложенных запросов > 10"(например), я бы тогда сразу сказал "парень ты не прав, это твой глюк а не их"... а так я этого не говорил.

p.p.p.s все, действительно хватит, работать надо.


oxffff   (2007-11-20 09:42:00) [4]


> но отговаривать не буду, догадываюсь о реакции.


Да почему же, я всегда открыт к обсуждению.


> > Вот тут и есть статика.
> и где же тут она? ты задаешь маски (не в dataset статически
> ка ты видать думаешь вносишь), далее вводишь (генерируешь)
> запрос с любыми параметрами из возможных масок, они динамически
> поставляются, если нужны, будь их там 1 или 10 неважно.
> это именно динамика, если ты статически их занесешь в dataset
> а в запросе их не будет, будет ошибка (вроде бы... не делал
> так, как ты говоришь я делаю).


Генератору указываются какие фильтры использовать. И предоставляется поставщик параметров. Это динамика.

Однако сформировать фильтры придется статично.
Это касается сложных фильтров. И здесь ваш инструмент оказал бы содействие.
Однако есть возможность часть фильтров  формировать в динамике.
Для этого производить анализ схемы БД.

Например срез по внешнему ключ, умножение и т.п.
Конечно эти правила будут задаваться в статике (compile time) + run time by user. Но формирование фильтра, интерфейса, разбор параметров будет в динамике.


> > А если вы выкрутитесь на sum то 0, то 1,
> просто да? а догадаться не смог.
> > но тогда большая часть у вас будет холостой ход, поскольку
> большая часть не будет попадать в заданный диапазон.
> ??? и все одно полная уверенность в своей непогрешимости.
>  


Да нет же. Я данном случае вы правы, запрос можно оптимизировать.
И данном случае умножение множества будет производиться дольше чем
число-дробилка с sum+case.

Однако я не ставил перед собой этой цели, поскольку голова погружена только в этот небольшой Framework.


> > Нельзя оправдывать баги видом и сложностью запроса.
> а кто их оправдывает?
> тебе лиш сказали, что "делал бы нормально, и даже бы их
> не заметил"...
> но ты предпочитаешь в них "упереться" и "обсасывать" до
> последнего.


Гарантии, того что он не свалиться на case нет.


sniknik   (2007-11-20 09:17:00) [5]

> Нельзя оправдывать баги видом и сложностью запроса.
а кто их оправдывает?
тебе лиш сказали, что "делал бы нормально, и даже бы их не заметил"...
но ты предпочитаешь в них "упереться" и "обсасывать" до последнего.


sniknik   (2007-11-20 09:14:00) [6]

> Вам нужно щелкнуть правой кнопой и добавить параметр вручную.
там все вручную, я не пытаюсь автоматизировать собственную умственную деятельность по составлению запросов как в [137] (блин, раньше не мог сказать какими глупостями занимаешься? тут я тебе не помошник)
но отговаривать не буду, догадываюсь о реакции.

> Вот тут и есть статика.
и где же тут она? ты задаешь маски (не в dataset статически ка ты видать думаешь вносишь), далее вводишь (генерируешь) запрос с любыми параметрами из возможных масок, они динамически поставляются, если нужны, будь их там 1 или 10 неважно. это именно динамика, если ты статически их занесешь в dataset а в запросе их не будет, будет ошибка (вроде бы... не делал так, как ты говоришь я делаю).

> А если вы выкрутитесь на sum то 0, то 1,
просто да? а догадаться не смог.
> но тогда большая часть у вас будет холостой ход, поскольку большая часть не будет попадать в заданный диапазон.
??? и все одно полная уверенность в своей непогрешимости.

ЮЮ ©   (20.11.07 03:42) [141]
> А вот многократный full scan в каждом твоем "подзапросе" просто гарантирован.
ага, гарантия на фул скан 100%, и статистика работать не будет, условия по расчетным данным. и памяти на 10? 20? в общем на n произведений таблиц в объединениях немало уйдет.
1 запрос с "холостыми ходами" по сумме на 1 число, это будет на n раз (ровно на количество запросов объединений) выгоднее чем оно счас есть (временем на работу с числом можно пренебречь т.к. оно будет очень мало в сравнении с построением объединения).


oxffff   (2007-11-20 08:50:00) [7]


> ЮЮ ©   (20.11.07 03:42) [141]


Беседа зашла далеко от темы. Ну хорошо.
Вы будете группировать по дню. Воответственно в группу попадут все записи за день. А case будет делать нужный срез в группе.  
Причем будет пробегать по всей группе
(обрабатывая и те, которые не войдут в срез.
Все что не попадает будет заменяться на 0, на все что попадает на 1.
И делать это надо для каждого среза.
А sum обрабатывает все записи в группе.

Я сейчас не готов дать оценку производительности.
Да и не ставил я перед собой такую задачу по оптимизации.
Однако я соглашусь c sniknik и с вами, что есть резерв для оптимизации этого запроса, в том числе и case+sum.

Поскольку вопрос не затрагивал оптимизацию запроса,
а имеел отношение непосредственно в багу провайдера.
и в результате мною был найден еще один баг.
считаю вопросы касающиеся вида и формы запроса, не имееющим отношения в предмету вопроса.
Нельзя оправдывать баги видом и сложностью запроса.


ЮЮ   (2007-11-20 03:42:00) [8]

> А если вы выкрутитесь на sum то 0, то 1, но тогда большая
> часть у вас будет холостой ход, поскольку большая часть
> не будет попадать в заданный диапазон.


из SourceTrains и SourceVagons ОДИН РАЗ получаем выборку вида

TrainDayOnly, Total, Total06,  Total0612, ..., содержащую только 0 и 1( благодаря case). Причем хотя бы в одном столбце будет 1, т.к. WHERE часть никто не отменял и мы анализирируем лишь те строки, которые войдут в нужную статистику.

А теперь по этой выборке делаем суммирование.
И где здесь холостой ход? А вот многократный full scan в каждом твоем "подзапросе" просто гарантирован.


oxffff   (2007-11-20 01:07:00) [9]


> sniknik ©   (20.11.07 00:36) [132]
> > А что написать сложно?
> принципы дело серьезное...
>
> > Как вы сделаете count
> count не единственная агрегирующая функция,
>
> > в каждом поле и магическим образом заставите складывать
> только те значение которые удовлетворяют условию.
> легко! причем необязательно заставлять складывать "только
> те" (хотя и это можно), можно "не тем" например давать значение
> 0, а складывать все подряд.


А если вы выкрутитесь на sum то 0, то 1, но тогда большая часть у вас будет холостой ход, поскольку большая часть не будет попадать в заданный диапазон.


oxffff   (2007-11-20 00:58:00) [10]


> sniknik ©   (20.11.07 00:46) [136]
> > Сейчас я попытаюсь объяснить задачу.
> а... ну я так понимаю запрос тот сработал? :)))


Только, чтобы он сработал. Вам нужно щелкнуть правой кнопой и добавить параметр вручную. Вот тут и есть статика.

А как же насчет CASE?


oxffff   (2007-11-20 00:53:00) [11]


> а... ну я так понимаю запрос тот сработал? :)))


У меня не стоит дома SQL сервер.


oxffff   (2007-11-20 00:52:00) [12]

Часто приходиться писать интерфейсы для которых приходиться делать различные фильтры. Но поскольку часть фильтров может отключаться включаться, то часть приходиться писать код который собирает where выражение. А фильтры могут состоять из вариантов.
Я смотрю и думаю, а зачем если я могу формировать это предложение динамически.
Таким образом моя задача написать генератор и правила к нему, чтобы облегчить оную задачу.
И получается следующее.

TQueryGenerator.create('base sql выражение',
              [
             TAloneFilter.create('AND','фильтр выражение'),
             TMultiFilter.create('OR',['фильтр выражение1','фильтр выражение2'])
              ]

TQueryGenerator.Reopen([0,0],ParamerBroker);


sniknik   (2007-11-20 00:46:00) [13]

> Сейчас я попытаюсь объяснить задачу.
а... ну я так понимаю запрос тот сработал? :)))


oxffff   (2007-11-20 00:43:00) [14]


> sniknik ©   (20.11.07 00:39) [133]


Сейчас я попытаюсь объяснить задачу.


oxffff   (2007-11-20 00:41:00) [15]


> sniknik ©   (20.11.07 00:39) [133]


Собственно у меня другая задача. Я думаю спор из-за непонимания


sniknik   (2007-11-20 00:39:00) [16]

> Это детская поделка 2 курса. Не более.
это писалось в 2000м году (правда еще пару тройку раз добавлялось кое чего по надобности), для изучения ADO. не менее.


sniknik   (2007-11-20 00:36:00) [17]

> А что написать сложно?
принципы дело серьезное...

> Как вы сделаете count
count не единственная агрегирующая функция,

> в каждом поле и магическим образом заставите складывать только те значение которые удовлетворяют условию.
легко! причем необязательно заставлять складывать "только те" (хотя и это можно), можно "не тем" например давать значение 0, а складывать все подряд.

> Причем в каждом столбце условия разные?
в каждом столбце естественно будут свои условия.

> Куда нажать?
> Чтобы сформировать where с AND или OR,  NOT? Это возможно?
ручками, ручками все что угодно (считай что ТЫ генератор запроса), по синтаксису того провайдера что выбран, либо задай предопределение с "AND или OR,  NOT", параметры по правой кнопке мыши, а вообще читай ридми.


oxffff   (2007-11-20 00:35:00) [18]


> sniknik ©   (20.11.07 00:14) [128]


Если, это все что она может, только 10 шаблонных запросов, то я бы вам даже двойку не поставил. Это детская поделка 2 курса. Не более.
А вы мне тут о параметрах. Учите мат часть. И help заодно.

Да и case не забудьте.


oxffff   (2007-11-20 00:31:00) [19]


> sniknik ©   (20.11.07 00:14) [128]


Я честно говоря совсем не понял где у вас здесь динамическое формирование запроса.
Кроме 10 шаблонов.  
CREATE TABLE [Table] (Field Type)

Куда нажать?

Чтобы сформировать where с AND или OR,  NOT? Это возможно?


oxffff   (2007-11-20 00:19:00) [20]


> можеш поискать в базах... месяца не прошло предлагал решение
> на похожую задачу.


А что написать сложно?
Как вы сделаете count в каждом поле и магическим образом заставите складывать только те значение которые удовлетворяют условию.
Причем в каждом столбце условия разные?

Что это за хитрый какой синтаксис, если он есть?


Страницы:   1 2 3 4 5 6 7 8

Наверх

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