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

Вниз

Ms SQL server через ADO-Native Client простой селект   Найти похожие ветки 

 
Rule ©   (2009-07-03 10:30) [0]

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

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.


 
sniknik ©   (2009-07-03 10:57) [1]

> Кто выкдывает это поле, нативный клиент или делфевые компоненты ?
похоже, что найтивный клиент, проверил со стандартным (SQLOLEDB.1) с ним поле есть (простое мемо показывает)


 
Anatoly Podgoretsky ©   (2009-07-03 10:59) [2]

> Rule  (03.07.2009 10:30:00)  [0]

У TADOQuery нет такого свойства columnCount


 
Rule ©   (2009-07-03 11:42) [3]


> Anatoly Podgoretsky ©   (03.07.09 10:59) [2]

Анатолий вот прикапываться зачем :-), я смысл хотел изложить а не цитату вызова.


 
Rule ©   (2009-07-03 11:43) [4]


> sniknik ©   (03.07.09 10:57) [1]

хммм вообще странно. Ща тоже попробую.


 
Rule ©   (2009-07-03 12:13) [5]

Мда действительно через (SQLOLEDB.1) все работает а через провайдера NCLI не работает. странно ибо первый работает через второго. В моем случае точно. Странно очень. буду писать в Мелкософт мож они чего скажут.


 
sniknik ©   (2009-07-03 12:25) [6]

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

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

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


 
Rule ©   (2009-07-03 12:39) [7]


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

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


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

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

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

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


 
sniknik ©   (2009-07-03 12:54) [8]

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

вот такой код выполнил на сервере с подключением через 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:56) [9]


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

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


 
Rule ©   (2009-07-03 12:57) [10]

sing CAST:

CAST ( expression AS data_type )

Using CONVERT:

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

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


 
Rule ©   (2009-07-03 13:08) [11]

нет  каст не помог:
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 13:18) [12]

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

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


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

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


 
sniknik ©   (2009-07-03 13:21) [14]

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


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

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


 
Rule ©   (2009-07-03 14:24) [16]


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

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

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

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


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

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

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


 
Rule ©   (2009-07-03 14:31) [18]


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

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


 
sniknik ©   (2009-07-03 14:37) [19]

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


 
Rule ©   (2009-07-03 14:54) [20]

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


 
Rule ©   (2009-07-03 14:56) [21]

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


 
Rule ©   (2009-07-03 14:58) [22]

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


 
sniknik ©   (2009-07-03 15:39) [23]

> 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 16:08) [24]

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


 
Rule ©   (2009-07-03 18:38) [25]

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



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

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

Наверх




Память: 0.54 MB
Время: 0.018 c
3-1246438693
nachi
2009-07-01 12:58
2010.10.17
посчитать сумму параметров дочерних эл-тов_continue


2-1280224684
Кондрат Воронов
2010-07-27 13:58
2010.10.17
Работа с объектами


6-1213619893
Empleado
2008-06-16 16:38
2010.10.17
"Досадные недоразумения логики TClient/ServerSocket"


15-1279315123
Кто б сомневался
2010-07-17 01:18
2010.10.17
PHP - тип поля


2-1279861058
linuxoid
2010-07-23 08:57
2010.10.17
как передать данные массива с основного потока в параллельный?