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 выражение не корректно.

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


Anatoly Podgoretsky   (2007-11-19 11:11:00) [121]

Ты попробовал запретить ParamCheck? Ведь надо сокращать пути поиска проблемы.
Во всяком случае это проблема не АДО, а ниже


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


> Johnmen ©   (19.11.07 11:08) [24]


Это то я понимаю. :)
Куда написать, чтобы поправили?


oxffff   (2007-11-19 11:09:00) [123]


> Johnmen ©   (19.11.07 11:07) [23]


Provider=SQLOLEDB.1;


oxffff   (2007-11-19 11:09:00) [124]


> Johnmen ©   (19.11.07 11:07) [23]


Provider=SQLOLEDB.1;


Johnmen   (2007-11-19 11:08:00) [125]


> oxffff ©   (19.11.07 11:06) [22]
> Валится на  вызове  метода Prepare интерфейса ICommandPrepare

Что и говорит о кривом анализаторе(разборщике).


Johnmen   (2007-11-19 11:07:00) [126]


> это не глюк ADO, это глюк провайдера,

Т.е. глюк OLEDB драйвера?
Пусть так. Всё равно белкин виноват...:)
Кстати, какой провайдер у автора пока не ясно.


oxffff   (2007-11-19 11:06:00) [127]

Валится на  вызове  метода Prepare интерфейса ICommandPrepare


oxffff   (2007-11-19 11:03:00) [128]


> Anatoly Podgoretsky ©   (19.11.07 10:41) [13]


Валится на

{ Retrieve additional parameter info from the server if supported }
Parameters.InternalRefresh;


sniknik   (2007-11-19 11:01:00) [129]

> Есть такой баг в АДО. Если параметр(ы) "запрятаны" глубоко в конструкции SQL выражения.
> Анализатор не справляется с разбором из-за существующей "вложенности".
это не глюк ADO, это глюк провайдера, т.к. на разбор выражение предоставляется ему. (и изза чего был таки "глюк ADO",  а вернее TADOQuery, в первых версиях, ошибка добавления в d Add части выражения...)

если бы разбор действительно делал ADO как бы он вообще справился с такой массой различных синтаксисов?


oxffff   (2007-11-19 10:57:00) [130]


> Johnmen ©   (19.11.07 10:53) [17]


Здесь параметр во внешнем запросе.
Во внутренних подзапросах его нет.

:)

Может и такой баг тоже есть? :)


oxffff   (2007-11-19 10:55:00) [131]


> ЮЮ ©   (19.11.07 10:41) [14]


Проверял в SQL Server Managament Studio 2005.
Сервер MSSQL 2005 standart Edition.

Все поля в .....

Аналог

(select count(*) from SourceTrains B join SourceVagons C
 on  B.TrainID=C.TrainID
 where convert(char(10),B.Traindate,2)=A.value
) as 'Total',

Я выше упомянул о том, что если количество полей небольшое, то ошибки нет. А если все поля (которые мне нужны), то валится Exception.

В данном запросе один параметр.

Delphi 7.


Johnmen   (2007-11-19 10:53:00) [132]


> oxffff ©

Есть такой баг в АДО. Если параметр(ы) "запрятаны" глубоко в конструкции SQL выражения. Анализатор не справляется с разбором из-за существующей "вложенности".


ЮЮ   (2007-11-19 10:47:00) [133]

>
> А Делфи какая?


Заодно: А БД какая?


Sergey13   (2007-11-19 10:42:00) [134]

> [10] oxffff ©   (19.11.07 10:26)

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


Anatoly Podgoretsky   (2007-11-19 10:41:00) [135]


> a.CommandText:= Это SQL выражение

