jueves, mayo 24, 2007

Vamos a dar una vuelta de tuerca más al control XML de ASP.NET.
Ya hemos visto como configurar un control XML. Ahora vamos a darle un poco de dinamismo.
Vamos a mostrar datos sacado de una base de datos.
Tenemos una tabla de empleados. Así mismo, como quiero que varios clientes puedan consultar la lista, voy a proporcionarles un Web Service que va a dar un XML con la lista de empleados. Así, cada uno podrá customizar como mostrar unos datos.
Esto es, vamos a proporcionar un Web Service que va a proporcionar a lo usuarios un XML con la lista. Luego, cada usuario tendrá un XSLT que mostrará lo que le interese, y como le interese.

Paso 1: La query

Mmmm queremos una query que nos devuelva un XML. En esta web tenéis varias formas de lograr ese output. Nos quedamos con la siguiente:

SELECT (CAST(( SELECT '') +
( SELECT EmpleadoId,
RTRIM([EmpleadoNm]) AS Nombre
,RTRIM([EmpleadoSNm])AS Apellidos
,RTRIM([EmpleadoAge]) AS Edad
,RTRIM([EmpleadoSabiduria])AS Sabiduria
FROM [TestingDB].[dbo].[Empleados]
FOR XML PATH('Empleado')) +
(SELECT '
')
AS XML))


Bien, ya tenemos la lista de empleados, cada uno de ellos con el tag Empleado.

Ahora, a por el web service. Vamos a hacer que nos devuelva un XmlDocument (System.Xml). Esto permitirá al cliente manipularlo antes de darlo a la capa de presentación.

El Web Service sería así:

[WebMethod]
public XmlDocument GetEmpleados()
{

XmlDocument doc = new XmlDocument();

SqlConnection connection = new SqlConnection(@"Data Source=localhost\sqlexpress;Initial Catalog=TestingDB;Integrated Security=SSPI;");

SqlCommand command = new SqlCommand();
command.CommandText = "GetEmpleados";
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Connection = connection;
connection.Open();

XmlReader reader = command.ExecuteXmlReader();

while (reader.Read())
{
doc.InnerXml = reader.ReadOuterXml();

}
reader.Close();
connection.Close();
return doc;
}




Ahora, ¡a consumir el web service!

Creamos un site y añadimos la referencia web. Añadimos un control XML, solo con ID y Runat=”Server”, nada más.
Vamos a usar un fichero cualquiera de transformación.
En la página, vamos a recogerlo con forma de XmlNode.

El codigo en el Load, sería:

protected void Page_Load(object sender, EventArgs e)
{
EmpleadosWS.Service servicioEmpleados = new EmpleadosWS.Service();
XmlNode node = (XmlNode )servicioEmpleados.GetEmpleados();
xmlViewer.DocumentContent = node.OuterXml;
xmlViewer.TransformSource = "~/App_Data/Transformador.xslt";
xmlViewer.DataBind();
}


No olvideis el DataBind!!!!!

Un saludo

Nota: es muy posible que se pueda hacer más optimizado... sobre todo la query. Cualquiera que quiera sugerir como hacer o mejorarlo, por favor, hagálo :-) .... y gracias

No hay comentarios.: