MSSQL2K: Глючит FOR XML AUTO?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

MSSQL2K: Глючит FOR XML AUTO?

Сообщение Ennor » 06.09.2004 (Пн) 12:50

Давненько я вопросов не задавал, и вот босс меня озадачил: имея на входе сиквеловскую выборку, на выходе получать XML со всем этим добром. Все остальное - на мое усмотрение, к счастью (что удивительно, ибо VB в конторе ваще не используется, а других клиентских языков я не знаю). Так вот: при прогоне селекта с добавленным в конце FOR XML AUTO выдается только часть XML-кода, а остальное тупо обрезается по странной границе поля nvarchar(255). То есть смотришь в QA и не понимаешь: открывается тэг - и все, конец записи. Соотв-но, когда ставишь в QA режим сохранения выборки в файл, получившийся XML получается наглухо искореженным, и ни один браузер его по этой причине не воспринимает.
Так вот, это QA так глючит, или сиквел вообще кривит по-черному, когда из него напрямую XML-код тянешь? Там же еще какие-то средства есть, типа "SQL XML Support in IIS"...
В общем, я пока даже не знаю, в какую сторону копать :( . Премного благодарен за помощь.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.09.2004 (Пн) 16:21

Сохранить выборку можно и просто из Recordset-a на клиенте - у него есть метод Save.

Ну а режется, насколько я помню, из-за недопустимых символов в поле. Вроде лечится какими-то установками - за давностью не помню - может кто подскажет - самому интересно вспомнить...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 06.09.2004 (Пн) 18:23

Save, говоришь? А как мне его потом расковыривать, если мне xml-файл нужен?
Насчет обрезки это я уже сам вспомнил - в настройках QA есть такое. Непонятно только, какого хрена эта настройка действует в режиме Save To File. Ну да ладно.
Проблема теперь другая - при получении ADO recordset на клиенте все символы "<>/" оказываются искореженными до неузнаваемости. В результате к чертям летит вся разметка - да вообще все, что в этой выборке было от XML...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 07.09.2004 (Вт) 7:20

Save, говоришь? А как мне его потом расковыривать, если мне xml-файл нужен?


А ты ему укажи что сохраняешь в XML-формате. Посмотри параметры этого метода.

Проблема теперь другая - при получении ADO recordset на клиенте все символы "<>/" оказываются искореженными до неузнаваемости. В результате к чертям летит вся разметка - да вообще все, что в этой выборке было от XML...


Можно просто в тупую заменить эти символы в готовой XML-ке
И тогда все будет выглядеть примерно так как внизу.
Правда в приведенном коде вполне допускалась замена на пробел (для той задачи это было вполне достаточно). А тебе нужно будет заменить на /... Это не столь уж сложно поправить...

Код: Выделить всё
Set oDom = New DOMDocument
r.Save oDom, adPersistXML
RepXML oDom
...
oDom.Save MyXMLFile
...
Private Function RepXML(oDom As DOMDocument)
    Dim s As String, i As Long
    s = oDom.xml
    For i = 1 To Len(s)
        Select Case Asc(Mid$(s, i, 1))
            Case 0 To 8, 11, 12, 14 To 31
                Mid(s, i, 1) = " "
        End Select
    Next i
    oDom.loadXML s
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 07.09.2004 (Вт) 11:15

Всем привет!
У меня нормально отработал следующий пример (в нем используется ADO2.6, и MSXML3.0):

Код: Выделить всё
Dim cnn As Connection
Dim com As Command
Dim str As Stream
Dim sQuery As String
Dim doc As IXMLDOMDocument2

    Set cnn = New Connection
    cnn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=MyDatabase"

    Set com = New Command
    com.ActiveConnection = cnn

    sQuery = "<root><sql:query xmlns:sql='urn:schemas-microsoft-com:xml-sql'>select top 10 * from Files for xml auto</sql:query></root>"

    Set str = New Stream
    str.Open
    str.WriteText sQuery, adWriteChar
    str.Position = 0

    Set com.CommandStream = str
    com.Dialect = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"

    Set doc = New DOMDocument30
    com.Properties("Output Stream") = doc
    com.Execute , , adExecuteStream

    str.Close

    doc.Save "e:\test2k.xml"

Инфу по загадочному GUID'у смотрите тут
http://msdn.microsoft.com/library/defau ... 3_2u2c.asp
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 07.09.2004 (Вт) 11:20

О! Что-то типа этого и было когда занимался этим!!!
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.09.2004 (Вт) 11:44

Пример здорово похож на то, что я видел в MSDN. Правда, там это было на ASP, кажется.
Короче, разобрался я с этим - www.sql.ru помог, как всегда :) . Дело было в том, что изначально юникодовый провайдер SQLOLEDB приводит к какой-то хитрой внутренней конвертации данных (причем даже непонятно, на какой именно стадии), в результате чего тип поля в рекордсете получается adLongVarBinary, а внутри сидит явно юникодовая строка, но! - символы "<>/" превращаются в непоймичтоващетакое. Как только я последовал совету одного товарища и перевел коннект на ODBC (который внутри все-таки ASCII-шный), тип поля сменился на adLongVarWChar и еще через полтора часа все встало на свои места. Вот такое шаманство, блин...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 07.09.2004 (Вт) 11:51

ODBC не есть хорошо - лучше попробуй как Rainbow прописал...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.09.2004 (Вт) 12:01

Andrey Fedorov писал(а):ODBC не есть хорошо - лучше попробуй как Rainbow прописал...

Знаешь, по скорости я разницы не вижу. Даже, кажется, ODBC чуть быстрее. А если учесть, что с XML/DOM я ваще никогда не сталкивался, и разбираться мне с этим ого-го сколько... Работает, и то хорошо.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 07.09.2004 (Вт) 18:41

А вот и ответ на загадку, собсно:

alexeyvg на www.sql.ru писал(а):Просто при использовании OLEDB данные из select ... for xml передаются не в виде простых текстовых строк, а в виде специального формата, пригодного для всяких xml-ных расширений OLEDB. А в ODBC - обычный текст, пусть и юникодный.


No comments...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.09.2004 (Ср) 8:41

Может имелся ввиду формат UTF-8?
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.09.2004 (Ср) 16:15

Нет, там именно какой-то свой собственный, с доп. символами в начале строк. Все остальное по большей части нормально, но вот этот заголовок убивает все. А писать собсный парсер, не зная, формата, да еще если через ODBC все уже работает... :)
Не исключено, конечно, что тем же адошным стримом он бы его нормально всосал, но сделать нужно было быстро.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList  
cron