Попытка сохранить содержимое XML в SQL Server 2005 не удалась (проблема с кодировкой) - PullRequest
10 голосов
/ 22 декабря 2008

Люди,

У меня есть веб-сервис, который возвращает данные в кодировке ISO-8859-1 - поскольку это не мое, я не могу это изменить: - (

В целях аудита я хотел бы сохранить полученный XML-код этих вызовов в таблице SQL Server 2005, в которой у меня есть поле типа "XML NULL".

Из моего кода C # я пытаюсь сохранить это содержимое XML в поле XML с помощью параметризованного запроса, что-то вроде

SqlCommand _cmd = new SqlCommand("INSERT INTO dbo.AuditTable(XmlField) VALUES(@XmlContents)", _connection);

_cmd.Parameters.Add("@XmlContents", SqlDbType.Xml);
_cmd.Parameters["@XmlContents"].Value = (my XML response);

_cmd.ExecuteNonQuery();

Проблема в том, что когда я запускаю этот код, я получаю сообщение об ошибке:

Сообщение 9402, Уровень 16, Состояние 1, Строка 1
Синтаксический анализ XML: строка 1, символ xy, невозможно переключить кодировку

?? Я пытался выяснить, где и как я мог бы «переключить» кодировку - пока не повезло. Что это на самом деле значит? Я не могу хранить XML с кодировкой ISO-8859-1 в SQL Server 2005 ?? Или есть хитрость: а) сказать SQL Server 2005 просто принять эту кодировку или б) автоматически преобразовать ответ веб-службы в кодировку UTF перед сохранением в SQL Server?

Спасибо за любые подсказки, указатели, советы! Marc

Ответы [ 6 ]

5 голосов
/ 22 декабря 2008

Вам необходимо конвертировать в utf-16

Я не эксперт по XML в SQL Server, хотя и использую его, но в прошлом году у нас была такая же проблема, и это было несоответствие объявленного в SQL типа данных строки по сравнению с отправляемым xml.

1 голос
/ 07 июля 2009

Редактировать
Я пропустил часть вопроса ISO-8859-1 - приведенное ниже решение хорошо для UTF8, но, очевидно, не решает проблему Марка, поскольку он не может изменить кодировку.


Вот решение, которое я использую:

И слегка измененная версия кода выше (я протестировал его с файлом UTF8 с использованием SQL 2005):

using System.IO;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;

...
using (SqlConnection connection = new SqlConnection("conn string"))
{
    connection.Open();
    string sql = "INSERT INTO mytable (xmlColumn) VALUES (@xmlData)";
    using (SqlCommand command = new SqlCommand(sql, connection))
    {
        // Swap round if the source file is unicode         
        string xml = File.ReadAllText(@"C:\myxml.xml");
        //string xml = File.ReadAllText(@"C:\myxml.xml", Encoding.Unicode);

        using (MemoryStream stream = new MemoryStream())
        {
            using (StreamWriter writer = new StreamWriter(stream, Encoding.Unicode))
            {
                writer.Write(xml);
                writer.Flush();
                stream.Position = 0;

                SqlParameter parameter = new SqlParameter("@xmlData", SqlDbType.Text);
                parameter.Value = new SqlXml(stream);
                command.Parameters.Add(parameter);
                command.ExecuteNonQuery();
            }
        }
    }
}
1 голос
/ 27 февраля 2009

Я опубликовал некоторую информацию:

http://mrboratech.blogspot.com/2009/02/how-to-store-xmldocument-mssql-2005-as.html

1 голос
/ 22 декабря 2008

Не могли бы вы переписать XML как Unicode (возможно, на MemoryStream) и отправить это? Примечание: если вы просто храните данных, вы можете использовать varbinary(max) (и на самом деле это будет быстрее). Это не затрудняет кодирование, а также позволит вам проверять любой поврежденный XML, который вы получаете.

Если вы запрашиваете данные в виде xml на сервере базы данных, тогда, очевидно, xml - путь.

1 голос
/ 22 декабря 2008

Я нашел это в Google. http://social.msdn.microsoft.com/forums/en-US/sqlxml/thread/d40ef582-4ffe-4f4b-b6b8-03c6c0ba1a32/

Я думаю, вы можете заменить строку

_cmd.Parameters.Add("@XmlContents", SqlDbType.Xml);

с

_cmd.Parameters.Add("@XmlContents", System.Data.SqlTypes.SqlXml);
0 голосов
/ 08 января 2014

Даже я сталкивался с подобной проблемой при вставке XML-содержимого в БД. Например, вход был такой:

Insert Into TestData(Xml) Values ('<?xml version="1.0" encoding="UTF-8"?><Test/>')

Раньше такого рода операторы терпели неудачу, и я получал ошибку "невозможно переключиться ...". Позже я просто добавляю префикс N к строке xml следующим образом:

Insert Into TestData(Xml) Values (N'<?xml version="1.0" encoding="UTF-8"?><Test/>')

После этого он начал работать !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...