![]() |
| ||
|
|
Новости |
Поиск |
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 выражение не корректно.
Что это за баг? и Как его обойти
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 более не используй.
Хорошо попробую. Тем более что уже выше рекомендовали.