Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как сохранить xml-текст в поле типа XML или NTEXT в кодировке UTF-8 с помощью ADO 2.8?  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72914
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64) Windows NT 6.0 <X64> (Build 6002: Service Pack 2)

На IIS из html-формы приходит xml-файл в utf-8, содержащий процессинговую инструкцию (ПИ) <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>, его нужно записать в базу без обращения к файловой системе, поэтому bcp, openrowset и SQLXMLBulkLoad не подходят.

Запись текста в ADODB.Recordset в поле типа XML не удается, в одном случае "произошли ошибки при выполнении многошаговой операции" (со значением этого поля вообще невозможно работать, а рекордсет с таким полем — сохранить на диск), в другом "не удается сменить кодировку" (это было под другим сервером, MSSQL2005).

Запись в ntext удается, но не удается sp_xml_preparedocument, завершается с той же ошибкой про кодировку:
declare @XMLDoc xml, @iDoc int

--[Data] [ntext]
select top 1 @XMLDoc = Data from tblTest 

EXECUTE sp_xml_preparedocument @iDoc OUTPUT,  @XMLDoc , '<ns1:root xmlns:ns1="http://tempuri.org"/>'
EXECUTE sp_xml_removedocument @iDoc

/*
Сообщение 9402, уровень 16, состояние 1, строка 7
Синтаксический анализ XML: строка 1, символ 56 [i](это ?[u]>[/u])[/i], невозможно переключить кодировку
*/
Если вырезать ПИ, то sp_xml_preparedocument срабатывает, но считает, что текст в кодировке windows-1251.

При этом openrowset загоняет файл с ПИ в xml-поле корректно и без вопросов.
28 мар 11, 15:08    [10434047]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить xml-текст в поле типа XML или NTEXT в кодировке UTF-8 с помощью ADO 2.8?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Antonariy
Если вырезать ПИ, то sp_xml_preparedocument срабатывает, но считает, что текст в кодировке windows-1251.
Не поняв. Это как?

Врёте вы всё. sp_xml_preparedocument из NTEXT считывает всё правильно.

KO
UTF-8 это кодировка передачи HTTP данных IISу, естественно в скуле кодировка строк своя, как и в любой другой среде (.Net ...)
Процессинговая инструкция <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> должна обрабатываться (вырезаться) транспортным протоколом и не должна доходить до "потребителя".
28 мар 11, 18:06    [10435349]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить xml-текст в поле типа XML или NTEXT в кодировке UTF-8 с помощью ADO 2.8?  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72914
Пруфпик (поле Data1 имеет тип ntext):

К сообщению приложен файл. Размер - 38Kb
29 мар 11, 11:30    [10437653]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить xml-текст в поле типа XML или NTEXT в кодировке UTF-8 с помощью ADO 2.8?  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72914
Вот как файл 3.xml попадает в поле Data1:
Dim rs As New ADODB.Recordset
...
    rs.Open "select * from uwsImport where 1=2", cn, adOpenStatic, adLockBatchOptimistic
    rs.AddNew
    rs!ObjName = "STUDENT"
    rs!EmployeeID = 8
    rs!Data1 = ReadTextFile("F:\ImportExport\3.xml")
    rs.UpdateBatch
29 мар 11, 11:41    [10437781]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить xml-текст в поле типа XML или NTEXT в кодировке UTF-8 с помощью ADO 2.8?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Antonariy
rs!Data1 = ReadTextFile("F:\ImportExport\3.xml")
Сферический такой ReadTextFile в вакууме.
И ты меня хочешь убедить что ты правильно считываешь данные с файла в правильной кодировке и правильно загоняешь в NTEXT?
Кодировка чтения текста из файла должна быть задана ЯВНО, а не то что будет использоваться по умолчанию. Файл надо читать в 2 этапа:
1. Считать заголовок и определить кодировку.
2. Выставить кодировку при чтении стрима в строку и прочитать данные.
Не всегда возможно авто-определение (и вообще нигде программно его не видел).

Конечно не спец, в этом у#бищном VB, но гложат меня сомнения в возможности работы с уникодом в нём вааще.

Может поможет: http://support.microsoft.com/kb/194975 (DataField.AppendChunk StrData)
Т.е. проблема не только считать вайл, но и записать в NTEXT.

KO
Бинарное "содержимое" одной и той же строковой переменной в разных программных средах может быть разное при неизменном тексте.
В данном случае у тебя каждый байт превратился в уникодовский символ. Например, у тебя два иероглифа состоящие в файле из 6ти байт превратился в 6ть символов в ntext-овом поле (каждый по 2 байта).
29 мар 11, 13:39    [10438866]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить xml-текст в поле типа XML или NTEXT в кодировке UTF-8 с помощью ADO 2.8?  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72914
Проблема решена через ADODB.Stream.
29 мар 11, 14:35    [10439424]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как сохранить xml-текст в поле типа XML или NTEXT в кодировке UTF-8 с помощью ADO 2.8?  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 454
Antonariy
Проблема решена через ADODB.Stream.

А можно узнать решение проблемы?
27 авг 13, 14:48    [14760801]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить xml-текст в поле типа XML или NTEXT в кодировке UTF-8 с помощью ADO 2.8?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
saszay
Antonariy
Проблема решена через ADODB.Stream.
А можно узнать решение проблемы?
О боже, ещё один который считает что если он что-то непонял - то это явно не важно для решения его задачи.

Вы серьёзно?
27 авг 13, 16:39    [14761820]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить