Конференция "Базы" » 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] тип поля узнается, почему же нельзя значение вытащить?
 
Конференция "Базы" » Ms SQL server через ADO-Native Client простой селект [D7, MSSQL]
Есть новые Нет новых   [134473   +32][b:0][p:0.001]