Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ms SQL server через ADO-Native Client простой селект [D7, MSSQL]


Страницы:   1 2

Rule ©   (2009-07-03 10:30:00) 

Добрый день господа.
Вот может кто знает в чем дело, делаю небольшой запросик:

select a.xml_collection_id,                                
                                   a.name,                                                
                                   a.schema_id,                                            
                                   a.principal_id,                                        
                                   (select xml_schema_namespace(N''Person'',N''AdditionalContactInfoSchemaCollection'')) body
                               from [sys].[xml_schema_collections] a where name != N''sys''  

запросик выполняю через TADOQuery.
так вот в датасете в итоге нет пятой колонки и Dataset.columnCount равен четырем.
пробовал сделать и так:

select a.xml_collection_id,                                
                                   a.name,                                                
                                   a.schema_id,                                            
                                   a.principal_id,                                        
xml_schema_namespace(N''Person'',N''AdditionalContactInfoSchemaCollection''),
xml_schema_namespace(N''Person'',N''AdditionalContactInfoSchemaCollection'')
                               from [sys].[xml_schema_collections] a where name != N''sys''  
А полей все равно 4!!!!
Пробовал на 2005 и 2008 версиях.
И что самое интересное что если я выполняю этот запрос в менджмент студии стандартной от майкрософта то все отлично.
Также работает в EMS database Managere и  Maestro for MSSQL

где засада ? Кто выкдывает это поле, нативный клиент или делфевые компоненты ?
Да забыл сказать использую я делфи 7.


Rule   (2009-07-03 18:38:00) [1]

Ну проблемму вроде решил кастингом к  nvarchar(MAX), по документации размер этого типа данных равен 2^32-1 так что должно влезть.


Rule   (2009-07-03 16:08:00) [2]

v := ADODataSet1.Recordset.Fields['body'].Value;
Вот тут валится с той-же ошибкой. Видимо тут проблемма как раз в том что не может он этот OleVariant ни к чему преобразовать :-) вот такая шняга нехорошая


sniknik   (2009-07-03 15:39:00) [3]

> showmessage((ADataSet as TADOQuery).Recordset.Fields[4].Value);
> ему четко нада сказать что он строка. Вот как ?
попробуй так (типа xml в вариантах тоже нет, а значит автопреобразование тоже не сработает, но по сути то это тот же текст), без гарантий, но ...
var
 v: variant;
begin
 ADODataSet1.Open;
 v:= ADODataSet1.Recordset.Fields['body'].Value;
 FindVarData(v).VType:= varString;
 ShowMessage(v);


Rule   (2009-07-03 14:58:00) [4]

попробовал привести явно таже ошибка:
---------------------------
Debugger Exception Notification
---------------------------
Project raised exception class EOleException with message 'Произошли ошибки во время выполнения многошаговой операции. Проверьте значения всех состояний'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------


Rule   (2009-07-03 14:56:00) [5]

будет ли правильным и безопасным явное приведение к строке ? ведь это по сути не совсем строка


Rule   (2009-07-03 14:54:00) [6]

ну вот например вот такая конструкиця ругается типа "Ошибка при выполнении многоступенчатой операции бла бла бла"
showmessage((ADataSet as TADOQuery).Recordset.Fields[4].Value);
Как его привести к тексту.
Я так понимаю это OleVartiant и ему четко нада сказать что он строка. Вот как ?


sniknik   (2009-07-03 14:37:00) [7]

> а разве я могу вытащить это дело из TADOQuery ?
а чего нет то? вон в [8] тип поля узнается, почему же нельзя значение вытащить?


Rule   (2009-07-03 14:31:00) [8]


> sniknik ©   (03.07.09 13:21) [14]

Я так понимаю это можно через рекордсет сделать ?


Медвежонок Пятачок   (2009-07-03 14:27:00) [9]

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

кто такой кросс апплай - узнается в букс онлайн. примеры синтаксиса тоже приведены


Rule   (2009-07-03 14:24:00) [10]


> Медвежонок Пятачок ©   (03.07.09 14:14) [15]

а вот тут поподробнее. кто такой "cross apply" и что значить вынуть что нада ? мне нада все в виде текста.

> sniknik ©   (03.07.09 13:21) [14]

В гриде оно и не нада, а разве я могу вытащить это дело из TADOQuery ?


Медвежонок Пятачок   (2009-07-03 14:14:00) [11]

cross apply на поле xml и вынуть оттуда что надо методами xmltype


sniknik   (2009-07-03 13:21:00) [12]

обязательно видеть поле в гриде?... ну будет там MEMO (вернее XML) отображаться, ну и что?
а для работы значение можно и через объект забрать.


Rule   (2009-07-03 13:19:00) [13]

Спасибо Николай что помог разобраться :-)


Rule   (2009-07-03 13:18:00) [14]

Ан нет. ВРУ. Заработало :-) вышеуказанный запрос работает :-)

Походу делфи + нативный клиен + XML field type не дружат
Боюсь если там будут записи больше 8000 символов этот воркэроунт не покатит а к тексту кастить нельзя естественно. Ну лана.


Rule   (2009-07-03 13:08:00) [15]

нет  каст не помог:
select a.xml_collection_id,                                    
      a.name,                                                    
      a.schema_id,                                                
      a.principal_id,                    
      CAST(xml_schema_namespace(SCHEMA_NAME(a.schema_id),a.name) as varchar(8000)) body
      from
      [AdventureWorks].[sys].[xml_schema_collections] a where name != N'sys'    

по прежнему ничего


Rule   (2009-07-03 12:57:00) [16]

sing CAST:

CAST ( expression AS data_type )

Using CONVERT:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

во нашел :-) ща буду провобать :-)


Rule   (2009-07-03 12:56:00) [17]


> sniknik ©   (03.07.09 12:54) [8]

ооо блин понятно.
Тогда вопрос быстрый а можно ли както привести тип в запросе ?


sniknik   (2009-07-03 12:54:00) [18]

> Если ответят то принепременно :-)
еже лишнее, мелкософт не при чем, разве что коственно...

вот такой код выполнил на сервере с подключением через SQLNCLI.1
 ADODataSet1.Open;
 ShowMessage(IntToStr(ADODataSet1.Fields.Count));
 ShowMessage(IntToStr(ADODataSet1.Recordset.Fields.Count));
 ShowMessage(IntToStr(ADODataSet1.Recordset.Fields[4].Type_));

результат в общем то самоочевиден.
SQLNCLI дает этому полю другой, не распознаваемый дельфей тип. и вся загадка...


Rule   (2009-07-03 12:39:00) [19]


> sniknik ©   (03.07.09 12:25) [6]

При установке нативного клиента он у меня спрашивал типа подменить OLEDB собой или нет. Я сказал подменить так что вроде у меня OLEDB провайдер это прослойка. Хотя уже сомневаюсь.


> ну, судя по тому, что и у тебя стандартный сработал, то
> не так уж и точно...

Мда это я тоже уже сомневаюсь ... раньше был уверен :-)

> расскажешь что ответят?

Если ответят то принепременно :-)


sniknik   (2009-07-03 12:25:00) [20]

> ибо первый работает через второго.
как же он работает через второго, если у меня например его вообще нет? и знаю ставится он только начиная с 2005 версией mssql клиент утилит (на сервере он во всяком случае есть).

> В моем случае точно.
ну, судя по тому, что и у тебя стандартный сработал, то не так уж и точно...

> буду писать в Мелкософт мож они чего скажут.
расскажешь что ответят?


Страницы:   1 2

Наверх

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