-
Добрый день господа.
Вот может кто знает в чем дело, делаю небольшой запросик:
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.
-
> Кто выкдывает это поле, нативный клиент или делфевые компоненты ?
похоже, что найтивный клиент, проверил со стандартным (SQLOLEDB.1) с ним поле есть (простое мемо показывает)
-
> Rule (03.07.2009 10:30:00) [0]
У TADOQuery нет такого свойства columnCount
-
> Anatoly Podgoretsky © (03.07.09 10:59) [2]
Анатолий вот прикапываться зачем :-), я смысл хотел изложить а не цитату вызова.
-
> sniknik © (03.07.09 10:57) [1]
хммм вообще странно. Ща тоже попробую.
-
Мда действительно через (SQLOLEDB.1) все работает а через провайдера NCLI не работает. странно ибо первый работает через второго. В моем случае точно. Странно очень. буду писать в Мелкософт мож они чего скажут.
-
> ибо первый работает через второго.
как же он работает через второго, если у меня например его вообще нет? и знаю ставится он только начиная с 2005 версией mssql клиент утилит (на сервере он во всяком случае есть).
> В моем случае точно.
ну, судя по тому, что и у тебя стандартный сработал, то не так уж и точно...
> буду писать в Мелкософт мож они чего скажут.
расскажешь что ответят?
-
> sniknik © (03.07.09 12:25) [6]
При установке нативного клиента он у меня спрашивал типа подменить OLEDB собой или нет. Я сказал подменить так что вроде у меня OLEDB провайдер это прослойка. Хотя уже сомневаюсь.
> ну, судя по тому, что и у тебя стандартный сработал, то
> не так уж и точно...
Мда это я тоже уже сомневаюсь ... раньше был уверен :-)
> расскажешь что ответят?
Если ответят то принепременно :-)
-
> Если ответят то принепременно :-)
еже лишнее, мелкософт не при чем, разве что коственно...
вот такой код выполнил на сервере с подключением через SQLNCLI.1
ADODataSet1.Open;
ShowMessage(IntToStr(ADODataSet1.Fields.Count));
ShowMessage(IntToStr(ADODataSet1.Recordset.Fields.Count));
ShowMessage(IntToStr(ADODataSet1.Recordset.Fields[4].Type_));
результат в общем то самоочевиден.
SQLNCLI дает этому полю другой, не распознаваемый дельфей тип. и вся загадка...
-
> sniknik © (03.07.09 12:54) [8]
ооо блин понятно.
Тогда вопрос быстрый а можно ли както привести тип в запросе ?
-
sing CAST:
CAST ( expression AS data_type )
Using CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
во нашел :-) ща буду провобать :-)
-
нет каст не помог:
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'
по прежнему ничего
-
Ан нет. ВРУ. Заработало :-) вышеуказанный запрос работает :-)
Походу делфи + нативный клиен + XML field type не дружат
Боюсь если там будут записи больше 8000 символов этот воркэроунт не покатит а к тексту кастить нельзя естественно. Ну лана.
-
Спасибо Николай что помог разобраться :-)
-
обязательно видеть поле в гриде?... ну будет там MEMO (вернее XML) отображаться, ну и что?
а для работы значение можно и через объект забрать.
-
cross apply на поле xml и вынуть оттуда что надо методами xmltype
-
> Медвежонок Пятачок © (03.07.09 14:14) [15]
а вот тут поподробнее. кто такой "cross apply" и что значить вынуть что нада ? мне нада все в виде текста.
> sniknik © (03.07.09 13:21) [14]
В гриде оно и не нада, а разве я могу вытащить это дело из TADOQuery ?
-
зачем в виде текста?
чтобы парсить на клиенте?
пусть сервер парсит и возвращает все в виде полей датасета.
кто такой кросс апплай - узнается в букс онлайн. примеры синтаксиса тоже приведены
-
> sniknik © (03.07.09 13:21) [14]
Я так понимаю это можно через рекордсет сделать ?
-
> а разве я могу вытащить это дело из TADOQuery ?
а чего нет то? вон в [8] тип поля узнается, почему же нельзя значение вытащить?
-
ну вот например вот такая конструкиця ругается типа "Ошибка при выполнении многоступенчатой операции бла бла бла"
showmessage((ADataSet as TADOQuery).Recordset.Fields[4].Value);
Как его привести к тексту.
Я так понимаю это OleVartiant и ему четко нада сказать что он строка. Вот как ?
-
будет ли правильным и безопасным явное приведение к строке ? ведь это по сути не совсем строка
-
попробовал привести явно таже ошибка:
---------------------------
Debugger Exception Notification
---------------------------
Project raised exception class EOleException with message 'Произошли ошибки во время выполнения многошаговой операции. Проверьте значения всех состояний'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
-
> 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);
-
v := ADODataSet1.Recordset.Fields['body'].Value;
Вот тут валится с той-же ошибкой. Видимо тут проблемма как раз в том что не может он этот OleVariant ни к чему преобразовать :-) вот такая шняга нехорошая
-
Ну проблемму вроде решил кастингом к nvarchar(MAX), по документации размер этого типа данных равен 2^32-1 так что должно влезть.