Я пытаюсь вставить в столбец XML (SQL SERVER 2008 R2), но сервер жалуется:
System.Data.SqlClient.SqlException (0x80131904) :
Разбор XML: строка 1, символ 39, невозможно переключить кодировку
Я обнаружил, что для успешной вставки столбец XML должен иметь формат UTF-16.
Я использую следующий код:
XmlSerializer serializer = new XmlSerializer(typeof(MyMessage));
StringWriter str = new StringWriter();
serializer.Serialize(str, message);
string messageToLog = str.ToString();
Как я могу преобразовать объект в строку UTF-8?
EDIT : Хорошо, извините за путаницу - строка должна быть в UTF-8. Вы были правы - по умолчанию это UTF-16, и если я попытаюсь вставить в UTF-8, он пройдет. Итак, вопрос в том, как сериализовать в UTF-8.
Пример
Это вызывает ошибки при попытке вставить в SQL Server:
<?xml version="1.0" encoding="utf-16"?>
<MyMessage>Teno</MyMessage>
Этого не происходит:
<?xml version="1.0" encoding="utf-8"?>
<MyMessage>Teno</MyMessage>
Обновление
Я понял, когда SQL Server 2008 для его типа столбца Xml
требует utf-8, а когда utf-16 в свойстве кодировки
спецификации xml, которую вы пытаетесь вставить:
Когда вы хотите добавить utf-8
, затем добавьте параметры к команде SQL следующим образом:
sqlcmd.Parameters.Add("ParamName", SqlDbType.VarChar).Value = xmlValueToAdd;
Если вы попытаетесь добавить xmlValueToAdd с encoding = utf-16
в предыдущей строке, это приведет к ошибкам при вставке. Кроме того, VarChar
означает, что национальные символы не распознаются (они превращаются в вопросительные знаки).
Чтобы добавить utf-16 в базу данных, используйте либо SqlDbType.NVarChar
, либо SqlDbType.Xml
в предыдущем примере или просто не указывайте тип вообще:
sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));