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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.004 c
2-1280122674
12
2010-07-26 09:37
2010.10.17
Как повторить завершенный DragAndDrop?


3-1246433519
nachi
2009-07-01 11:31
2010.10.17
посчитать сумму параметров дочерних эл-тов


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


15-1279266552
Cerberus
2010-07-16 11:49
2010.10.17
Помогите разобраться с мат. частью.


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский