Beruflich Dokumente
Kultur Dokumente
•
•
•
•
Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres
lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de
subscripción.
subscripción
Sponsors
• Vuelos Baratos
• Mercadona Actualidad
• Mercadona Compra Online
• Coche de Alquiler
• Regalos Publicitarios
Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.
Idea: Juanjo Navarro
Diseño: Albin
MadeInFlex
Introducción a Web Services con .NET y FLEX II
Noviembre 25th, 2006 - [Enlace local]
En la primera parte de nuestro tutorial vimos como podemos elaborar un Web Service con .NET que
es capaz de devolver un mensaje y como generar la aplicación en FLEX para consumir el mismo y
mostrarlo. En esta parte del tutorial veremos algo mucho mas interesante y de mucha utilidad para
nuestras aplicaciones que consiste en enlazar datos de nuestro Web Service a una base de Datos
SQL Server 2005 Express Edition, entender los conceptos básicos de ADO.NET y como desplegarlos
de igual manera en FLEX.
Si tu proyecto requiere de acceso rápido a datos es decir solo lectura y no vas a hacer ninguna
operación de inserción (INSERT) o actualización (UPDATE) lo más recomendable es usar un
DataReader ya que es mucho más rápido que un DataSet. Una de sus desventajas es que lo hace
en modo conectado y como mencionamos anteriormente solo es de modo lectura.
Por el otro lado tenemos a el DataSet, este nos permite hacer operaciones tanto de lectura como de
escritura es decir (SELECT, INSERT Y UPDATE).Normalmente trabaja en conjunto con un
DataAdapter para efectuar estas operaciones y este se encarga de procesar la sentencia SQL, la
conexión y el resultado pasarlo al DataSet. Además el Dataset trabaja en modo desconectado ya
que guarda temporalmente todos los datos como un objeto en el servidor. Es importante mencionar
que los Datasets los ocupamos para hacer operaciones complejas en la base de datos, incluso el
Dataset puede tener múltiples DataTables o lo que es lo mismo tablas de la base de datos, lo que el
DataReader es incapaz de hacer ya que solo soporta una tabla de la base de datos. Las desventajas
del Dataset es que el acceso a los datos es más lento.
En resumen si quieren acceso rápido y de solo lectura les recomiendo el DataReader , si lo que
quieren es efectuar operaciones de inserción o actualización o quieren combinar múltiples tablas de
la base de datos lo que les recomiendo es el Dataset.
Conexión del Web Service a una base de
datos
Ahora que contamos con la parte teórica necesaria empecemos a codificar nuestro Web Service
para acceder a nuestros datos. Lo primero que haremos es un sencillo método para verificar si mi
conexión con la base de datos es correcta. Aislaremos la cadena de conexión en el archivo
Web.config, este archivo es para configurar parámetros de la aplicación y que es donde
almacenaremos nuestra cádena de conexión y utilizaremos el Configuration Manager para acceder a
este. Es importante mencionar que es buena práctica poner nuestras cadenas de conexión en el
archivo Web.Config y no embeberla en nuestro código ,ya que de esta manera si cambia el motor
de base de datos no será necesario volver a compilar nuestra aplicación.
En VWD dirijamonos a archivo abrir y abramos el proyecto del tutorial pasado, si no cuentas con el
te recomendamos pegar el siguiente código en un nuevo proyecto de ASP.NET Web Service (para la
creación de un nuevo proyecto ve la primera parte del tutorial aqui).
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data.SqlClient;
using System.Configuration;
[WebService(Namespace = "http://www.madeinflex.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
try{
//UTILIZO EL MÉTODO OPEN PARA
//ABRIR LA CONEXIÓN
sqlConn.Open();
Explorador de soluciones
Una vez que estamos en el archivo Web.config en el nodo de connectionstrings asignaremos el
siguiente código.
<?xml version="1.0"?>
<!--
Nota: como alternativa para editar manualmente este archivo puede
utilizar la
herramienta Administración de sitios Web para configurar los
valores de la aplicación. Utilice
la opción Sitio Web->Configuración de Asp.Net en Visual Studio.
Encontrará una lista completa de valores de configuración y
comentarios en
machine.config.comments, que se encuentra generalmente en
\Windows\Microsoft.Net\Framework\v2.x\Config
-->
<configuration>
<appSettings/>
<connectionStrings>
<!-- Nombre de identificador y cadena de conexión -->
<add name="StoreSQL" connectionString="Data
Source=localhost\SQLExpress;Initial Catalog=Store;Integrated
Security=SSPI;"/>
</connectionStrings>
<system.web>
<!--
Establezca debug="true" en la compilación para insertar
símbolos
de depuración en la página compilada. Dado que este
proceso afecta al rendimiento, debe establecer este valor
como true
durante la depuración.
-->
<compilation debug="true"/>
<!--
La sección <authentication> permite configurar
el modo de autenticación de seguridad utilizado por
ASP.NET para identificar a un usuario entrante.
-->
<authentication mode="Windows"/>
<!--
La sección <customErrors> permite configurar
las acciones que se deben llevar a cabo/cuando un error no
controlado tiene lugar
durante la ejecución de una solicitud. Específicamente,
permite a los desarrolladores configurar páginas de error
html
que se mostrarán en lugar de un seguimiento de pila de
errores.
<customErrors mode="RemoteOnly"
defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>
Primero lo que hacemos es añadir una etiqueta add con un atributo name para asignar un
identificador a nuestra conexión con datos y posteriormente el atributo connectionString para la
cadena de conexión pertinente con el nombre de nuestra base de datos en este caso llamado Store.
Existen varias cadenas de conexión dependiendo el contexto donde se encuentren , una buena
fuente para consultar cadenas de conexión de distintos manejadores de bases de datos es
www.connectionstrings.com
Una vez finalizado la configuración en Web.Config regresemos a nuestro archivo Service.cs y
continuemos analizando el código. En la línea 31 declaro un objeto de conexión y posteriormente le
paso la propiedad ConnectionString que sera igual a la variable strConn. Enseguida en la línea 36
abro un bloque try para ocupar el método open del objeto de conexion. Si todo marcha bien me
regresara true el Web Service, de lo contrario saltara a la línea número 36 y cachara la excepción y
me regresara false. En nuestro bloque finally pase lo que pase cerrara la conexión. Generalmente
cuando abrimos conexiones con datos es casi obligado para desarrolladores meterlos en bloques
try, catch, finally por si ocurre una excepción cacharla y manejala.
Probemos nuestro Web Service iniciando la depuración (F5) y nos debe aparecer en nuestro
navegador predeterminado 2 métodos, nuestro famoso HelloWorld y ahora nuestro método
TestConnection.
Lo interesante de ocupar y regresar un tipo de datos DataTable en un Web Service de .NET es que
FLEX lo interpretara como un ArrayCollection, y obvio este atributo lo podemos hacer [Bindable]
para posteriormente asignarlo a un componente que en este caso será un DataGrid.
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
[WebService(Namespace = "http://localhost/webserviceclass/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
try{
}
//METODO QUE ME REGRESA UN DATATABLE
[WebMethod(Description = "Método que me devuelve un DataTable")]
public DataTable getDataTable()
{
//DECLARO MI CADENA DE CONEXION ALMACENADA
//EN EL ARCHIVO WEB.CONFIG
string strConn =
ConfigurationManager.ConnectionStrings["StoreSQL"].ConnectionString;
//DECLARO EL DATASET
DataSet dsProductos = new DataSet();
//LLENO EL DATASET
da.Fill(dsProductos);
//REGRESO
return dsProductos.Tables[0];
Como pueden observar es muy sencillo el código, tengo entonces un método que me regresara
un DataTable. Dentro del método primero declaro una variable que contendra la cadena de
conexión (línea 65) almacenada en el archivo Web.config. Posteriormente declaro un objeto de
conexión (línea 68) y con la propiedad ConnectionString del objeto de conexión lo asigno (línea 71)
a mi variable que contiene la cadena. Una vez hecho esto declaro en una variable la consulta que
deseo ejecutar (línea 74), en este caso a la tabla de PRODUCTS. Enseguida declaro un adaptador de
datos (línea 77) y le paso como parametros la consulta y el objeto de conexión. Despues declaro un
DataSet (línea 80) y con el método Fill del SqlDataAdapter lleno el DataSet (línea 83) con los
registros. Finalmente regreso el DataTable (línea 86) haciendo referencia al método Tables con el
índice en 0 ya que no tenemos más tablas en está consulta.
Me despliega un XML en un formato llamado DiffGram, este tipo de formato es para representar a
un DataSet y además es capaz de identificar cambios en el DataSet. Además nos muestra ya los
datos provenientes de la base en una mánera fácil de leer.
DiffGram
Una vez desplegando nuestra tabla de Datos en nuestro navegador pasemos a FLEX implementar lo
último para desplegar los datos.
<mx:Script>
<![CDATA[
[Bindable]
private var arrProductos:ArrayCollection
//
arrProductos=event.result.diffgram.NewDataSet.Table;
}
]]>
</mx:Script>
<mx:WebService id="mifWebService"
wsdl="http://localhost/webserviceclass/Service.asmx?WSDL">
<mx:operation name="getDataTable"
result="llenaDataGrid(event)" />
</mx:WebService>
</mx:Application>
Después de agregar la etiqueta script importamos las clases necesarias, ArrayCollection y
ResulEvent para manejar los resultados de mi llamado.Posteriormente declaro con el metadatag
[Bindable] una variable arrProductos de tipo ArrayCollection y que será igual a los resultados
obtenidos por el Web Service. Noten que despues de event.result tengo diffgram.NewDataSet.Table
que es como me lo regresa el Web Service (ver figura de diffgram).Enseguida lo que hacemos es
declarar una función llamada llenaDataGrid que le pasamos como parámetro una variable llamada
event de tipo ResultEvent.
Nota importante
Para ver el comportamiento del tipo de datos que me esta interpretando event dentro de la función,
comentemos la línea donde asignamos la variable arrProductos y asignemos un punto de
interrupción en la fúncion llenaDataGrid. Iniciemos la depuración y encontraremos principalmente
dos objetos this y event. Si hacemos una exploración el en objeto event vean como el DataTable de
.NET es interpretado como un ArrayCollection
Sesión de depuración
En lo que respecta al MXML tenemos la etiqueta WebService asignandole un id para referenciarlo y
el WSDL donde reside nuestro Web Service. Dentro de la etiqueta Web Service abro una etiqueta
llamada operation y con el atributo name hago referencia a la operación o al método en mi Web
Service (getDataTable) si tuvieramos mas operaciones y las quiero convocar puedo abrir tantas
etiquetas de tipo operation como yo desee para diferentes métodos , además tiene el atributo result
que es igual a la funcion que ya declaramos dentro del bloque script y que maneja los resultados.
Si todo esta correcto corramos la aplicación , demos click en el boton obtenerDataSet y veamos los
resultados como se ve en la figura
DataGrid con resultados
Conclusión:
Esta es una manera de trabajar con Web Services de .NET y FLEX accediendo a datos. No obstante
existe una mejor manera que nos beneficia en desempeño tanto del lado del cliente como del lado
del servidor si la cantidad de datos es mayor, aunque implica un poco de mayor código. En el
siguiente tutorial veremos como podemos implementar esta manera para mejorar el rendimiento,
además de manejar posibles fallas del lado del servidor dentro de FLEX.