Как устранить ошибку «невозможно переключить кодировку» при вставке XML в SQL Server
Я пытаюсь вставить в столбец 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?
РЕДАКТИРОВАТЬОк, извините за путаницу - строка должна быть в 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 в БД, используйтеSqlDbType.NVarChar
или жеSqlDbType.Xml
в предыдущем примере, или просто не указывайте тип:
sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));