Como resolver o erro "não é possível alternar a codificação" ao inserir XML no SQL Server
Estou tentando inserir na coluna XML (SQL SERVER 2008 R2), mas o servidor está reclamando:
System.Data.SqlClient.SqlException (0x80131904):
Análise XML: linha 1, caractere 39, incapaz de alternar a codificação
Descobri que a coluna XML precisa ser UTF-16 para que a inserção seja bem-sucedida.
O código que estou usando é:
XmlSerializer serializer = new XmlSerializer(typeof(MyMessage));
StringWriter str = new StringWriter();
serializer.Serialize(str, message);
string messageToLog = str.ToString();
Como posso serializar o objeto para estar na string UTF-8?
EDITAR: Ok, desculpe pela confusão - a string precisa estar em UTF-8. Você estava certo - é UTF-16 por padrão, e se eu tentar inserir no UTF-8, ele passa. Portanto, a questão é como serializar no UTF-8.
Exemplo
Isso causa erros ao tentar inserir no SQL Server:
<?xml version="1.0" encoding="utf-16"?>
<MyMessage>Teno</MyMessage>
Isto não:
<?xml version="1.0" encoding="utf-8"?>
<MyMessage>Teno</MyMessage>
Atualizar
Eu descobri quando o SQL Server 2008 por suaXml
tipo de coluna precisa de utf-8 e, quando utf-16 emencoding
propriedade da especificação xml que você está tentando inserir:
Quando você deseja adicionarutf-8
, adicione parâmetros ao comando SQL como este:
sqlcmd.Parameters.Add("ParamName", SqlDbType.VarChar).Value = xmlValueToAdd;
Se você tentar adicionar o xmlValueToAdd comencoding=utf-16
na linha anterior, produziria erros na inserção. Também oVarChar
significa que os caracteres nacionais não são reconhecidos (eles se tornam pontos de interrogação).
Para adicionar utf-16 ao db, useSqlDbType.NVarChar
ouSqlDbType.Xml
no exemplo anterior, ou simplesmente não especifique o tipo:
sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));