type nodos leer data c# sql xml sql-server-2005

c# - data - leer nodos xml sql



Se produce un error al intentar almacenar contenido XML en SQL Server 2005(problema de codificación) (6)

¿Podría volver a escribir el xml como unicode (quizás en un MemoryStream ) y enviarlo? Nota: si solo está almacenando los datos, puede usar varbinary(max) (y en realidad será más rápido). Esto no tiene dificultades de codificación, y también le permitirá auditar cualquier xml corrupto que reciba.

Si está consultando los datos como xml dentro del servidor de la base de datos, entonces xml es obviamente el camino a seguir.

Gente,

Tengo un servicio web que devuelve datos en la codificación ISO-8859-1, ya que no es mío, no puedo cambiar eso :-(

Para fines de auditoría, me gustaría almacenar el XML resultante de estas llamadas en una tabla de SQL Server 2005, en la que tengo un campo de tipo "XML NULL".

Desde mi código C #, trato de almacenar este contenido XML en el campo XML usando una consulta parametrizada, algo así como

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();

El problema es que cuando ejecuto este código, obtengo un error:

Msg 9402, nivel 16, estado 1, línea 1
Análisis XML: línea 1, carácter xy, no se puede cambiar la codificación

?? Estaba tratando de descubrir dónde y cómo podría "cambiar" la codificación, sin suerte hasta ahora. ¿Qué significa esto realmente? No puedo almacenar XML con la codificación ISO-8859-1 en SQL Server 2005 ?? ¿O hay un truco para a) decirle a SQL Server 2005 que solo acepte esta codificación, o b) convertir automágicamente la respuesta del servicio web a la codificación UTF antes de almacenarla en SQL Server?

Gracias por cualquier pista, consejos, consejos! Bagazo



Necesita convertir a utf-16

No soy un experto en XML en SQL Server aunque lo use, pero tuvimos el mismo problema el año pasado y fue un desajuste del tipo de datos de cadena declarado en SQL en comparación con el xml que se envía.



Editar
Me perdí la parte de la pregunta ISO-8859-1 - la solución a continuación es buena para UTF8, pero obviamente no resuelve el problema de Marc ya que no puede alterar la codificación.

Esta es la solución que uso:

Y una versión ligeramente modificada del código de arriba (lo he probado con un archivo UTF8 usando 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(); } } } }


Incluso me enfrenté a un problema similar al insertar contenido xml a db. Por ejemplo, la entrada fue así:

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

Este tipo de declaración solía fallar y recibía el error "no se puede cambiar ...". Más tarde, simplemente prefijé una cadena de N a xml como esta:

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

¡Después de esto, comenzó a funcionar!