![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL выражение в ADO вызывает исключение в msvcrt.dll
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 в каждом поле и магическим образом заставите складывать только те значение которые удовлетворяют условию.
Причем в каждом столбце условия разные?
Что это за хитрый какой синтаксис, если он есть?