Вот это уже странно, и это видимо глюк (может немного порушена) в системе. Не должно это вызывать исключения.
Попробуй отладить по шагам
procedure TADOCommand.AssignCommandText(const Value: WideString; Loading: Boolean);

 procedure InitParameters;
 var
   I: Integer;
   List: TParameters;
   NativeCommand: string;
 begin
   List := TParameters.Create(Self, TParameter);
   try
     NativeCommand := List.ParseSQL(Value, True);
     { Preserve existing values }
     List.AssignValues(Parameters);
     CommandObject.CommandText := NativeCommand;
     if not Loading and (Assigned(Connection) or (ConnectionString <> '')) then
     begin
       try
         SetConnectionFlag(cfParameters, True);
         try
           { Retrieve additional parameter info from the server if supported }
           Parameters.InternalRefresh;
           { Use additional parameter info from server to initialize our list }
           if Parameters.Count = List.Count then
             for I := 0 to List.Count - 1 do
             begin
               List[I].DataType := Parameters[I].DataType;
               List[I].Size := Parameters[I].Size;
               List[I].NumericScale := Parameters[I].NumericScale;
               List[I].Precision := Parameters[I].Precision;
               List[I].Direction := Parameters[I].Direction;
               List[I].Attributes := Parameters[I].Attributes;
             end
         finally
           SetConnectionFlag(cfParameters, False);
         end;
       except
         { Ignore error if server cannot provide parameter info }
       end;
       if List.Count > 0 then
         Parameters.Assign(List);
     end;
   finally
     List.Free;
   end;
 end;

begin
 if (CommandType = cmdText) and (Value <> '') and ParamCheck then
   InitParameters
 else
 begin
   CommandObject.CommandText := Value;
   if not Loading then Parameters.Clear;
 end;
end;

Для начала отключи это

> ParamCheck


ЮЮ   (2007-11-19 10:41:00) [136]

> a.CommandText:= Это SQL выражение
>
> Exception в msvcrt.dll


> BeginUpdate is called automatically by any property or method
> that changes the list of strings.


Это если бы ты менял сво-во SQL. А ты его не меняешь, а вызываешь методы, его изменяющие. Даже, если SQL.Add автоматически и вызовет BeginUpdate, то так же автоматически вызовет и EndUpdate, что позволит приступить к анвлизу незавершенного текста запрома.  
Тогда и дальше прочти:

Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete.


> Запрос работоспособный.

Где проверял?


> Ошибка появляется при анализе параметров.

А кто-бы сомневался? А кроме единственного упоминания :param1 есть ещё параметры


>  ..............
>   from

А может ошибка в ......... ? Закомментируй для начала все поля кроме value /*  */ и добавляй постепенно


oxffff   (2007-11-19 10:40:00) [137]


> Anatoly Podgoretsky ©   (19.11.07 10:32) [11]


Однако не помогло.


Anatoly Podgoretsky   (2007-11-19 10:32:00) [138]


> Хорошо попробую. Тем более что уже выше рекомендовали.

У некоторых уже мозоли на языке.


oxffff   (2007-11-19 10:26:00) [139]


> Anatoly Podgoretsky ©   (19.11.07 10:16) [8]


> Kolan ©   (19.11.07 10:07) [2]


Результат тот же

var a:TADODataSet;
begin
a:=TADODataSet.Create(nil);
a.Connection:=ADOConnection;
a.CommandText:= Это SQL выражение

Exception в msvcrt.dll


oxffff   (2007-11-19 10:22:00) [140]


> Sergey13 ©   (19.11.07 10:16) [7]


Запрос работоспособный.
Ошибка появляется при анализе параметров.


> Anatoly Podgoretsky ©   (19.11.07 10:16) [8]
>
> > AdoQuery.SQL.add(Это SQL выражение )
> > вызывает исключение в msvcrt.dll
>
> Это строка, которая вызывает исключение? По крайней мере
> так выходит из контекста.
> Брось ты этот костыль AdoQuery и никогда ничего кроме TAdoDataset
> и TAdoCommand более не используй.


Хорошо попробую. Тем более что уже выше рекомендовали.


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

Наверх

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