ADO SOBRE ASP.NET
Dentro de este punto veremos como trabajar en una aplicación web sobre tres capas. Mostrando así que cosas se deben incluir dentro de una aplicación para poder operar de una forma que permita dividir las diversas capas que existan. También se pretende mostrar un nuevo enfoque de utilización de las conexiones a bases de datos, de una forma distinta a la que se mostró en los capítulos de ADO, modo conectado y desconectado.
Para ello, realizaremos los siguientes pasos:
Utilizaremos la Base de Creada en el punto Modo desconectado.
Crearemos las tablas que se utilizarán en la aplicación.
Crearemos la lógica de operación de las interfaces que administrarán el sitio.
Abrir el explorador de servidores.
Seleccionar el nodo que permite definir las conexiones a las bases de datos y, con el botón derecho del Mouse, seleccionar la opción Crear Conexión, como se muestra a continuación
Se abrirá una interfaz que permitirá seleccionar el servidor de base de datos en donde se desea crear la Base de Datos, solicitando el nombre de ésta. Como se muestra en la siguiente imagen.
En el espacio de definición de nombre de la base de datos agregar el nombre de esta. El resultado de la creación de la Base de Datos se reflejará en el navegador de servidores, como se observa en la siguiente imagen.
El siguiente paso será crear una tabla que llamaremos Cargos, para esto, expandiremos el nodo de la base de datos desde las conexiones que existen en el explorador de servidores, seleccionando con el botón derecho sobre la carpeta Tablas, la opción Agregar nueva tabla, como se muestra a continuación.
Se abrirá la ventana de creación de tablas, en donde definiremos los siguientes campos. Car_Codigo, Integer
Car_Descripcion, nvarchar(70)
Car_Estado, Char(1)
Quedando como se muestra a continuación:
Posicionándonos sobre el campo Car_Codigo, definiremos este como clave primaria, para esto seleccionaremos este campo con el botón derecho y seleccionaremos la opción Definir como Clave Primaria. Como se observa a continuación.
En la ventana de propiedades del campo seleccionado, expandiremos la opción Especificación de Identidad y en la propiedad (Identidad), cambiaremos la opción a Si. Por defecto dejaremos el incremento como se define por defecto.
Para guardar los cambios realizados se debe presionar el botón de guardar que se encuentra disponible en los controles de acceso directo del Visual Estudio. Al realizar esta acción, se desplegará la interfaz que permitirá agregar el nombre de la Tabla, como se muestra a continuación.
Presionar el botón Aceptar. La tabla será incluida en la carpeta de tablas que se muestra en el nodo de la base de datos, desde el explorador de soluciones.
A continuación crearemos la tabla Usuarios utilizando la siguiente definición de campos.
CREATE TABLE [dbo].[Usuario] (
[Usu_Codigo] [int] IDENTITY (1, 1) NOT NULL ,
[Usu_Login] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Usu_PassWord] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Usu_Estado] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO
Podemos también crear la tabla siguiendo los pasos que se han definido en la definición de la tabla Cargos.
Adicionalmente crearemos las siguientes tablas:
CREATE TABLE [dbo].[Personal] (
[Per_Codigo] [decimal](5, 0) IDENTITY (1, 1) NOT NULL ,
[Tip_Codigo] [int] NOT NULL ,
[Car_Codigo] [int] NOT NULL ,
[Per_DNI] [varchar] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Per_Nombres] [varchar] (45) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Per_ApellidoPaterno] [varchar] (35) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Per_ApellidoMaterno] [varchar] (35) COLLATE Modern_Spanish_CI_AS NULL ,
[Per_CostoHH] [decimal](13, 2) NOT NULL ,
[Per_FechaIncorporacion] [datetime] NOT NULL ,
[Per_FechaTermino] [datetime] NULL ,
[Per_Sexo] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Per_Correo] [varchar] (55) COLLATE Modern_Spanish_CI_AS NULL ,
[Per_Estado] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Tipo] (
[Tip_Codigo] [int] IDENTITY (1, 1) NOT NULL ,
[Tip_Descripcion] [varchar] (75) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Tip_Estado] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Cargos] WITH NOCHECK ADD
CONSTRAINT [PK_Cargos] PRIMARY KEY CLUSTERED
( [Car_Codigo] ) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Personal] WITH NOCHECK ADD
CONSTRAINT [PK_Personal] PRIMARY KEY CLUSTERED
( [Per_Codigo] ) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Tipo] WITH NOCHECK ADD
CONSTRAINT [PK_Tipo] PRIMARY KEY CLUSTERED
( [Tip_Codigo] ) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Usuario] WITH NOCHECK ADD
CONSTRAINT [PK_Usuario] PRIMARY KEY CLUSTERED
( [Usu_Codigo] ) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Personal] ADD
CONSTRAINT [FK_Personal_Cargos] FOREIGN KEY
( [Car_Codigo] ) REFERENCES [dbo].[Cargos] ( [Car_Codigo] ),
CONSTRAINT [FK_Personal_Tipo] FOREIGN KEY
( [Tip_Codigo] ) REFERENCES [dbo].[Tipo] ( [Tip_Codigo] )
GO
VALIDACIÓN DE EXISTENCIA DE USUARIO EN BASE DE DATOS
Antes de crear la lógica de validación de registros de usuario en la base de datos, realizaremos las siguientes acciones:
Si no ha ingresado los usuarios, ingresar los usuarios que operarán en el sistema.
insert into Usuario
values('marovi','marovi','A')
Si inspeccionamos los registros desde el administrador de tablas, del nodo de conexión creado, se observará la siguiente ventana:
Agregaremos un proyecto de clase en la solución, al cual llamaremos capa de datos (CapaDato). Dentro de este proyecto agregaremos un nuevo elemento que será del tipo de Conjunto de datos, nombrándolo dsUsuario.
Desde el explorador de servidores generaremos una conexión a la base de datos oracle y agregaremos la tabla Usuario. Quedando este, de la siguiente forma:
Dentro del TableAdapter que se ha creado, modificaremos la consulta definida, la cual será la que utilizaremos, para verificar la existencia del usuario en la base de datos, para esto:
· Seleccionaremos los métodos Fill y GetData del table adapter, con el botón derecho del Mouse, seleccionado la opción Configurar, como se muestra a continuación:
· En la interfaz que se ha presentado, al seleccionar la opción especificada, ingresar la siguiente consulta:
SELECT USU_CODIGO, USU_LOGIN, USU_PASSWORD, USU_ESTADO
FROM "SYSTEM".USUARIO
WHERE
USU_LOGIN = @USU_LOGIN and USU_PASSWORD=@USU_PASSWORD
· Presionar el botón Finalizar.
Agregaremos un nuevo proyecto de clases, el cual llamaremos CapaNegocio. A este proyecto agregaremos una referencia al proyecto de clase CapaDatos.
Dentro de este proyecto de clases, agregaremos un nuevo elemento del tipo de Clase de Componente, el cual llamaremos Usuario.
Antes de agregar cualquier elemento al archivo Usuario, creado en la capa de datos, generaremos el proyecto de CapaDato.
Dentro del archivo Usuario creado en la CapaNegocios, arrastraremos el control USUARIOTableAdapter al cual llamaremos dalUsuario.
Dentro del archivo Usuario agregaremos las siguientes líneas de código, que permitirá invocar el dataset tipado y consultar sobre los usuarios.
Public Function ObtenerUsuario(ByVal usu As String, ByVal pws As String) As CapaDato.dsUsuario.USUARIODataTable
Return Me.dalUsuario.GetData(usu, pws)
End Function
Dentro del proyecto de solución, agregaremos las referencias sobre los proyectos CapaDatos y CapaNegocio.
En el método que atiende el evento clic del botón btnIngresar, agregaremos las siguientes líneas de código (dentro del bloque If Page.IsValid Then), que permitirán consultar si el usuario al que se está consultando existe.
Primero crearemos un data table que rescatará el usuario que se desea consultar.
Dim dtUsuario As New CapaDato.dsUsuario.USUARIODataTable
En segundo lugar, instanciaremos la clase Usuario, que permitirá llamar el método ObtenerUsuario
Dim usu As New CapaNegocio.Usuario
Luego ejecutaremos el procedimiento que verificará la existencia del usuario ingresado, esto se puede hacer de dos formas, asignando el valor del resultado de la consulta al datatable creado o ejecutando el método y consultando directamente en el if, para ambos casos se presentan las siguientes líneas de código:
Caso I
dtUsuario = usu.ObtenerUsuario(usuario, clave)
If dtUsuario.Rows.Count > 0 Then
Session("NombreUsuario") = usuario
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(usuario, False)
End If
Caso II.
If usu.ObtenerUsuario(usuario, clave).Rows.Count > 0 Then
Session("NombreUsuario") = usuario
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(usuario, False)
End If
Con esto, podremos ver que se logra realizar consultas desde la capa de usuarios ingresando por la capa de negocios y luego por la capa de datos.
Ahora construiremos las páginas que deben administrar la información de usuarios como se ha hecho en la aplicación Windows.
El bloque de código completo se puede observar a continuación:
If Page.IsValid Then
Dim usuario As String = Me.txtUsuario.Text
Dim clave As String = Me.txtClave.Text
Dim dtUsuario As New CapaDato.dsUsuario.USUARIODataTable
Dim usu As New CapaNegocio.Usuario
dtUsuario = usu.ObtenerUsuario(usuario, clave)
If dtUsuario.Rows.Count > 0 Then
Session("NombreUsuario") = usuario
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(usuario, False)
End If
End If
End If
O también.
If Page.IsValid Then
Dim usuario As String = Me.txtUsuario.Text
Dim clave As String = Me.txtClave.Text
Dim dtUsuario As New CapaDato.dsUsuario.USUARIODataTable
Dim usu As New CapaNegocio.Usuario
If usu.ObtenerUsuario(usuario, clave).Rows.Count > 0 Then
Session("NombreUsuario") = usuario
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(usuario, False)
End If
End If
ADMINISTRACIÓN DE TIPOS DE PERSONAL.
Antes de crear la aplicación que administrará los tipos de personal, agregaremos en la capa de datos el dataset que definirá la administración de las tablas Cgp_PersonalTipo, Cgp_PersonalCargo y Cgp_Personal.
Para ello se deben seguir os siguientes pasos:
Crear una nueva página utilizando la plantilla MasteraPage.master, con el nombre de frmPersonalTipo.aspx.
Agregar un Label en la primera sección de la página definiendo el siguiente texto.
Agregar la referencia al archivo frmPersonalTipo.aspx en el archivo Web.sitemap, de la siguiente forma:
<siteMapNode url="" title="Parámetros" description="Permite la administración de parámetros">
<siteMapNode url="" title="Cargos" description="Administración de cargos del personal"/>
<siteMapNode url="frmPersonalTipo.aspx " title="Tipos" description="Administración de los tipos de personal"/>
siteMapNode>
Ejecutar la aplicación e ingresar a ésta, se podrá observar que al seleccionar la opción de menú de Parámetros>Tipo, se podrá ir a la interfaz de administración de tipos de Personal (frmPersonalTipo.aspx).
En el proyecto de Biblioteca de Clase CapaDato, agregaremos un nuevo elemento del tipo de conjunto de datos, con el nombre dsPersonal. Dentro de este archivo agregar las Tablas Tipo, Cargo y Personal, quedando de la siguiente forma:
En el formulario frmPersonalTipo.aspx, agregaremos los elementos que se muestran en la interfaz siguiente:
Label1, Name = lblAleatorio
TextBox1, Name = txtAleatorio
LinkButton1, Name = lnkAleatorio
Listbox1, Name = lbxTipo
LinkButton2, Name = lnkIngresar, Text = Ingresar Tipo
LinkButton3, Name = lnkModificar, Text = Modoficar Tipo
LinkButton4, Name = lnkEliminar, Text = Eliminar Tipo
LinkButton4, Name = lnkVolver, Text = Volver
Cambiar el estado de visibilidad de los controles lblAleatorio, txtAleatorio y lnkAleatorio a False, desde la ventana de propiedades.
En el editor de código de la página frmPersonalTipo.aspx, agregaremos el siguiente procedimiento:
Public Sub P_Inicializar(ByVal txt As String, ByVal estado As Boolean)
Me.txtAleatorio.Visible = estado
Me.lblAleatorio.Visible = estado
Me.lnkAleatorio.Visible = estado
Me.txtAleatorio.Text = ""
Me.lblAleatorio.Text = txt
Me.lnkAleatorio.Text = txt
End Sub
En el archivo Global.asax en el método que atiende el evento Session_Star agregar la siguiente variable:
Session("Opcion") = ""
Dentro de cada uno de los métodos que atienden los eventos clic de los linkButton agregar las siguientes líneas de código:
Protected Sub lnkIngresar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkIngresar.Click
Session("Opcion") = "Ingresar"
P_Inicializar(Session("Opcion").ToString(), True)
End Sub
Protected Sub lnkModificar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkModificar.Click
Session("Opcion") = "Modificar"
P_Inicializar(Session("Opcion").ToString(), True)
End Sub
Protected Sub lnkEliminar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkEliminar.Click
Session("Opcion") = "Eliminar"
lnkAleatorio_Click(sender, e)
End Sub
Protected Sub lnkVolver_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkVolver.Click
Response.Redirect("Default.aspx")
End Sub
En el método que atiende el evento clic del botón btnAleatorio, agregar las siguientes líneas de código:
Select Case Session("Opcion").ToString()
Case "Ingresar"
Case "Modificar"
Case "Eliminar"
End Select
Response.Redirect("frmPersonalTipo.aspx")
En el proyecto CapaNegocio, agregaremos un archive de Clase de Componente, que llamaremos Personal.
Arrastraremos desde el cuadro de herramientas el control TIPOTableAdapter, renombrándolo dalTipo.
Dentro del espacio de nombre de la clase de formulario frmPersonalTipo.aspx, agregaremos una instancia a la clase Personal, la cual se encuentra definida en el proyecto CapaNegocio.
Dim clsCn As New CapaNegocio.Personal
En el DataTable TIPO del Proyecto CapaDato agregaremos la siguiente consulta
SELECT TIP_CODIGO, TIP_DESCRIPCION, TIP_ESTADO
FROM TIPO
where TIP_ESTADO = 'A'
Quedando esta de la siguiente forma:
Asignaremos los nombres que se muestran en la siguiente imagen a los métodos Fill y GetData de la nueva consulta:
Presionar el botón siguiente y finalizar la generación de la consulta.
En el editor de código de la clase de componente Personal, definida en el proyecto CapaNegocio, agregaremos el siguiente procedimiento:
Public Function TipoConsultar() As CapaDato.dsPersonal.TIPODataTable
Return Me.dalTipo.GetDataByTipoConsultar()
End Function
Desde el administrador de propiedades de acceso directo del control lbxTipo, definido, agregaremos un proveedor de datos para desplegar la información de tipos en el lbxTipo, siguiendo los siguientes pasos:
· Seleccionar Elegir origen de datos, como se muestra en la siguiente figura:
· Seleccionar un nuevo origen de datos.
· Seleccionar origen de datos de objeto y asignar el nombre odsTipo, como se muestra en la siguiente figura:
· Inhabilitar la opción Mostrar solo componentes de datos y seleccionar desde la lista Objeto comercial, la opción CapaNegocio.Personal y presionar el botón siguiente
· En la interfaz de configuración de origen de datos, seleccionar el método TipoConsultar y presionar el botón siguiente. Como se muestra en la siguiente imagen
· Definir los campos que se van a mostrar y los que se van a asignar como valor
· Quedando el formulario, en esquena de diseño de la siguiente forma:
· Si ejecutamos la aplicación, veremos que los datos se despliegan de la siguiente forma:
Crear la lógica de ingreso de datos
Para crear la lógica de ingreso de datos, en el proyecto CapaDato y CapaNegocio, agregaremos las siguientes líneas de código.
- En el TableAdapter Tipo, que se encuentra en el dataset dsPersonal, definido en el proyecto CapaDato, crearemos una consulta que permitirá verificar, si un tipo definido, existe en la tabla Tipo, buscando por su descripción, de la siguiente forma:
SELECT TIP_CODIGO, TIP_DESCRIPCION, TIP_ESTADO FROM TIPO
WHERE TIP_DESCRIPCION = @TIP_DESCRIPCION
Nombraremos a esta consulta, para los métodos fill y get de la siguiente forma:
FillByTipoDescripcion
GetDataByTipoDescripcion
- Ahora crearemos la consulta que permitirá insertar los datos de tipo en la base de datos, como se muestra a continuación:
INSERT INTO TIPO
(TIP_DESCRIPCION, TIP_ESTADO)
VALUES ( @TIP_DESCRIPCION, 'A')
Nombrando la consulta InsertQuery como InsertQueryTipoInsertar
- Ahora, si el registro existe, lo que se debe hacer es habilitar el estado a Activo, para que se vuelva a mostrar en la lista, agregando la consulta de la siguiente forma:
UPDATE TIPO SET
TIP_ESTADO = 'A'
WHERE (TIP_DESCRIPCION = @TIP_DESCRIPCION)
Nombrando el UpdateQuery como UpdateQueryTipoInsertar
- En el proyecto de biblioteca de clase CapaNegocio, específicamente en el editor de código de la clase de componente Personal, agregar los siguientes métodos:
' consulta si existe lo que se esta ingresando
Public Function TipoDescripcion(ByVal txt As String) As CapaDato.dsPersonal.TIPODataTable
Return Me.dalTipo.GetDataByTipoDescripcion(txt)
End Function
' inserta un registro a la tabla Tipo
Public Sub TipoInsertar(ByVal txt As String)
Me.dalTipo.InsertQueryTipoInsertar(txt)
End Sub
' habilita un registro de la tabla tipo
Public Sub TipoInsertarActualizar(ByVal txt As String)
Me.dalTipo.UpdateQueryTipoInsertar(txt)
End Sub
- En el método lnkAleatorio_Click que se encuentra en el formulario frmPersonalTipo.aspx, el cual atiende el evento click del botón lnkAleatorio, agregar las siguientes líneas de código:
Select Case Session("Opcion").ToString()
Case "Ingresar"
If Me.txtAleatorio.Text.Length > 0 Then
End If
Case "Modificar"
Case "Eliminar"
End Select
Response.Redirect("frmPersonalTipo.aspx")
- En el case que atiende la opción Ingresar, agregaremos las siguientes líneas, dentro del bloque if, definido, como se muestra a continuación:
If Me.txtAleatorio.Text.Length > 0 Then
Dim dt As CapaDato.dsPersonal.TIPODataTable
dt = Me.clsCn.TipoDescripcion(Me.txtAleatorio.Text)
If dt.Rows.Count = 0 Then
Me.clsCn.TipoInsertar(Me.txtAleatorio.Text)
Else
Me.clsCn.TipoInsertarActualizar(Me.txtAleatorio.Text)
End If
End If
Crear la lógica de Modificación de datos
Para realizar esta acción, deberemos agregar las siguientes líneas de código en los proyectos CapaDato y CapaNegocio, siguiendo los siguientes pasos.
- En el TableAdapter Tipo, que se encuentra en el dataset dsPersonal, definido en el proyecto CapaDato, crearemos una consulta que permitirá modificar la descripción de un tipo definido, como se muestra a continuación:
UPDATE TIPO
SET TIP_DESCRIPCION = @TIP_DESCRIPCION
WHERE (TIP_CODIGO = @TIP_CODIGO)
Definiendo la consulta UpdateQuery com UpdateQueryTipoModificar
- En la Clase de Componente Personal, definida en el proyecto CapaNegocio, agregaremos las siguientes líneas de código:
' actualiza la descripción de un tipo habilitado
Public Sub TipoModificar(ByVal txt As String, ByVal cod As Decimal)
Me.dalTipo.UpdateQueryTipoModificar(txt, cod)
End Sub
- En el método lnkAleatorio_Click que atiende el evento clic del botón lnkAleatorio, que se encuentra en el formulario frmPersonalTipo.aspx, agregaremos las siguientes líneas de código, en la sección del Case “Modificar”:
If Me.txtAleatorio.Text.Length > 0 And _
Me.lbxTipo.SelectedIndex > -1 Then
Me.clsCn.TipoModificar(Me.txtAleatorio.Text, _
Decimal.Parse(Me.lbxTipo.SelectedValue.ToString()))
End If
Crear la lógica de eliminación de datos
Para realizar esta acción, deberemos agregar las siguientes líneas de código en los proyectos CapaDato y CapaNegocio, siguiendo los siguientes pasos.
- En el TableAdapter Tipo, que se encuentra en el dataset dsPersonal, definido en el proyecto CapaDato, crearemos una consulta que permitirá eliminar lógicamente un tipo definido, como se muestra a continuación:
UPDATE TIPO SET
TIP_ESTADO = 'I'
WHERE (TIP_CODIGO = @TIP_CODIGO)
Definiendo la consulta UpdateQuery con UpdateQueryTipoEliminar
- En la clase de Componente Personal, definido en el proyecto CapaNegocio, agregaremos las siguientes líneas de código:
' eliminar un registro lógicamente
Public Sub TipoEliminar(ByVal cod As Decimal)
Me.dalTipo.UpdateQueryTipoEliminar(cod)
End Sub
- En el método lnkAleatorio_Click que atiende el evento clic del botón lnkAleatorio, que se encuentra en el formulario frmPersonalTipo.aspx, agregaremos las siguientes líneas de código, en la sección del Case “Eliminar”:
If Me.lbxTipo.SelectedIndex > -1 Then
Me.clsCn.TipoEliminar( _
Decimal.Parse(Me.lbxTipo.SelectedValue.ToString()))
End If