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

¿Fue útil?

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 #.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top