Конференция "Базы" » Ms SQL server через ADO-Native Client простой селект [D7, MSSQL]
 
  • Rule © (03.07.09 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 © (03.07.09 10:57) [1]
    > Кто выкдывает это поле, нативный клиент или делфевые компоненты ?
    похоже, что найтивный клиент, проверил со стандартным (SQLOLEDB.1) с ним поле есть (простое мемо показывает)
  • Anatoly Podgoretsky © (03.07.09 10:59) [2]
    > Rule  (03.07.2009 10:30:00)  [0]

    У TADOQuery нет такого свойства columnCount
  • Rule © (03.07.09 11:42) [3]

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

    Анатолий вот прикапываться зачем :-), я смысл хотел изложить а не цитату вызова.
  • Rule © (03.07.09 11:43) [4]

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

    хммм вообще странно. Ща тоже попробую.
  • Rule © (03.07.09 12:13) [5]
    Мда действительно через (SQLOLEDB.1) все работает а через провайдера NCLI не работает. странно ибо первый работает через второго. В моем случае точно. Странно очень. буду писать в Мелкософт мож они чего скажут.
  • sniknik © (03.07.09 12:25) [6]
    > ибо первый работает через второго.
    как же он работает через второго, если у меня например его вообще нет? и знаю ставится он только начиная с 2005 версией mssql клиент утилит (на сервере он во всяком случае есть).

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

    > буду писать в Мелкософт мож они чего скажут.
    расскажешь что ответят?
  • Rule © (03.07.09 12:39) [7]

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

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


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

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

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

    Если ответят то принепременно :-)
  • sniknik © (03.07.09 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 © (03.07.09 12:56) [9]

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

    ооо блин понятно.
    Тогда вопрос быстрый а можно ли както привести тип в запросе ?
  • Rule © (03.07.09 12:57) [10]
    sing CAST:

    CAST ( expression AS data_type )

    Using CONVERT:

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

    во нашел :-) ща буду провобать :-)
  • Rule © (03.07.09 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 © (03.07.09 13:18) [12]
    Ан нет. ВРУ. Заработало :-) вышеуказанный запрос работает :-)

    Походу делфи + нативный клиен + XML field type не дружат
    Боюсь если там будут записи больше 8000 символов этот воркэроунт не покатит а к тексту кастить нельзя естественно. Ну лана.
  • Rule © (03.07.09 13:19) [13]
    Спасибо Николай что помог разобраться :-)
  • sniknik © (03.07.09 13:21) [14]
    обязательно видеть поле в гриде?... ну будет там MEMO (вернее XML) отображаться, ну и что?
    а для работы значение можно и через объект забрать.
  • Медвежонок Пятачок © (03.07.09 14:14) [15]
    cross apply на поле xml и вынуть оттуда что надо методами xmltype
  • Rule © (03.07.09 14:24) [16]

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

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

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

    В гриде оно и не нада, а разве я могу вытащить это дело из TADOQuery ?
  • Медвежонок Пятачок © (03.07.09 14:27) [17]
    зачем в виде текста?
    чтобы парсить на клиенте?
    пусть сервер парсит и возвращает все в виде полей датасета.

    кто такой кросс апплай - узнается в букс онлайн. примеры синтаксиса тоже приведены
  • Rule © (03.07.09 14:31) [18]

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

    Я так понимаю это можно через рекордсет сделать ?
  • sniknik © (03.07.09 14:37) [19]
    > а разве я могу вытащить это дело из TADOQuery ?
    а чего нет то? вон в [8] тип поля узнается, почему же нельзя значение вытащить?
  • Rule © (03.07.09 14:54) [20]
    ну вот например вот такая конструкиця ругается типа "Ошибка при выполнении многоступенчатой операции бла бла бла"
    showmessage((ADataSet as TADOQuery).Recordset.Fields[4].Value);
    Как его привести к тексту.
    Я так понимаю это OleVartiant и ему четко нада сказать что он строка. Вот как ?
  • Rule © (03.07.09 14:56) [21]
    будет ли правильным и безопасным явное приведение к строке ? ведь это по сути не совсем строка
  • Rule © (03.07.09 14:58) [22]
    попробовал привести явно таже ошибка:
    ---------------------------
    Debugger Exception Notification
    ---------------------------
    Project raised exception class EOleException with message 'Произошли ошибки во время выполнения многошаговой операции. Проверьте значения всех состояний'. Process stopped. Use Step or Run to continue.
    ---------------------------
    OK   Help  
    ---------------------------
  • sniknik © (03.07.09 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 © (03.07.09 16:08) [24]
    v := ADODataSet1.Recordset.Fields['body'].Value;
    Вот тут валится с той-же ошибкой. Видимо тут проблемма как раз в том что не может он этот OleVariant ни к чему преобразовать :-) вот такая шняга нехорошая
  • Rule © (03.07.09 18:38) [25]
    Ну проблемму вроде решил кастингом к  nvarchar(MAX), по документации размер этого типа данных равен 2^32-1 так что должно влезть.
 
Конференция "Базы" » Ms SQL server через ADO-Native Client простой селект [D7, MSSQL]
Есть новые Нет новых   [134473   +32][b:0.001][p:0.001]