![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ms SQL server через ADO-Native Client простой селект [D7, MSSQL]
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 клиент утилит (на сервере он во всяком случае есть).
> В моем случае точно.
ну, судя по тому, что и у тебя стандартный сработал, то не так уж и точно...
> буду писать в Мелкософт мож они чего скажут.
расскажешь что ответят?