Текущий архив: 2008.04.13;
Скачать: CL | DM;
Вниз
SQL выражение в ADO вызывает исключение в msvcrt.dll Найти похожие ветки
← →
oxffff © (2007-11-19 16:30) [80]Anatoly Podgoretsky © (19.11.07 16:15) [78]
sniknik © (19.11.07 16:21) [79]
Начнем по порядку.
1. Баг1 не некорректная обработка параметров провайдером.
--> Решение
Dataset.ParamCheck:=false;
Dataset.CommandText:=Dataset.Parameters.ParseSQL(SQL,true);
Dataset.Parameters.ParseSQL(SQL,true);
Но поскольку у меня вместо SQL был вызов процедуры которая возвращает WideString. А поскольку в двух вызовах создается две копии string. Поэтому одна на другую не влияет.
Далее.
Я делаю так
SQL:= <- здесь это уже string
Dataset.ParamCheck:=false;
Dataset.CommandText:=Dataset.Parameters.ParseSQL(SQL,true);
Dataset.Parameters.ParseSQL(SQL,true);
и нарываюсь на другие грабли уже в delphi.
По скольку если строка в куче, то параметров после вызова
Dataset.CommandText:=Dataset.Parameters.ParseSQL(SQL,true);
уже нет.
По скольку они заменены на ? напрямую во входном параметре.
А после вызов Dataset.Parameters.ParseSQL(SQL,true);
не создает параметров. По скольку в строке уже их нет.
Чего не понятно то?
← →
Anatoly Podgoretsky © (2007-11-19 16:34) [81]> oxffff (19.11.2007 16:30:20) [80]
Непонятно зачем, ты объясняешь как, а не почему (зачем).
← →
oxffff © (2007-11-19 16:36) [82]
> Anatoly Podgoretsky © (19.11.07 16:34) [81]
Что почему?
← →
Anatoly Podgoretsky © (2007-11-19 16:43) [83]> oxffff (19.11.2007 16:36:22) [82]
Ладно проехали, раз не понял.
Но вот что я наблюдаю, гляда за тобой, ты часто применяешь рискованые вещи, иногда действительно нарываешь на баг, а чаще на то, что твое представление не совпадает с представлением компилятора. Но это твое право.
← →
oxffff © (2007-11-19 16:56) [84]
> Anatoly Podgoretsky © (19.11.07 16:43) [83]
Пожалуйста тыкните меня носом в то место, где мое представление о работе компилятора не совпадает, а то знаете не хорошо так.
← →
Anatoly Podgoretsky © (2007-11-19 16:59) [85]> oxffff (19.11.2007 16:56:24) [84]
Ну не буду же я извлекать все сообщения из форумов, это мое наблюдение, ты часто жалуешься, что обнаружил баг, и потом идет разборка баг или нет. Неужели я тебя с кем то перепутал?
← →
oxffff © (2007-11-19 16:59) [86]Anatoly Podgoretsky © (19.11.07 16:43) [83]
Знаете а у меня кстати сложилось обратное впечатление,
где вы и господин sniknik © пытались убедить меня в том, что нарушение семантики типа и правил языка - это нормально.
← →
oxffff © (2007-11-19 17:03) [87]
> Anatoly Podgoretsky © (19.11.07 16:59) [85]
Во первых я не жалуюсь.
А во вторых, если я и говорю об этом. То все это были действительно баги, о которых я написал в QC.
За исключеним одного случая, где было выравнивание в стеке по границе DWORD. Но Сергей М. меня поправил. Я правда об этом не знал.
В чем и признался.
А все остальное были баги.
Так что будьте более внимательны.
← →
Anatoly Podgoretsky © (2007-11-19 17:03) [88]> oxffff (19.11.2007 16:59:26) [86]
Может и пытался, хотя обычно обхожу стороной подобные ветки. Эта просто меня заинтересовала, решил проверить на разных версиях. А применять подобное никогда не буду. Конечно грабли это бесченный опыт, но можно и без него.
А ты что решил наехать? Так зря, я как то безраличен.
← →
Сусл © (2007-11-19 17:04) [89]сергей, обсуждай это в новостных группах бета-теста, чессо слово полезней будет.
не, не то чтобы здесь люди неправильные и не понимают, просто они пользователи дельфи, а не разработчики. нарвись лучше на разработчика по дельфи в указанных новостных группах. вот там можно очень неплохо сцепица :)
вообще, совет - постарайся найти тест-кеэс без АДО, просто - ошибка компилятора. тогда тебе легко удасться сцепиться с тем же пьером ле ришем. правда, очень вероятно, что он тебе докажет - as designed :)
← →
oxffff © (2007-11-19 17:07) [90]
> Anatoly Podgoretsky © (19.11.07 17:03) [88]
У меня есть уважение к более старшим товарищам. И всегда будет оставаться. И к вам лично также.
Просто я уже стал давно замечать, что у старших товарищей звездит.
И они не всегда реально представляют ситуацию.
Но настораживает другое. Они не то, что не слышат, а не хотят слушать.
Это печально.
← →
oxffff © (2007-11-19 17:12) [91]
> Сусл © (19.11.07 17:04) [89]
Anatoly Podgoretsky уже проверил на 10 версии. Там исправили.
Я пока на работе на 7.
Но это побочный баг. А баг провайдера нужно в Microsoft. Либо более свежую версию OLEDB провайдера качнуть.
Может у меня старый.
← →
sniknik © (2007-11-19 18:04) [92]> Начнем по порядку.
> 1. Баг1 не некорректная обработка параметров провайдером.
> --> Решение
начнем. я тебе сразу сказал что решение неэффективное, нормально все делается через CreateParameter, в одну строку. сказал и решил что проблема решена...
а то что ты привел с "парсе" думал ты делаешь ради результата, распарсеной строки (потому как удивление вызывал сам факт разного результата, а не то что изменений не должно быть (необъяснено, что делается, поэтому подставлен ближайший смысл)), а результат ты получал через одно место где нет var... и которое если меняется то само изменение ошибочно.
так понятно?
> Они не то, что не слышат, а не хотят слушать.
в зеркало посмотри...
← →
sniknik © (2007-11-19 18:08) [93]> Либо более свежую версию OLEDB провайдера качнуть.
подсократить запрос, тоже проигнорировал... а могло бы помочь и без провайдера. (хотя обновления нужно в любом случае)
p.s. еще раз в зеркало посмотри.
← →
Anatoly Podgoretsky © (2007-11-19 18:32) [94]> Сусл (19.11.2007 17:04:29) [89]
И в Д7 as designed и в Д2006?
Поведение разное.
← →
Anatoly Podgoretsky © (2007-11-19 18:33) [95]> oxffff (19.11.2007 17:12:31) [91]
> Anatoly Podgoretsky уже проверил на 10 версии. Там исправили.
Мог бы и поверить мне, я же написал, что проверил и на 7 и на 10
← →
Anatoly Podgoretsky © (2007-11-19 18:35) [96]> sniknik (19.11.2007 18:08:33) [93]
Я проверял без установки свойств
← →
oxffff © (2007-11-19 18:42) [97]
> sniknik © (19.11.07 18:04) [92]
> начнем. я тебе сразу сказал что решение неэффективное, нормально
> все делается через CreateParameter, в одну строку. сказал
> и решил что проблема решена...
А я сказал, что не нельзя так решать.
Запросы формируются на лету.
Состав параметров в одном и том же запросе (по смыслу) может меняться.
Причем запросы (по смыслу) могут добавляться и меняться его варианты на (разновидности) на лету.
Поэтому создавать для каждого варианта - список параметров и создавать их через CreateParameter - это извините через одно место.
И предлагаете это не я, а вы.
>подсократить запрос,
Вы что царь бог, который все знает.
Если запрос большой,то это не значит что он неправильный.
Вы опять не внимательны. Посмотрите каждый подзапрос выбирает различный срез информации.
>а результат ты получал через одно место где нет var... и которое если >меняется то само изменение ошибочно.
То есть если функция принимает параметр по значению.
А ссылочная семантика string позволяет изменить строку переданное по значению, но это будет нарушение семантики типа.
То есть вы в очередной раз хотите сказать что нарушение семантики типа - это не баг. И почему то приписываете бажную реализацию мне, а не библиотеки в Delphi.
См. function ParseSQL(SQL: String; DoCreate: Boolean): String;
И если я вынужден так делать по причине того, что провайдер не обрабатывает параметры запроса.
У меня складывается впечатление, что либо вы не внимательно читали тему, либо не понимаете сути разговора.
← →
oxffff © (2007-11-19 18:46) [98]
> Anatoly Podgoretsky © (19.11.07 18:33) [95]
Так я вам и поверил же.
Сам еще не проверил.
Однако придется остановиться на 7.
На работе все на 7 пишут.
C уважением Антонов Сергей. :)
← →
Anatoly Podgoretsky © (2007-11-19 19:07) [99]> oxffff (19.11.2007 18:46:38) [98]
Я могу еще кое что добавить, это ошибки Борланда при работе с параметрами, особенно WideString, они наблюдаются начиная с версии 5 и в 7 они еще не устранены, только 10 более менее удовлетворяет.
Ошибки дурные и неисправимые. Они связаны например с внутренним зеркальным объявлением и они не лечатся даже исправлением генофонда, попытки компилировать ни к чему не приводят, ни ошибок нет, но и dcu file нет, похоже это из-за интерфейсов или черт его знает из-за чего.
Из-за этих очень обидных ошибок и необходимости работать с Юникод мне пришлось перейти на 10.
Поэтому советую и вам серьезно задуматься над этим шагом.
У меня переход был бесболезненый, ни единого изменения, просто перекомпиляция проекта, но это возможно из-за того, что не использую посторонних компонент, только TNT
← →
oxffff © (2007-11-19 19:21) [100]
> Anatoly Podgoretsky © (19.11.07 19:07) [99]
Да я бы с радостью. Но завязаны на компонентах под 7.
Что касаемо реализации ParseSQL на 10. Они поменяли на widestring.
А в реализации семантики addref присутствует создание дублеката с помощью SysAllocStringLen.
← →
Anatoly Podgoretsky © (2007-11-19 19:35) [101]> oxffff (19.11.2007 19:21:40) [100]
Мне было проще, но и очень большая нужда в Юникод, попутно они там устранили ошибку и с автоинкриментрыми полями и кое что с целыми, но мне интересно как они вообще могли допустить такие простые, детские ошибки.
← →
oxffff © (2007-11-19 19:47) [102]
> Anatoly Podgoretsky © (19.11.07 19:35) [101]
я надеюсь невнимательность. :)
← →
Anatoly Podgoretsky © (2007-11-19 19:56) [103]> oxffff (19.11.2007 19:47:42) [102]
Ох если бы, по моему не понимание технологии и пофигизм.
← →
sniknik © (2007-11-19 21:10) [104]> А я сказал, что не нельзя так решать.
а я тебе не верю...
> Запросы формируются на лету.
> Состав параметров в одном и том же запросе (по смыслу) может меняться.
но они же есть! и через "парсе", ты их тоже создаешь, а после через 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. а вообще нафиг. писать без надежды на понимание (притом еще и меня обвиняют, вместо того чтобы в зеркало посмотреть), смысла наверное нет. пока.
← →
sniknik © (2007-11-19 21:16) [105]а да. чуть не забыл, могу выложить свою программку (на "своих" принципах ;о)), в которой можно проверить запрос, с динамическим(! о как ;), и мне не мешает) созданием запросов, и параметров (до 10-и, ограничение искусственное. просто так сделал)
практически уверен (процентов 90 даю), что в нем ваш запрос сработает.
(это чтобы не быть голословным)
← →
oxffff © (2007-11-19 21:51) [106]
> 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 часов, и со статусами и т.д.
.........
← →
oxffff © (2007-11-19 22:01) [107]
> либо вообще
> from (select distinct DateAdd(d, 0, DateDiff(d, "", Traindate))
> as value from SourceTrains) A
> тогда и значение (value) будет нормальной датой, а не строкой
> (формат локальный сработает...).
Я же говорю, вы не зная запроса предлагаете свой вариант.
А вы разве не в курсе, что здесь в вашем запросе я получу тип datetime?
А мне нужно получить просто дату, без времени.
← →
oxffff © (2007-11-19 22:04) [108]
> oxffff © (19.11.07 22:01) [107]
А далее на конкретную дату получать, Общее число,
число за интервал часов дня, число за этот интервал часов дня с различными статусами.
← →
oxffff © (2007-11-19 22:15) [109]
> не реализацию, читай тщательнее, а получение значения из
> неправильного места. котороя я думал ты получаешь (см. обьяснения
> в прошлом топике. и обьяснения почему я так думал. заблуждение
> ввиду отсутствия информации на тот момент, о том что делалось.
> )
Я не могу понять смысл вашей фразы. Кто думал? Что думал?
И что это за неправильное место такое? И кто дал ему характеристику?
Что за прошлый топик?
← →
oxffff © (2007-11-19 22:32) [110]
> т.е. это все можно свести к единственному запросу с группировкой
> по дню, а результаты полей считать условиях (CASE), т.е.
> все (либо хотябы часть) запросы с одинаковыми алиасами,
> и кучей джойнов, в которых парсер наверняка и путается,
> сведутся к одному запросу с одним объединением... парсер
> будет "счастлив".
Ну и далее то как, как вы будете выделять с помощью CASE.
количество в интервале(в часах) дня.
Пример не приведете случаем.
← →
sniknik © (2007-11-19 22:54) [111]> Может хватит уже фантизировать.
> Где вы увидили, что я явно параметры присваиваю.
смотрим в [0]
...
where trainId=:param1
...
оба на, параметр, а как же к нему идет обращение? присваивается значение? наверное путем фантазирования.
> Т.е. насколько я понял вы утверждаете, что я делаю так в коде AdoDataSet.parameters.parambyname("").value:=some value.
> Знайте, что я не делаю так.
есть собственный Хоттабыч? иначе только он может (по индексу считай это вариация того же).
> Способ, который вы предлагаете статичен и жестко зашит в код.
вот тут вы глубоко, прямотаки "не подецки" заблуждаетесь. (ложить программку? скомпиленную... ничего в нее не предзашито, какой запрос сами наберете (читайте сгенерируете, для программы это тоже самое), то и будет)
а вообще, есть одно правило в программировании - "как напишешь так и будет".
и похоже те средства которые для меня свободны для использования где угодно у тебя жестко зашиты в код.... выкини этот код. нехорошо это.
> Я же говорю, вы не зная запроса предлагаете свой вариант.
не предлагаю (еще чего не хватало), я говорю, что имеющееся (показанное) можно упростить. сильно упростить. также можно и остальное если оно "построено" аналогично.
> ... Далее идут
> ...
ну, вот именно это я и имею ввиду. аналогично. практически полный аналог.
> А мне нужно получить просто дату, без времени.
т.е. работать с датами ты тоже не умеешь... тяжело тебе. (ты ее как предложено как раз и получишь, дату без времени.)
> Я не могу понять смысл вашей фразы.
не сомневался.
> Что за прошлый топик?
ну, не так много я сюда и постил, чтоб потеряться. прошлый это значит тот что был до этого.
← →
sniknik © (2007-11-19 22:59) [112]> Пример не приведете случаем.
мог бы. но ты опоздал с этим вопросом, постов на 60...
← →
sniknik © (2007-11-19 23:06) [113]и это. не думай что я обиделся, личная неприязнь, или чего еще там... нет, мне все одно как развлекаться, просто я четко делю ветки на "деловые" и "потрепаться"... догадываешься в какую категорию попадает твоя? и почему? (подсказка - вовсе не по тому что создана в "потрепаться")
и вот теперь когда мы мило треплемся, вопрос о "доказательстве кодом" у меня уже ассоциируется с "сделай на слабо", а "на слабо" я ничего не делаю. из принципа.
← →
oxffff © (2007-11-19 23:18) [114]
> sniknik © (19.11.07 22:59) [112]
> > Пример не приведете случаем.
> мог бы. но ты опоздал с этим вопросом, постов на 60...
А вот и приведите.
И покажите как вы заставите агрегатную функцию для одного среза считать количество удовлетворяющих CASE.
А именно посчитать количество с 0 до 6 часов используя CASE без внутренних подзапросов.
А то впечатление что вы только болтать и умеете.
← →
oxffff © (2007-11-19 23:24) [115]
> sniknik © (19.11.07 22:54) [111]
> > Может хватит уже фантизировать.
> > Где вы увидили, что я явно параметры присваиваю.
> смотрим в [0]
> ...
> where trainId=:param1
> ...
> оба на, параметр, а как же к нему идет обращение? присваивается
> значение? наверное путем фантазирования.
>
> > Т.е. насколько я понял вы утверждаете, что я делаю так
> в коде AdoDataSet.parameters.parambyname("").value:=some
> value.
> > Знайте, что я не делаю так.
> есть собственный Хоттабыч? иначе только он может (по индексу
> считай это вариация того же).
Да представляете есть такой старик Хоттабыч.
Называется IparameterBroker который поставляет значения парметров по запросу для генератора.
И представлете у этого интерфейса один метод, и работает.
IparameterBroker=interface
function GetParamValue(name:string):variant;
property value[name:string]:string read GetParamValue;
end;
А реализатор этого интерфейса форма, которая связывает элементы управления и параметры.
А вы все создавайте вручную параметры с помощью CreateParameter.
Так и делайте дальше.
← →
oxffff © (2007-11-19 23:26) [116]
> sniknik © (19.11.07 22:59) [112]
> > Пример не приведете случаем.
> мог бы. но ты опоздал с этим вопросом, постов на 60...
Ну сюдя по тому, что вы мне пытались доказать что нарушать семантику типа это хорошо, я ничего не потерял.
← →
oxffff © (2007-11-19 23:29) [117]
> property value[name:string]:string read GetParamValue;
> property value[name:string]:variant read GetParamValue;
← →
oxffff © (2007-11-19 23:38) [118]
> и похоже те средства которые для меня свободны для использования
> где угодно у тебя жестко зашиты в код.... выкини этот код.
> нехорошо это.
Что вы все с ног на голову переворачиваете?
О статичном коде писали как раз вы. Неоднократно утвердая, что надо делать только через createParameter и никак иначе.
Повторяю неоднократно.
Таким образом, если вы не полагаетесь на динамический разбор SQL выражения.
А полагатесь на статическое создание параметров. Значит их кто то должен детерменированно определить и не дай бог не определит тех, которые есть в SQL выражении. Вы можете предоставить это делать в run time. Суть от этого не меняется. Если вы делаете createparameter, не полагаясь на динамичский разбор, то задать этот набор нужно детерменированно.
Статическая(compile time) привязка или run time пользователем.
Повторяю именно вы говорили о createparameter
← →
oxffff © (2007-11-19 23:43) [119]
> sniknik © (19.11.07 23:06) [113]
> и вот теперь когда мы мило треплемся, вопрос о "доказательстве
> кодом" у меня уже ассоциируется с "сделай на слабо", а "на
> слабо" я ничего не делаю. из принципа.
А я вот отчетливо вижу, когда вас прижимают к стенке,
вы начинаете давать задний ход.
← →
sniknik © (2007-11-19 23:50) [120]> что надо делать только через createParameter и никак иначе.
де не "никак иначе", а в в случае ошибки, и в других случаях когда ParamCheck отключен. (тебе же помогло отключение? вначале. помню именно после этого предложил этот вариант)
> Повторяю неоднократно.
и еще раз повторюсь. createParameter форевер! :о))
а что до статичности, то функция статичной не бывает, значение, параметры в нее в дизайне, в чем вы меня "обвиняете" попросту не задашь.
-> диагноз. у вас слишком мало знаний при большом самомнении в собственной непогрешимости.
> А я вот отчетливо вижу, когда вас прижимают к стенке,
> вы начинаете давать задний ход.
мне попросту надоело. т.что действительно пока.
впрочем предложение о проверке в программе все еще в силе (хотя и проигнорировано 2 раза)
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2008.04.13;
Скачать: CL | DM;
Память: 0.74 MB
Время: 0.014 c