![]() |
| ||
|
|
Новости |
Поиск |
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-19 22:04:00) [41]
> oxffff © (19.11.07 22:01) [107]
А далее на конкретную дату получать, Общее число,
число за интервал часов дня, число за этот интервал часов дня с различными статусами.
oxffff (2007-11-19 22:01:00) [42]
> либо вообще
> from (select distinct DateAdd(d, 0, DateDiff(d, '', Traindate))
> as value from SourceTrains) A
> тогда и значение (value) будет нормальной датой, а не строкой
> (формат локальный сработает...).
Я же говорю, вы не зная запроса предлагаете свой вариант.
А вы разве не в курсе, что здесь в вашем запросе я получу тип datetime?
А мне нужно получить просто дату, без времени.
oxffff (2007-11-19 21:51:00) [43]
> sniknik © (19.11.07 21:10) [104]
Может хватит уже фантизировать.
>но они же есть! и через "парсе", ты их тоже создаешь, а после через >parambyname (или по индексу) присваиваешь значение, и это не >мешает "динамичности", не будет и "мой" метод мешать. он только >упрощает, вместо 3 действий будет одно. (для 1 параметра, для 2х вместо >4-х 2-ва и т.д.)
Где вы увидили, что я явно параметры присваиваю.
Т.е. насколько я понял вы утверждаете, что я делаю так в коде AdoDataSet.parameters.parambyname('').value:=some value.
Знайте, что я не делаю так.
За меня это делает генератор динамически.
см.
oxffff © (19.11.07 12:40) [45]
А именно генератор смотрит параметры запроса, распарсенные parseSQL.
И обращается к поставщику параметров через интерфейс, в простом случае, это форма с компонентами, которая возвращает значения параметра по требованию.
Что и теперь будете на своем стоять?
>> И предлагаете это не я, а вы.
>ага. я всегда стараюсь все упростить. и всем предлагаю. но не хотят.
Способ, который вы предлагаете статичен и жестко зашит в код.
В моем случае мы не проводим связь между набором параметров и запросом. А делаем это по требованию. Так что, то что вы предлагаете - это реализация со статической привязкой параметров (на этапе компиляции вы делаете эту привязку в коде или XML файле).
В моей реализации делать это не надо.
Так что перед тем как предложить посмотрите в зеркало. :)
К сожалению вы здесь усложняете. См. выше.
Ну вы и фантазер.
select value,
-> всего за день 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',
-> всего за value день с 0 часов до 6 часов
(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',
... Далее идут
-> всего за value день с 0 часов до 6 часов со статусом 0
-> всего за value день с 0 часов до 6 часов со статусом 12
-> всего за value день с 0 часов до 6 часов со статусом 14
-> всего за value день с 0 часов до 6 часов со статусом 30
Далее
... с 6 до 14 часов, и со статусами и т.д.
.........
sniknik (2007-11-19 21:16:00) [44]а да. чуть не забыл, могу выложить свою программку (на "своих" принципах ;о)), в которой можно проверить запрос, с динамическим(! о как ;), и мне не мешает) созданием запросов, и параметров (до 10-и, ограничение искусственное. просто так сделал)
практически уверен (процентов 90 даю), что в нем ваш запрос сработает.
(это чтобы не быть голословным)
sniknik (2007-11-19 21:10:00) [45]> А я сказал, что не нельзя так решать.
а я тебе не верю...
> Запросы формируются на лету.
> Состав параметров в одном и том же запросе (по смыслу) может меняться.
но они же есть! и через "парсе", ты их тоже создаешь, а после через parambyname (или по индексу) присваиваешь значение, и это не мешает "динамичности", не будет и "мой" метод мешать. он только упрощает, вместо 3 действий будет одно. (для 1 параметра, для 2х вместо 4-х 2-ва и т.д.)
> и создавать их через CreateParameter - это извините через одно место.
ну... это смотря у кого где руки.
> И предлагаете это не я, а вы.
ага. я всегда стараюсь все упростить. и всем предлагаю. но не хотят.
> Вы что царь бог, который все знает.
с вами станешь... хотя я всегда отвечаю на восклицание типа "какой ты умный" - "я нормальный это ты идиот/ка" (даже поссорился с девушкой один раз...)
> Если запрос большой,то это не значит что он неправильный.
если запрос большой, значит он большой (я не говорил неправильный), и если его можно написать проще значить нужно написать проще. а заодно может и парсер в его дебрях путаться перестанет. (не факт но...)
> Вы опять не внимательны. Посмотрите каждый подзапрос выбирает различный срез информации.
в зеркало похоже не смотрел...
я то как раз внимательный, и вижу возможность (если конечно в "волшебных пузырьках" - "..." таже прогрессия что задана в первых двух вариантах подзапросов)
например возможность раз
записать
from (select convert(char(10),Traindate,2) as value
from SourceTrains group by convert(char(10),Traindate,2)
) A
в виде
from (select distinct convert(char(10),Traindate,2) as value from SourceTrains) A
сеть одна, но убирается 1 функция работы со строкой
либо вообще
from (select distinct DateAdd(d, 0, DateDiff(d, '', Traindate)) as value from SourceTrains) A
тогда и значение (value) будет нормальной датой, а не строкой (формат локальный сработает...).
возможность номер 2
вся эта байда вообще не нужна, если ВЫ посмотрите внимательнее на СВОЙ запрос, то заметите что объединения делаются по одним и тем же таблицам, и одним и тем же связующим полям... а результат всего лиш подсчет количества...
т.е. это все можно свести к единственному запросу с группировкой по дню, а результаты полей считать условиях (CASE), т.е. все (либо хотябы часть) запросы с одинаковыми алиасами, и кучей джойнов, в которых парсер наверняка и путается, сведутся к одному запросу с одним объединением... парсер будет "счастлив".
> И почему то приписываете бажную реализацию мне, а не библиотеки в Delphi.
не реализацию, читай тщательнее, а получение значения из неправильного места. котороя я думал ты получаешь (см. обьяснения в прошлом топике. и обьяснения почему я так думал. заблуждение ввиду отсутствия информации на тот момент, о том что делалось.)
p.p.s. а вообще нафиг. писать без надежды на понимание (притом еще и меня обвиняют, вместо того чтобы в зеркало посмотреть), смысла наверное нет. пока.
Anatoly Podgoretsky (2007-11-19 19:56:00) [46]> oxffff (19.11.2007 19:47:42) [102]
Ох если бы, по моему не понимание технологии и пофигизм.
oxffff (2007-11-19 19:47:00) [47]
> Anatoly Podgoretsky © (19.11.07 19:35) [101]
я надеюсь невнимательность. :)
Anatoly Podgoretsky (2007-11-19 19:35:00) [48]> oxffff (19.11.2007 19:21:40) [100]
Мне было проще, но и очень большая нужда в Юникод, попутно они там устранили ошибку и с автоинкриментрыми полями и кое что с целыми, но мне интересно как они вообще могли допустить такие простые, детские ошибки.
oxffff (2007-11-19 19:21:00) [49]
> Anatoly Podgoretsky © (19.11.07 19:07) [99]
Да я бы с радостью. Но завязаны на компонентах под 7.
Что касаемо реализации ParseSQL на 10. Они поменяли на widestring.
А в реализации семантики addref присутствует создание дублеката с помощью SysAllocStringLen.
Anatoly Podgoretsky (2007-11-19 19:07:00) [50]> oxffff (19.11.2007 18:46:38) [98]
Я могу еще кое что добавить, это ошибки Борланда при работе с параметрами, особенно WideString, они наблюдаются начиная с версии 5 и в 7 они еще не устранены, только 10 более менее удовлетворяет.
Ошибки дурные и неисправимые. Они связаны например с внутренним зеркальным объявлением и они не лечатся даже исправлением генофонда, попытки компилировать ни к чему не приводят, ни ошибок нет, но и dcu file нет, похоже это из-за интерфейсов или черт его знает из-за чего.
Из-за этих очень обидных ошибок и необходимости работать с Юникод мне пришлось перейти на 10.
Поэтому советую и вам серьезно задуматься над этим шагом.
У меня переход был бесболезненый, ни единого изменения, просто перекомпиляция проекта, но это возможно из-за того, что не использую посторонних компонент, только TNT
oxffff (2007-11-19 18:46:00) [51]
> Anatoly Podgoretsky © (19.11.07 18:33) [95]
Так я вам и поверил же.
Сам еще не проверил.
Однако придется остановиться на 7.
На работе все на 7 пишут.
C уважением Антонов Сергей. :)
oxffff (2007-11-19 18:42:00) [52]
> sniknik © (19.11.07 18:04) [92]
> начнем. я тебе сразу сказал что решение неэффективное, нормально
> все делается через CreateParameter, в одну строку. сказал
> и решил что проблема решена...
А я сказал, что не нельзя так решать.
Запросы формируются на лету.
Состав параметров в одном и том же запросе (по смыслу) может меняться.
Причем запросы (по смыслу) могут добавляться и меняться его варианты на (разновидности) на лету.
Поэтому создавать для каждого варианта - список параметров и создавать их через CreateParameter - это извините через одно место.
И предлагаете это не я, а вы.
>подсократить запрос,
Вы что царь бог, который все знает.
Если запрос большой,то это не значит что он неправильный.
Вы опять не внимательны. Посмотрите каждый подзапрос выбирает различный срез информации.
>а результат ты получал через одно место где нет var... и которое если >меняется то само изменение ошибочно.
То есть если функция принимает параметр по значению.
А ссылочная семантика string позволяет изменить строку переданное по значению, но это будет нарушение семантики типа.
То есть вы в очередной раз хотите сказать что нарушение семантики типа - это не баг. И почему то приписываете бажную реализацию мне, а не библиотеки в Delphi.
См. function ParseSQL(SQL: String; DoCreate: Boolean): String;
И если я вынужден так делать по причине того, что провайдер не обрабатывает параметры запроса.
У меня складывается впечатление, что либо вы не внимательно читали тему, либо не понимаете сути разговора.
Anatoly Podgoretsky (2007-11-19 18:35:00) [53]> sniknik (19.11.2007 18:08:33) [93]
Я проверял без установки свойств
Anatoly Podgoretsky (2007-11-19 18:33:00) [54]> oxffff (19.11.2007 17:12:31) [91]
> Anatoly Podgoretsky уже проверил на 10 версии. Там исправили.
Мог бы и поверить мне, я же написал, что проверил и на 7 и на 10
Anatoly Podgoretsky (2007-11-19 18:32:00) [55]> Сусл (19.11.2007 17:04:29) [89]
И в Д7 as designed и в Д2006?
Поведение разное.
sniknik (2007-11-19 18:08:00) [56]> Либо более свежую версию OLEDB провайдера качнуть.
подсократить запрос, тоже проигнорировал... а могло бы помочь и без провайдера. (хотя обновления нужно в любом случае)
p.s. еще раз в зеркало посмотри.
sniknik (2007-11-19 18:04:00) [57]> Начнем по порядку.
> 1. Баг1 не некорректная обработка параметров провайдером.
> --> Решение
начнем. я тебе сразу сказал что решение неэффективное, нормально все делается через CreateParameter, в одну строку. сказал и решил что проблема решена...
а то что ты привел с "парсе" думал ты делаешь ради результата, распарсеной строки (потому как удивление вызывал сам факт разного результата, а не то что изменений не должно быть (необъяснено, что делается, поэтому подставлен ближайший смысл)), а результат ты получал через одно место где нет var... и которое если меняется то само изменение ошибочно.
так понятно?
> Они не то, что не слышат, а не хотят слушать.
в зеркало посмотри...
oxffff (2007-11-19 17:12:00) [58]
> Сусл © (19.11.07 17:04) [89]
Anatoly Podgoretsky уже проверил на 10 версии. Там исправили.
Я пока на работе на 7.
Но это побочный баг. А баг провайдера нужно в Microsoft. Либо более свежую версию OLEDB провайдера качнуть.
Может у меня старый.
oxffff (2007-11-19 17:07:00) [59]
> Anatoly Podgoretsky © (19.11.07 17:03) [88]
У меня есть уважение к более старшим товарищам. И всегда будет оставаться. И к вам лично также.
Просто я уже стал давно замечать, что у старших товарищей звездит.
И они не всегда реально представляют ситуацию.
Но настораживает другое. Они не то, что не слышат, а не хотят слушать.
Это печально.
Сусл (2007-11-19 17:04:00) [60]сергей, обсуждай это в новостных группах бета-теста, чессо слово полезней будет.
не, не то чтобы здесь люди неправильные и не понимают, просто они пользователи дельфи, а не разработчики. нарвись лучше на разработчика по дельфи в указанных новостных группах. вот там можно очень неплохо сцепица :)
вообще, совет - постарайся найти тест-кеэс без АДО, просто - ошибка компилятора. тогда тебе легко удасться сцепиться с тем же пьером ле ришем. правда, очень вероятно, что он тебе докажет - as designed :)