Форум: "Базы";
Текущий архив: 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.1ADODataSet1.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.52 MB
Время: 0.003 c