Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Пробемы с ADO   Найти похожие ветки 

 
DmitryG.   (2009-02-19 22:28) [0]

При установке запроса вида (запрос к MSSQL 2005):

select top 100 A.IDAdress, A.ADDRESS,
first = (select top 1 I.ID from SLID I where I.TypeID = "A" and A.IDAdress = I.IDAdress),
second = (select top 1 I.ID from SLID I where I.TypeID = "B" and A.IDAdress = I.IDAdress),
A.IDOS, A.IDTIP, A.IDDown, D.NMDown
from SLAdress A WITH (NOLOCK)
left join SLDown D WITH (NOLOCK) on A.IDDown = D.IDDown
left join SLTYPE T WITH (NOLOCK) on T.IDTIP = A.IDTIP
left join SLOS O WITH (NOLOCK) on A.IDOS = O.IDOS where A.IDOS = :IDOS;

выводит следующую ошибку (причем, на SQL запросы, в которых ОДНОВРЕМЕННО присутствуют ПОДЗАПРОСЫ И ПАРАМЕТРЫ)
Текст ошибки:
Debug Exception Notification :
Project ADO.exe raised exception class EAccessViolation with message "Access violation at address 77C3809E in module "msvcrt.dll". Write of address 00C9D000".
Debug Exception Notification :
Project ADO.exe raised exception classEOLeException massage "Неправильно определен объект Parameter. Представлены несовместимые или неполные сведения".
ADO ERROR:
"Неправильно определен объект Parameter. Представлены несовместимые или неполные сведения".

Делаю так:

var
 Query   : TADOQuery;
 Request : string;
begin
 Query := TADOQuery.Create(nil);
 Query.ConnectionString := "Provider=SQLOLEDB.1; Initial Catalog = Base; Data Source =SERVER ; User ID = User;"+ "Password=";

 Request := "select top 100 A.IDAdress, A.ADDRESS, "+
"first = (select top 1 I.ID from SLID I where I.TypeID = "A" and A.IDAdress = I.IDAdress),"+
"second = (select top 1 I.ID from SLID I where I.TypeID = "B" and A.IDAdress = I.IDAdress),"+
" A.IDOS, A.IDTIP, A.IDDown, D.NMDown "+
" from SLAdress A WITH (NOLOCK) "+
 "left join SLDown D WITH (NOLOCK) on A.IDDown = D.IDDown "+
"left join SLTYPE T WITH (NOLOCK) on T.IDTIP = A.IDTIP "+
" left join SLOS O WITH (NOLOCK) on A.IDOS = O.IDOS where A.IDOS = :IDOS";

 Query.SQL.Text := Request ; // ПРИ ВЫПОЛНЕНИИ КОМАНДЫ ВЫВОДИТ ОШИБКУ!!!
 Query.Open;
end;


Скачал обновление к ADO - то же самое, только сообщение об ошибке стало на русском :-)


 
Медвежонок Пятачок ©   (2009-02-19 22:33) [1]

ну а где код инициализации параметра?


 
sniknik ©   (2009-02-19 22:39) [2]

> "Неправильно определен объект Parameter. Представлены несовместимые или неполные сведения".
где параметр то?


 
Johnmen ©   (2009-02-19 22:41) [3]

это даже не скомпилируется.


 
DmitriyG. ©   (2009-02-20 22:20) [4]

Скомпилируется, еще как...
Единственное, что забыл эту строчку :-)
Query.DataSource := SomDataSource;

Просто если в запросе нет параметра, или убрать строчки с подзапросом, то все нормально!!!


 
DmitriyG. ©   (2009-02-20 22:21) [5]

Просто точно такой же код для BDE работает очень даже отлично!!!


 
Johnmen ©   (2009-02-20 22:40) [6]

А я говорю, не скомпилируется.


 
Медвежонок Пятачок ©   (2009-02-20 22:48) [7]

Просто если в запросе нет параметра, или убрать строчки с подзапросом, то все нормально!!!

ну дык убери


 
ЮЮ ©   (2009-02-24 11:24) [8]


> Query.SQL.Text := Request ; // ПРИ ВЫПОЛНЕНИИ КОМАНДЫ ВЫВОДИТ
> ОШИБКУ!!!

При определении текста запроса или при поgытке выполнить запрос с неопределенным параметром?

Если второе, то где

Query.Parameters[0].As... := ...

>  Query.Open;


 
Ega23 ©   (2009-02-24 11:46) [9]


> Просто точно такой же код для BDE работает очень даже отлично!
> !!


и под BDE не сработает. Сработает, если только немножко "похимичить".
С другой стороны, если немножко "похимичить" - сработает и для ADO.

З.Ы.
Если уж создаёшь TQuery в ран-тайм - будь любезен её потом убить.


 
KSergey ©   (2009-02-24 13:02) [10]

> " left join SLOS O WITH (NOLOCK) on A.IDOS = O.IDOS where A.IDOS = :IDOS";

вот он параметр, надо с ним чего-нибудь делать.


 
девушка   (2009-02-25 09:23) [11]


> > " left join SLOS O WITH (NOLOCK) on A.IDOS = O.IDOS where
> A.IDOS = :IDOS";
>
> вот он параметр, надо с ним чего-нибудь делать.


Я бы для начала попробовала переназвать параметр, чтобы его название не совпадало ни с каким из выбираемых полей... типа :idos_my_tmp
иногда при "странных глюках" может помочь


 
Anatoly Podgoretsky ©   (2009-02-25 10:13) [12]

