Я пытаюсь вставить в столбец 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 в encoding
свойства xml, которое вы пытаетесь вставить:
Если вы хотите добавить utf-8
, добавьте параметры в команду SQL следующим образом:
sqlcmd.Parameters.Add("ParamName", SqlDbType.VarChar).Value = xmlValueToAdd;
Если вы попытаетесь добавить xmlValueToAdd с encoding=utf-16
в предыдущей строке, это приведет к ошибкам вставки. Кроме того, VarChar
означает, что национальные символы не распознаются (они отображаются как вопросительные знаки).
Чтобы добавить utf-16 в db, используйте либо SqlDbType.NVarChar
или SqlDbType.Xml
в предыдущем примере, либо просто не указывайте тип вообще:
sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));