La forma más sencilla de generar XML de SQL Server al cliente
-
03-07-2019 - |
Pregunta
Necesito devolver el contenido de una columna xml en el servidor sql al cliente simplemente haciendo clic en una URL. El xml tiene instrucciones de procesamiento para abrir la aplicación correcta (Infopath en este caso).
Estoy un poco confundido con respecto a todos los diversos escritores y transmisiones de lectores de XML disponibles. Supongo que quiero enviar el contenido de ExecuteXmlReader de SQL a Response.OutputStream, pero no estoy seguro de cómo conectarlos juntos.
Gracias es anticipado
Solución 4
Lo tengo funcionando simplemente usando Response.Write con el xml como texto, pero aún no estoy seguro de si realmente debería usar XmlReaders y streams. Esto es lo que hice:
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select Name, InfopathDoc from document where id = @id";
cmd.Parameters.AddWithValue("@id", docId);
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.Read())
{
Response.ContentType = "application/xml";
Response.AppendHeader("Content-disposition", "attachment; filename=" + dr["Name"]);
Response.Write(dr["InfopathDoc"]);
}
Otros consejos
Sugeriría obtener el XML de la base de datos como texto, luego crear una página dinámicamente y establecer el tipo MIME en el encabezado a " application / xml " ;. Esto le debe indicar al navegador que DTRT (suponiendo que esté configurado correctamente).
Si no está trabajando con una aplicación web, es posible que desee considerar el uso de RE para analizar el texto y determinar la aplicación que se iniciará, luego aliméntela con XML (ya sea usando un archivo temporal o mediante la redirección de entrada de algunos tipo).
Dado que no da ninguna indicación de qué tecnologías está utilizando más allá de XML y SQL Server, es difícil ser realmente específico.
¿Por qué no solo consulta la base de datos utilizando el estándar de SQL para el contenido de la columna XML, y lo captura en una página y transmite esa cadena de nuevo al usuario?
Algo como:
string xmlContents = string.Empty;
using(SqlConnection _con = new SqlConnection("server=(local);database=Northwind;Integrated Security=SSPI;")
{
string queryStatement = "SELECT XmlColumn FROM dbo.MyTable WHERE id = @ID";
using(SqlCommand _cmd = new SqlCommand(queryStatement, _con)
{
_cmd.Parameters.AddWithValue("@ID", 5555);
_con.Open();
xmlContents = _cmd.ExecuteScalar().ToString(); // returns an object
_con.Close();
}
}
y luego vuelva a transmitir el XML al usuario, por ejemplo. usando Response.Write (xmlContents) - algo más o menos a lo largo de esas líneas (no se incluye el manejo de errores - dejaré que usted se encargue de :-)).
¿Eso ayuda a alguno?
Marc
SQL 2005 y más allá admiten la declaración FOR XML
. Consulte here
Por ejemplo:
SELECT * FROM MyTable FOR XML RAW;
También hay otras palabras clave para ajustar los nombres de las etiquetas XML para que sean diferentes de las columnas de la base de datos.
Luego, consulte la documentación de ExecuteXmlReader para cualquier clase de comando que use en C #.