MSSQL2008: как сохранить файл в поле типа XML?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

MSSQL2008: как сохранить файл в поле типа XML?

Сообщение Antonariy » 25.03.2011 (Пт) 19:26

На IIS из html-формы приходит xml-файл в utf-8 с соответствующей процессинговой инстркцией (ПИ), его нужно записать в базу в поле типа xml.
Код: Выделить всё
rs!Data = ReadFile("F:\ImportExport\3.xml")

Public Function ReadFile(path As String) As String
Dim r() As Byte
    Open path For Binary As #1
    ReDim r(LOF(1) - 1)
    Get #1, , r
    Close #1
    ReadFile = StrConv(r, vbUnicode)
End Function
При присвоении значения выдается ошибка "невозможно сменить кодировку". Если из текста файла вырезать ПИ, то файл проглотится, но с кодировкой windows-1251, поэтому в дальнейшем из такого документа лезут кракозябры.

bcp, openrowset и SQLXMLBulkLoad не подходят, нужно решение на чистом ADODB 2.8
Лучший способ понять что-то самому — объяснить это другому.

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

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение alibek » 25.03.2011 (Пт) 21:05

А почему не используется ADODB.Stream? Ну или хотя бы методы AppendChunk.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение Antonariy » 25.03.2011 (Пт) 23:00

ADODB.Stream как прикручивается? Я знаю только как его использовать с Parameters("Output Stream"), а упоминаний про input stream не нашел.
Про AppendChunk забыл, попробую.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение Antonariy » 28.03.2011 (Пн) 11:02

AppendChunk
"Операция не допускается в данном контексте"
Вообще в watch все value-свойства у этого поля выдают "произошли ошибки при выполнении многошаговой операции", а size = -1.

ADD: rs.Save тоже не работает с таким полем.
Лучший способ понять что-то самому — объяснить это другому.

NashRus
Постоялец
Постоялец
 
Сообщения: 386
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение NashRus » 28.03.2011 (Пн) 12:10

Похоже надо utf-16.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение Antonariy » 28.03.2011 (Пн) 14:43

Не похоже совсем, впрочем в этом я виноват, предоставил не все данные.
Начну заново:

На 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-поле корректно и без вопросов.
Лучший способ понять что-то самому — объяснить это другому.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение HandKot » 29.03.2011 (Вт) 9:58

Antonariy, попробуйте

Код: Выделить всё
    Dim cn As ADODB.Connection
    Dim st As ADODB.Stream
    Dim cmd As ADODB.Command
   
    Set st = New ADODB.Stream
    With st
        .Open
        .Type = adTypeText
        '.Charset = "UTF-8"
        .LoadFromFile "test.xml"
    End With
   
    Set cn = New ADODB.Connection
    cn.Provider = "SQLOLEDB"
    cn.ConnectionString = "Server=MyServer;Database=myBase;Integrated Security=SSPI;"
    cn.CursorLocation = adUseClient
    cn.Open
   
    Set cmd = New Command

    Set cmd.ActiveConnection = cn
    cmd.CommandText = "insert into dbo.Table_xml(DATA) values (?)"
    cmd.CommandTimeout = 240
    cmd.CommandType = adCmdText
    cmd.CreateParameter "xml", adVarChar, adParamInput
    cmd.Parameters(0) = st.ReadText
   
    cmd.Execute
     
    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing

где DATA - столбец типа XML
сохранял такой файл в кодировке UTF-8
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<root>
<item name="item1" > item_name </item>
</root>

но в поле сохраняется все строки, кроме первой
I Have Nine Lives You Have One Only
THINK!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение Antonariy » 29.03.2011 (Вт) 10:47

Ограничение есть на размер параметра? Файл может быть размером в пару сотен мегабайт.
Лучший способ понять что-то самому — объяснить это другому.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение HandKot » 29.03.2011 (Вт) 11:55

не знаю и не пробовал, проверьте.

а так по МСДН
CreateParameter Method (ADO)
...
Size
Optional. A Long value that specifies the maximum length for the parameter value in characters or bytes.

и по stream ограничения вроде нет
I Have Nine Lives You Have One Only
THINK!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение Antonariy » 29.03.2011 (Вт) 16:38

Сделал через ADODB.Stream.
Лучший способ понять что-то самому — объяснить это другому.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение HandKot » 29.03.2011 (Вт) 19:41

а по размеру не проверяли?
насколько большой файл можно залить?
I Have Nine Lives You Have One Only
THINK!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: MSSQL2008: как сохранить файл в поле типа XML?

Сообщение Antonariy » 30.03.2011 (Ср) 21:57

Не проверял, но любой. Не вижу повода для ограничений.

Для Command ntext-параметр задать нельзя, а из тех, что можно, это nvarchar(max) = 4000, поэтому возникли сомнения насчет этого безымянного параметра.
Лучший способ понять что-то самому — объяснить это другому.


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

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

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

    TopList