elaboración de un servicio web en c# que se comunica con

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

Upload: others

Post on 19-Nov-2021

4 views

Category:

Documents


0 download

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:

Una vez llena la tabla, se cierra el programa. Los datos se guardan en forma automática.

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?