> девушка  (25.02.2009 9:23:11)  [11]

Это глупый совет, надо наоборот, что бы совпадал, как в приведеном коде


 
DmitryG.   (2009-03-11 20:56) [13]

Забыл в письме, почему-то указать DataSource, хотя реально в программе есть.... DataSource подключен к Query у которого есть поле IDOS
Все таки на мой взгляд - явный глюк ADO. Может подскажите как исправить?

Еще раз измененный код

var
Query   : TADOQuery;
Request : string;
begin
Query := TADOQuery.Create(nil);
try
  Query.ConnectionString := "Provider=SQLOLEDB.1; Initial Catalog = Base; Data   Source =SERVER ; User ID = User;"+ "Password=";

  Request := "select top 100 A.IDAdress, A.ADDRESS, "+
 "first = (select top 1 I.ID from SLID I where I.TypeID = "A" and A.IDAdress =   I.IDAdress),"+
 "second = (select top 1 I.ID from SLID I where I.TypeID = "B" and A.IDAdress =   I.IDAdress),"+
 " A.IDOS, A.IDTIP, A.IDDown, D.NMDown "+
 " from SLAdress A WITH (NOLOCK) "+
  "left join SLDown D WITH (NOLOCK) on A.IDDown = D.IDDown "+
 "left join SLTYPE T WITH (NOLOCK) on T.IDTIP = A.IDTIP "+
 " left join SLOS O WITH (NOLOCK) on A.IDOS = O.IDOS where A.IDOS = :IDOS";
 
  Query.Datasource := DataSource1;
  Query.SQL.Text := Request ;
  Query.Open;
finally
  Query.Free;
end;
end;


 
ЮЮ ©   (2009-03-12 03:50) [14]


> DataSource подключен к Query у которого есть поле IDOS


по тексту запроса или добавлено в список полей? Кажется второе решает проблему (ух как давно это было :), ибо не факт, что DataSource1.DataSet открыт  и есть где взять информацию о поле  IDOS


 
DmitryG.   (2009-03-12 10:45) [15]

Все открыто и все работает, только если из текста запроса убрать  поля first и second. А через BDE все работает и ними!!!


 
ЮЮ ©   (2009-03-12 11:03) [16]


> только если из текста запроса убрать  поля first и second


какой-то синтаксис для "полей" first и second прикольный. И это работает?
А если попроще и попривычней:

select top 100 A.IDAdress, A.ADDRESS,
(select top 1 I.ID from SLID I where I.TypeID = "A" and A.IDAdress =   I.IDAdress) as first,
(select top 1 I.ID from SLID I where I.TypeID = "B" and A.IDAdress =   I.IDAdress) as second,
A.IDOS, A.IDTIP, A.IDDown, D.NMDown

А если вообще использовать подзапросы правильно, т.е. не в списке полей, а в качестве "таблиц"?

from
 SLAdress A
 left join SLDown D on A.IDDown = D.IDDown
 left join SLTYPE T on T.IDTIP = A.IDTIP
 left join SLOS O on A.IDOS = O.IDOS
 LEFT JOIN (
   select IDAdress, MIN(ID) as First from SLID where TypeID = "A"  GROUP BY IDAdress
 ) f ON A.IDAdress = f.IDAdress
 LEFT JOIN (
   select IDAdress, MIN(ID) as Second from SLID where TypeID = "B"  GROUP BY IDAdress
 ) s ON A.IDAdress = s.IDAdress
where A.IDOS = :IDOS


 
DmitryG.   (2009-03-18 23:29) [17]

>какой-то синтаксис для "полей" first и second прикольный. И это работает?
Работает кончено (если не ошибаюсь, то практически полный аналог as first...)

А поводу приведенного Вами подзапроса, есть одна неувязка - мне именно нужно вывести значения полей first и second в качестве полей.... Так что Left Join тут не поможет :-(


 
sniknik ©   (2009-03-18 23:41) [18]

ужас... месяц прошёл, а до автора так и не дошло что параметры нужно заполнять(/инициализировать), хотя это ему в ошибке практически прямым текстом было объявлено...

с работы не уволили? жаль.


 
ЮЮ ©   (2009-03-19 03:42) [19]


> мне именно нужно вывести значения полей first и second в
> качестве полей.... Так что Left Join тут не поможет :-(


Cтранный вывод.

Left Join это не UNION. Никто не мешает включать в выборку поля из присоединенных таблиц/подзапросов. Более того, именно для этого соединение обычно и делается


 
DmitryG.   (2009-03-25 20:47) [20]

> Cтранный вывод.
Мда, что-то я конечно же стормозил - спасибо...
ADO такой запрос воспринимает нормально... Хотя что ему в первоначальном не нравилось так и остается загадкой :-)


 
имя   (2009-03-27 13:58) [21]

Удалено модератором


 
имя   (2009-03-27 13:58) [22]

Удалено модератором



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.296 c
2-1265790561
fford
2010-02-10 11:29
2010.08.27
spliter переносится за панель


2-1269823057
Вася
2010-03-29 04:37
2010.08.27
Свой обработчик для динамически созданного компонента


15-1265308439
Leonid Troyanovsky
2010-02-04 21:33
2010.08.27
Джо Вономасса & Томми Эммануэль, гитара (Австралия)


15-1262219675
Petr V. Abramov
2009-12-31 03:34
2010.08.27
закрывается Игналинская АЭС


2-1272104034
Kukulkan
2010-04-24 14:13
2010.08.27
Изменение TGoupBox!