Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Пробемы с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.071 c
2-1274121959
Semen
2010-05-17 22:45
2010.08.27
Объединение 3-х полей таблицы Paradox в одно.


2-1273602560
novichek
2010-05-11 22:29
2010.08.27
TCPClient вторая посылка не проходит


11-1195764794
tigra
2007-11-22 23:53
2010.08.27
kol-synapse


15-1264632229
Германн
2010-01-28 01:43
2010.08.27
RDTSC и её использование в VB 2008 Express Edition


6-1216658120
evil_mike
2008-07-21 20:35
2010.08.27
tclientsocket без компонента на форме..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский