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-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 :)


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

Наверх

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