elaboración de un servicio web en c# que se comunica con
TRANSCRIPT
Elaboración de un Servicio Web en C# que se comunica con una base de datos SQL.
Requisitos
• Microsoft SQL Server Express (cualquier versión, aquí se trabajará con 2008 R2 SP2).
Link de descarga: https://www.microsoft.com/en-US/download/details.aspx?id=30438
Nota: También se puede descargar en español, pero recomiendo hacerlo en inglés para
evitar incompatibilidad con el idioma del SO. De las opciones en el link, recomiendo las
que tienen alrededor de 300Mb (WT). Hay 2 versiones: x86 (para sistemas de 32 bits) y
x64. Descargue la adecuada para su S.O.
• Microsoft Visual Studio (aquí se está trabajando con 2010).
Nota: La versión Express de C# NO TIENE el módulo para elaborar servicios web.
Deberá instalar VS y sus componentes.
Generalidades
¿Qué es un Servicio Web?
Un servicio web (en inglés, Web Service) es una tecnología que utiliza un conjunto de
protocolos y estándares que sirven para intercambiar datos entre aplicaciones.
Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y
ejecutadas sobre cualquier plataforma, pueden utilizar los servicios web para intercambiar
datos en redes de ordenadores como Internet. La interoperabilidad se consigue mediante la
adopción de estándares abiertos. Las organizaciones OASIS y W3C son los comités
responsables de la arquitectura y reglamentación de los servicios Web.
Ventajas
• Aportan interoperabilidad entre aplicaciones de software independientemente de sus
propiedades o de las plataformas sobre las que se instalen.
• Los servicios Web fomentan los estándares y protocolos basados en texto, que hacen más
fácil acceder a su contenido y entender su funcionamiento.
• Permiten que servicios y software de diferentes compañías ubicadas en diferentes lugares
geográficos puedan ser combinados fácilmente para proveer servicios integrados.
Inconvenientes
• Para realizar transacciones, no pueden compararse en su grado de desarrollo con los
estándares abiertos de computación distribuida como CORBA (Common Object Request
Broker Architecture).
• Su rendimiento es bajo si se compara con otros modelos de computación distribuida, tales
como Java Remote Method Invocation (RMI), CORBA o Distributed Component Object
Model (DCOM). Es uno de los inconvenientes derivados de adoptar un formato basado
en texto. Y es que entre los objetivos de XML no se encuentra la concisión ni la eficacia
de procesamiento.
• Al apoyarse en HTTP, pueden esquivar medidas de seguridad basadas en firewall cuyas
reglas tratan de bloquear o auditar la comunicación entre programas a ambos lados de la
barrera.
¿Qué es una Base de Datos?
Una base de datos es un conjunto de datos pertenecientes a un mismo contexto y almacenados
sistemáticamente para su posterior uso. En este sentido; una biblioteca puede considerarse
una base de datos compuesta en su mayoría por documentos y textos impresos en papel e
indexados para su consulta. Actualmente, y debido al desarrollo tecnológico de campos como
la informática y la electrónica, la mayoría de las bases de datos están en formato digital,
siendo este un componente electrónico, por tanto se ha desarrollado y se ofrece un amplio
rango de soluciones al problema del almacenamiento de datos.
Hay programas denominados sistemas gestores de bases de datos, abreviado SGBD (del
inglés Database Management System o DBMS), que permiten almacenar y posteriormente
acceder a los datos de forma rápida y estructurada. Las propiedades de estos DBMS, así como
su utilización y administración, se estudian dentro del ámbito de la informática.
Tipos de Bases de Datos
Hay bases de datos relacionales, como MySQL, SQL Server y Oracle. Como su nombre lo
indica utilizan el modelo relacional y siempre es mejor usarlas cuando los datos son
consistentes y ya tienes algo planificado.
También existen las no relacionales, como MongoDB y Redis, conocidas como NO-SQL
(Not Only SQL). Estas son más flexibles en cuanto a consistencia de datos y se han
convertido en una opción que intenta solucionar algunas limitaciones que tiene el modelo
relacional.
Además hay otras BBDD no tan tradicionales, como las basadas en grafos o aquellas que
tienen información cartográfica, que pueden servir, por ejemplo, si estás creando un e-
commerce para encontrar relaciones entre los productos y las preferencias de los usuarios.
Tener un buen diseño de base de datos desde el comienzo te puede ayudar a ahorrar tiempo.
Las bases de datos relacionales y no relacionales se organizan de formas diferentes y trabajan
con tipos de datos distintos, así que es importante entender cómo se diseña cada una. En el
caso de bases de datos relacionales se trabaja con el estándar SQL, que se usa para actualizar
o recuperar datos.
Un ejemplo claro para entender las bases de datos es el funcionamiento de una aerolínea.
Todas las aerolíneas tienen aplicaciones para hacer reservas y trabajan con diferentes rutas.
Todas las personas que van a viajar tienen que proveer datos para hacer una reservación de
una ruta específica, por ejemplo la fecha en que van a viajar. Para esto se hace necesario un
repositorio en el que se pueda almacenar esta información y se pueda cruzar, además, con
una cantidad de sillas por avión. Una base de datos permite no redundar en los datos.
Parte 1: Base de Datos
Instalación
Observación: Es posible que requiera la instalación de componentes adicionales.
Paso 1: Doble click al instalador y aparecerá la siguiente ventana, indicando la extracción de
archivos:
Según tus privilegios, es posible que debas confirmar los cambios a realizar:
Paso 2: Espere a que el instalador cargue.
Paso 3: Se abrirá una nueva ventana. Elegir la opción “New installation or add features to an
existing installation”
Paso 4: Espere a que se procesen los datos. Es posible que abran y cierren varias ventanas.
Si todo sale bien, se abrirá la ventana mostrada a continuación. Acepta los términos de la
licencia.
Paso 5: Se abrirá una nueva ventana con una barra de progreso, ya que está verificando los
componentes. De faltar alguno, el sistema lo indicará y deberá instalarlo antes de continuar.
Observación: Se recomienda desactivar el Firewall durante la instalación.
Paso 6: En la siguiente ventana podrás elegir los componentes a instalar. Dejar todo por
defecto.
Paso 7: Elegir el nombre de la instancia (es decir, el servidor). Puedes dejarlo por defecto o
colocar un nombre a elección.
Paso 8: En esta ventana se configura el servidor. Puedes dejar los valores por defecto.
Paso 9: Aquí se puede elegir la forma de autenticación. Por defecto se usan los credenciales
de Windows. Se puede dejar así o elegir “Mixed Mode” (modo mixto). De usar esa opción,
se elige una contraseña para el usuario “sa”, y al conectarse a la BD se puede hacer tanto con
ese usuario como con las credenciales de Windows.
Paso 10: Dar “Next” en la siguiente pantalla, y se mostrará el proceso de instalación. Esperar
a que termine.
Paso 11: Al finalizar la instalación, aparecerá la siguiente pantalla.
Paso 12: Cerrar la primera ventana (SQL Installation Center).
Creación de la nueva BD
Paso 1: Abrir el programa SQL Management Studio. Durante su primera ejecución, el
sistema realizará una configuración inicial, así que es posible que tarde un poco en abrir.
Paso 2: Ingresar a la Base de Datos. Si se configuró en acceso mixto, puede hacerse tanto
con las credenciales de Windows como con el usuario “sa”. Dar a connect.
Paso 3: En el explorador de objetos aparecerá el servidor activo. Al expandir la carpeta
“Databases” – “System Databases” se podrán apreciar todas las bases de datos que trae por
defecto el sistema.
Paso 3: Clic derecho a la carpeta Databases – “New Database”, para abrir una nueva pestaña.
Paso 4: Asignar un nombre a la base de datos. En esta oportunidad se escogió “Tienda”. Dar
click a “OK”.
En el explorador de objetos, bajo la carpeta “Databases” aparecerá la nueva base de datos.
Creación de las tablas
Se crearán dos tablas, llamadas “Productos” y “Tipos”, unidas entre sí por una clave.
Productos Tipos
Codigo Descripcion P_Unitario Tipo_P ID Descripcion
Int Nvarchar(50) Real Smallint Smallint Nvarchar(50) PK FK PK
Paso 1: En el explorador de objetos, expandir los elementos de la base de datos “Tienda”
(dándole al signo + que aparece al lado).
Paso 2: Click derecho a la carpeta “Tables” – “New Table”
Paso 3: En la nueva ventana, añadir las columnas necesarias, y asignar un nombre de tabla
en la pestaña “Properties” – “(Name)”.
Paso 4: Primero se creará la tabla “Productos”. El resultado queda como sigue:
Como una tabla requiere un campo clave (es decir, un campo identificador de valor único).
Se hace click derecho al campo “Codigo” y se elige la opción “Set Primary Key”
Enseguida, aparecerá una llave al lado del nombre del campo, indicando que se trata de un
campo clave.
Al hacer click en el nombre de la columna, en la parte inferior del editor aparecerá el cuadro
llamado “Column Properties”.
Si se desea que el campo “Codigo” genere un identificador en forma automática, se expande
el apartado “Identity” y se asigna “Yes” a (Is Identity)
Por los momentos no se definirá como identidad (dejar (Is Identity): No)
Paso 5: Realizar el proceso anterior para crear la tabla “Tipos”. Guardar.
Paso 6: Ahora se procede a establecer la relación entre ambas tablas. Para ello, se requiere
que el campo clave de una tabla se asocie a un campo distinto al campo clave de la otra. Éste
actuaría como una clave foránea. En el caso del ejemplo, se tiene el campo “Tipo_P” de la
tabla “Producto” que será una clave foránea que apuntará al campo “ID” de la tabla “Tipos”,
por lo tanto, ambos campos deben ser del mismo tipo (en este caso smallint).
Para ello, se hace click derecho al campo que desees establecer como clave foránea, y se
elige la opción “Relationships”.
Se abrirá la siguiente ventana
Al darle a “Add” se crea una nueva relación entre las tablas. Dar al botón (…) en el apartado
“Tables and Columns Specifications” para abrir una nueva ventana.
En la nueva ventana, se debe elegir la clave primaria de la tabla que desees asociar con tu
clave foránea. En este caso, se elige la clave primaria de la tabla “Tipos”. En “Foreign Key
table” elige el campo que usarás como clave foránea. Así:
Click en OK, luego en Close.
Paso 7: Guarda los cambios. En esta oportunidad aparecerá el siguiente cuadro:
Click en “Yes” para continuar. Ya con esto, ambas tablas están creadas.
Paso 8: Se procede ahora a añadir datos a la tabla “Tipos”, ya que la misma deberá tener un
registro predeterminado (la tabla “Productos” se llenará desde el sistema, pero se pueden
precargar algunos valores para efecto de prueba).
Para ello, se expande la carpeta “Tables” de la base de datos, esto con el fin de visualizar las
tablas. Click derecho a la tabla “Tipos” y elegir “Edit Top 200 Rows”.
Aparecerá una tabla vacía que se podrá llenar con valores a elección. Por ejemplo, los
mostrados en la siguiente imagen:
Parte 2: Elaboración del Servicio Web
Paso 1: Crear un nuevo proyecto en Visual Studio:
Se crea una nueva plantilla, asociada a un archivo llamado Service1.asmx. Se puede cambiar
el nombre (de hecho, es lo recomendable). El contenido es más o menos así:
Nótese que el método HelloWorld() está precedido por la directiva [WebMethod]. Ésta indica
que se trata de un método que se accede a través de la web. Cada uno de los métodos de esta
naturaleza debe tener esta directiva, y ser de acceso público.
Al compilar el programa, se abre el navegador predeterminado con la lista de componentes
del directorio. Click en “Service1.asmx” para abrir la página correspondiente:
Se puede apreciar el método “HelloWorld”. Al darle click se abre la siguiente pestaña:
Y en el botón “Invocar” se llama al método, obteniendo el siguiente resultado:
Paso 2: Cambiar la clase Service1 con el siguiente código:
public class Service1 : System.Web.Services.WebService { SqlConnection con; string comando; private bool Conectar() { string serv = Environment.MachineName; comando = "Server=" + serv + "; database=Tienda; integrated security = true"; con = new SqlConnection(comando); try { con.Open(); return true; } catch { return false; } } private bool Desconectar() { try { con.Close(); return true; } catch { return false; } } [WebMethod] public string[] Consultar(int cod) { string[] salida = null; if (Conectar()) try { salida = new string[3]; comando = "SELECT * FROM Productos JOIN Tipos ON Tipo_Prod = ID WHERE Codigo = " + cod.ToString(); SqlCommand execSQL = new SqlCommand(comando, con); SqlDataReader reg = execSQL.ExecuteReader(); if (reg.Read()) { salida[0] = reg[1].ToString(); salida[1] = reg[2].ToString(); salida[2] = reg[5].ToString(); } reg.Close(); } finally { Desconectar(); } return salida; } }
Nota: En los using debe añadir a System.Data.SqlClient para que el código funcione.
Explicación del código
Como se puede observar, se han creado 3 métodos: Conectar, Desconectar y Consultar.
Nótese que los dos primeros no incluyen la directiva “WebMethod”, lo que significa que los
mismos no serán visibles a través de la página web. De hecho, al ejecutar este código
aparecerán las siguientes pantallas:
Al colocar cualquier número entero, debería realizar una consulta y mostrar los resultados.
Dado que la tabla está vacía, el resultado es igualmente vacío:
Además de los métodos, se han declarado las variables con, que establece la
conexión/desconexión con la base de datos, y comando, que tendrá las consultas en lenguaje
SQL.
Sobre el método Conectar se tiene:
• Una variable serv que recopila el nombre de la máquina (recuérdese que se está
trabajando con la base de datos local, cuyo acceso se hace a través de la IP o el nombre
del computador).
• El comando de conexión, cuya sintaxis es “Server=<Nombre del servidor>;
database=<Nombre de la base de datos>; integrated security= true” (este último establece
que el acceso se hará con las credenciales de Windows. Se puede cambiar para que el
acceso sea con el usuario SQL, por lo que se tendría que poner el usuario y clave).
• Creación del objeto con, usando como parámetro el comando previamente definido.
• Apertura del servidor, con la instrucción Open. Es recomendable colocar esta instrucción
dentro de un try-catch (este último intenta realizar la conexión, de fallar, captura una
excepción).
Para Desconectar se tiene la instrucción Close, que como su nombre lo indica, permite el
cierre de la conexión.
El método Consultar se describe a continuación:
• Recibe como parámetro de entrada un número entero que sería el código, y envía como
salida un arreglo de cadenas.
• Inicialmente, el arreglo se declara nulo, en caso de fallar la conexión.
• Se intenta conectar con la base de datos, llamando al método interno Conectar.
• De haber conexión, se define un arreglo de 3 elementos (1 por cada campo de la tabla:
Descripción, Precio y Tipo).
• Se crea el siguiente comando: "SELECT * FROM Productos JOIN Tipos ON Tipo_Prod
= ID WHERE Codigo = " + cod.ToString(); donde:
o SELECT indica que se realizará una selección.
o El asterisco indica que se elegirán todos los campos.
o FROM indica que se realizará la selección en la tabla “Productos”
o JOIN establece una unión entre la tabla “Productos” y la tabla “Tipos”, ya que
uno de los campos de “Productos” necesita ser reemplazado por uno de los
campos de “Tipos”.
o ON es la condición de unión de las tablas. En este caso se están relacionando los
campos claves Tipo_Prod (de la tabla “Productos”) e ID (de la tabla “Tipos”), en
donde ambos valores deben coincidir.
o WHERE es la condición de selección de la tabla principal. En este caso, la
condición es que el campo “Codigo” sea igual al valor recibido por el método.
• Se crea a execSQL, un objeto de tipo SqlCommand, el cual toma como parámetros el
literal del comando SQL y la conexión.
• Se crea igualmente a reg, un objeto SqlDataReader, que recibe el resultado de la lectura
de la base de datos. Éste se trata como un arreglo de objetos.
• Si reg recibe datos, éstos se asignan al arreglo salida. Caso contrario permanece vacío.
• Luego de usar a reg, éste debe cerrarse, de esta forma, si se realiza una nueva consulta,
el lector está disponible para un nuevo proceso.
• Una vez finalizado el proceso, se debe desconectar de la base de datos. Nótese que en
esta oportunidad se usa el esquema try-finally.
• Finalmente, se retorna el resultado de la operación.
Consideraciones:
• Un servicio Web no puede retornar una matriz.
• Es recomendable abrir/cerrar la B.D. cada vez que se realice una operación.
Ejercicios propuestos
1. Investigue sobre las consultas en lenguaje SQL: Insert, Delete, Update, Select Max.
2. Elabore un Web Method para cada una de las mencionadas consultas.
3. Dado que el método no puede devolver una matriz…. ¿Qué haría usted para solucionar
esto?