Upload
mike-zamora
View
215
Download
9
Embed Size (px)
DESCRIPTION
Ejemplos
Citation preview
Antología
Universidad Tecnológica Costarricense Mike Zamora González Ingenieria de Sistemas Computacionales
PROGRAMACION EN CAPAS CON C# Tomado de varios documentos publicados en la Internet
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:2
Contenido No se encontraron elementos de tabla de contenido.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:3
1 Programación por capas.
La programación por capas es un estilo de programación en el que el objetivo primordial
es la separación de la lógica de negocios de la lógica de diseño. La ventaja principal de
este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en caso de
que sobrevenga algún cambio, sólo se ataca al nivel requerido sin tener que revisar
entre código mezclado. Un buen ejemplo de este método de programación sería el
modelo de interconexión de sistemas abiertos.
Dicho de otra manera, la programación en capas no es más que separar las
"responsabilidades" del software en distintos "responsables". Esta separación facilita la
mantención del software y permite, por ejemplo, cambiar fácilmente a los responsables.
Para que se entienda daré un ejemplo de la vida moderna.
Cuando una persona se somete a una operación, pasa por las manos de a lo menos
tres personas: un anestesiólogo, el cirujano y un instrumentista. El primero se encarga
de aplicar la anestesia, el segundo de realizar la operación y el tercero de facilitar al
cirujano los instrumentos que requiere para dicha operación. Si la operación es de
cerebro o de corazón la especialidad del cirujano debería ser distinta y por tanto el
cirujano será otro.
La programación en capas consiste precisamente en esto, identificar y separar las
responsabilidades en miembros especializados de modo que si se requiere cambiar a
un responsable, sea fácil hacerlo. La estructura más común de este concepto es la
programación en tres capas. En ésta los responsables son el encargado de los datos, el
encargado del negocio y el encargado de la interacción con el usuario.
Desde luego las responsabilidades varían dependiendo del sistema y por consecuencia
los responsables también, sin embargo, las responsabilidades antes mencionadas son
las más comunes en los sistemas de administración.
Espero que hasta este punto se entienda el concepto, y si es así, es probable que
algunos estén pensado algo como "¡Ok, suena bonito!, pero ¿cómo llevo esto a una
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:4
aplicación?", pronto lo veremos con unos ejemplos por ahora continuaremos con la
teoria.
La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios
niveles y, en caso de que sobrevenga algún cambio, solo se ataca al nivel requerido sin
tener que revisar entre código mezclado. Un buen ejemplo de este método de
programación sería el modelo de interconexión de sistemas abiertos.
Además, permite distribuir el trabajo de creación de una aplicación por niveles; de este
modo, cada grupo de trabajo está totalmente abstraído del resto de niveles, de forma
que basta con conocer la API que existe entre niveles.
En el diseño de sistemas informáticos actual se suelen usar las arquitecturas multinivel
o Programación por capas. En dichas arquitecturas a cada nivel se le confía una misión
simple, lo que permite el diseño de arquitecturas escalables (que pueden ampliarse con
facilidad en caso de que las necesidades aumenten).
El más utilizado actualmente es el diseño en tres niveles (o en tres capas)
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:5
1.1 Capas y niveles
1. Capa de presentación: la que ve el usuario (también se la denomina "capa de
usuario"), presenta el sistema al usuario, le comunica la información y captura la
información del usuario en un mínimo de proceso (realiza un filtrado previo para
comprobar que no hay errores de formato). También es conocida como interfaz
gráfica y debe tener la característica de ser "amigable" (entendible y fácil de
usar) para el usuario. Esta capa se comunica únicamente con la capa de
negocio.
2. Capa de negocio: es donde residen los programas que se ejecutan, se reciben
las peticiones del usuario y se envían las respuestas tras el proceso. Se
denomina capa de negocio (e incluso de lógica del negocio) porque es aquí
donde se establecen todas las reglas que deben cumplirse (Reglas de Negocio).
Esta capa se comunica con la capa de presentación, para recibir las solicitudes y
presentar los resultados, y con la capa de datos, para solicitar al gestor de base
de datos almacenar o recuperar datos de él. También se consideran aquí los
programas de aplicación, validaciones y procesos específicos de la informacion.
3. Capa de datos: es donde residen los datos y es la encargada de acceder a los
mismos. Está formada por uno o más gestores de bases de datos que realizan
todo el almacenamiento de datos, reciben solicitudes de almacenamiento o
recuperación de información desde la capa de negocio. Aquí no solo pueden ser
gestores de bases de datos, el alamacenamiento puede ser de cualquier tipo
existente. También hay preprocesamiento de datos y algunos procesos
específicos de la información.
Todas estas capas pueden residir en un único computador, si bien lo más usual es que
haya una multitud de servidores o computadores en donde reside la capa de
presentación (son los clientes de la arquitectura cliente/servidor). Las capas de negocio
y de datos pueden residir en el mismo computador, y si el crecimiento de las
necesidades lo aconseja se pueden separar en dos o más servidores o computadores.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:6
Así, si el tamaño o complejidad de la base de datos aumenta, se puede separar en
varios servidores o computadores los cuales recibirán las peticiones del computador en
que resida la capa de negocio.
Si, por el contrario, fuese la complejidad en la capa de negocio lo que obligase a la
separación, esta capa de negocio podría residir en uno o más servidores o
computadores que realizarían solicitudes a una única base de datos. En sistemas muy
complejos se llega a tener una serie de servidores o computadores sobre los cuales
corre la capa de negocio, y otra serie de servidores o computadores sobre los cuales
corre la base de datos.
En una arquitectura de tres niveles, los términos "capas" y "niveles" no significan lo
mismo ni son similares.
El término "capa" hace referencia a la forma como una solución es segmentada desde
el punto de vista lógico:
Presentación. (Conocida como capa Web en aplicaciones Web o como capa de
usuario en Aplicaciones Nativas)
Lógica de Negocio. (Conocida como capa Aplicativa)
Datos. (Conocida como capa de Base de Datos)
En cambio, el término "nivel" corresponde a la forma en que las capas lógicas se
encuentran distribuidas de forma física. Por ejemplo:
Una solución de tres capas (presentación, lógica del negocio, datos) que residen
en un solo computador (Presentación+lógica+datos). Se dice que la arquitectura
de la solución es de tres capas y un nivel.
Una solución de tres capas (presentación, lógica del negocio, datos) que residen
en dos servidores o computadores (presentación+lógica por un lado;
lógica+datos por el otro lado). Se dice que la arquitectura de la solución es de
tres capas y dos niveles.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:7
2 Programación en capas con un ejemplo en
C#
El ejemplo consistirá en algo tan simple como un mantenedor de datos de personas
(nombre, teléfono y correo electrónico) y nuestros responsables se encargarán de lo
siguiente:
2.1 Datos
Leerá y grabara los datos en un archivo de texto.
2.2 Negocio
Entregará los datos al encargado de la interacción con el usuario y se encarga de las
validaciones que serán dos:
El nombre no puede estar en blanco.
El correo electrónico, si es ingresado, debe ser válido.
2.3 Interface (interacción con el usuario)
Contendrá
Una grilla para mostrar y editar los datos.
Un botón Cargar
Un botón Guardar
2.4 Ejemplo.
Una vez definida las responsabilidades, es necesario tener en cuenta que hay un
elemento que los tres responsables deben conocer. Me refiero a la "persona" o mejor
dicho a sus datos, está claro que el encargado de datos debe saber que grabar y que
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:8
leer, el encargado de negocios debe saber sobre que aplicar las reglas de negocio y el
encargado de la interacción con el usuario debe saber que datos mostrar o pedir.
El siguiente diagrama ilustra lo anterior:
Para quienes no sepan interpretar el diagrama, se lee así:
Presentación utiliza Negocio
Uno o más Negocios utilizan solo un Dato
Presentación, Negocio y Dato requieren de Persona.
Al momento de construir la aplicación, es una buena práctica separar las
responsabilidades en proyectos distintos de manera que quede claramente indicada la
responsabilidad de cada proyecto, sin embargo, me ha tocado ver aplicaciones en
donde separan las responsabilidades en carpetas, el único problema importante que
veo en separar en carpetas es que podrían generarse conflictos de responsabilidad y
desorden, por ejemplo, un programador inexperto podría utilizar el método grabar de la
clase Dato desde la Presentación, lo que implicaría que se estaría saltando las reglas
de negocios, en nuestro caso, no se validaría el nombre ni el correo electrónico.
De todos modos aquí está el código:
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:9
2.4.1 Presentación: namespace EjemploTresCapas
{
partial class Presentacion
{
/// <summary>
/// Variable del diseñador requerida.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Limpiar los recursos que se estén utilizando.
/// </summary>
/// <param name="disposing">true si los recursos administrados se deben
eliminar; false en caso contrario.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Código generado por el Diseñador de Windows Forms
/// <summary>
/// Método necesario para admitir el Diseñador. No se puede modificar
/// el contenido del método con el editor de código.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.dgPersona = new System.Windows.Forms.DataGridView();
this.nombreDataGridViewTextBoxColumn = new
System.Windows.Forms.DataGridViewTextBoxColumn();
this.telefonoDataGridViewTextBoxColumn = new
System.Windows.Forms.DataGridViewTextBoxColumn();
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:10
this.emailDataGridViewTextBoxColumn = new
System.Windows.Forms.DataGridViewTextBoxColumn();
this.personaBindingSource = new
System.Windows.Forms.BindingSource(this.components);
this.btnCargar = new System.Windows.Forms.Button();
this.btnGrabar = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.dgPersona)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.personaBindingSource)).BeginInit();
this.SuspendLayout();
//
// dgPersona
//
this.dgPersona.AllowUserToOrderColumns = true;
this.dgPersona.Anchor =
((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dgPersona.AutoGenerateColumns = false;
this.dgPersona.ColumnHeadersHeightSizeMode =
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgPersona.Columns.AddRange(new
System.Windows.Forms.DataGridViewColumn[] {
this.nombreDataGridViewTextBoxColumn,
this.telefonoDataGridViewTextBoxColumn,
this.emailDataGridViewTextBoxColumn});
this.dgPersona.DataSource = this.personaBindingSource;
this.dgPersona.Location = new System.Drawing.Point(0, 0);
this.dgPersona.Name = "dgPersona";
this.dgPersona.Size = new System.Drawing.Size(737, 368);
this.dgPersona.TabIndex = 0;
//
// nombreDataGridViewTextBoxColumn
//
this.nombreDataGridViewTextBoxColumn.DataPropertyName = "Nombre";
this.nombreDataGridViewTextBoxColumn.HeaderText = "Nombre";
this.nombreDataGridViewTextBoxColumn.Name =
"nombreDataGridViewTextBoxColumn";
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:11
//
// telefonoDataGridViewTextBoxColumn
//
this.telefonoDataGridViewTextBoxColumn.DataPropertyName = "Telefono";
this.telefonoDataGridViewTextBoxColumn.HeaderText = "Telefono";
this.telefonoDataGridViewTextBoxColumn.Name =
"telefonoDataGridViewTextBoxColumn";
//
// emailDataGridViewTextBoxColumn
//
this.emailDataGridViewTextBoxColumn.DataPropertyName = "Email";
this.emailDataGridViewTextBoxColumn.HeaderText = "Email";
this.emailDataGridViewTextBoxColumn.Name =
"emailDataGridViewTextBoxColumn";
//
// personaBindingSource
//
this.personaBindingSource.DataSource =
typeof(EjemploTresCapas.Entidad.Persona);
//
// btnCargar
//
this.btnCargar.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Right)));
this.btnCargar.Location = new System.Drawing.Point(569, 374);
this.btnCargar.Name = "btnCargar";
this.btnCargar.Size = new System.Drawing.Size(75, 23);
this.btnCargar.TabIndex = 1;
this.btnCargar.Text = "Cargar";
this.btnCargar.UseVisualStyleBackColor = true;
this.btnCargar.Click += new System.EventHandler(this.btnCargar_Click);
//
// btnGrabar
//
this.btnGrabar.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Right)));
this.btnGrabar.Location = new System.Drawing.Point(650, 374);
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:12
this.btnGrabar.Name = "btnGrabar";
this.btnGrabar.Size = new System.Drawing.Size(75, 23);
this.btnGrabar.TabIndex = 2;
this.btnGrabar.Text = "Grabar";
this.btnGrabar.UseVisualStyleBackColor = true;
this.btnGrabar.Click += new System.EventHandler(this.btnGrabar_Click);
//
// Presentacion
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(737, 404);
this.Controls.Add(this.btnGrabar);
this.Controls.Add(this.btnCargar);
this.Controls.Add(this.dgPersona);
this.Name = "Presentacion";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.dgPersona)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.personaBindingSource)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.DataGridView dgPersona;
private System.Windows.Forms.Button btnCargar;
private System.Windows.Forms.Button btnGrabar;
private System.Windows.Forms.DataGridViewTextBoxColumn
nombreDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn
telefonoDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn
emailDataGridViewTextBoxColumn;
private System.Windows.Forms.BindingSource personaBindingSource;
}
}
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:13
using EjemploTresCapas.Entidad;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Windows.Forms;
namespace EjemploTresCapas
{
public partial class Presentacion : Form
{
private Negocio.Negocio _negocio;
public Presentacion()
{
InitializeComponent();
_negocio = new
Negocio.Negocio(ConfigurationManager.AppSettings["ArchivoDatos"]);
personaBindingSource.DataSource = new List<Persona>();
}
private void btnCargar_Click(object sender, EventArgs e)
{
try
{
personaBindingSource.DataSource = _negocio.Leer();
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
private void btnGrabar_Click(object sender, EventArgs e)
{
try
{
if (personaBindingSource.DataSource != null &&
personaBindingSource.DataSource is List<Persona>)
_negocio.Grabar(personaBindingSource.DataSource as List<Persona>);
}
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:14
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
}
}
2.4.2 Negocio: using EjemploTresCapas.Dato;
using EjemploTresCapas.Entidad;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
namespace EjemploTresCapas.Negocio
{
public class Negocio
{
private bool _emailInvalido;
private Datos _dao;
public Negocio(string nombreArchivo)
{
this._dao = Datos.Instancia(nombreArchivo);
}
public List<Persona> Leer()
{
return this._dao.Leer();
}
public void Grabar(List<Persona> datos)
{
foreach (Persona item in datos)
{
if (string.IsNullOrWhiteSpace(item.Nombre))
throw new Exception("El nombre de la persona no puede ser
vacio.");
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:15
if (!string.IsNullOrEmpty(item.Email) && !IsValidEmail(item.Email))
throw new Exception(string.Format("El correo electrónico {0} no
es válido", item.Email));
}
this._dao.Grabar(datos);
}
public bool IsValidEmail(string strIn)
{
_emailInvalido = false;
if (String.IsNullOrEmpty(strIn))
return false;
// Use IdnMapping class to convert Unicode domain names.
try
{
strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper,
RegexOptions.None, TimeSpan.FromMilliseconds(200));
}
catch (RegexMatchTimeoutException)
{
return false;
}
if (_emailInvalido)
return false;
// Return true if strIn is in valid e-mail format.
try
{
return Regex.IsMatch(strIn,
@"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-
!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-
z0-9]{2,17}))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException)
{
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:16
return false;
}
}
private string DomainMapper(Match match)
{
// IdnMapping class with default property values.
IdnMapping idn = new IdnMapping();
string domainName = match.Groups[2].Value;
try
{
domainName = idn.GetAscii(domainName);
}
catch (ArgumentException)
{
_emailInvalido = true;
}
return match.Groups[1].Value + domainName;
}
}
}
2.4.3 Dato: using EjemploTresCapas.Entidad;
using System.Collections.Generic;
using System.IO;
namespace EjemploTresCapas.Dato
{
public class Datos
{
private static Datos datos;
public string NombreArchivo { get; private set; }
public static Datos Instancia(string nombreArchivo)
{
if (datos == null)
datos = new Datos(nombreArchivo);
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:17
return datos;
}
private Datos()
{
}
private Datos(string nombreArchivo)
{
this.NombreArchivo = nombreArchivo;
}
public List<Persona> Leer()
{
List<Persona> datos = new List<Persona>();
if (File.Exists(NombreArchivo))
{
using (StreamReader sr = new StreamReader(NombreArchivo))
{
while (!sr.EndOfStream)
{
string[] arrDatos = sr.ReadLine().Split(';');
datos.Add(new Persona(arrDatos[0], arrDatos[1],
arrDatos[2]));
}
sr.Close();
}
}
else
throw new FileNotFoundException("No se encontró el archivo " +
NombreArchivo);
return datos;
}
public void Grabar(List<Persona> datos)
{
using (StreamWriter sr = new StreamWriter(NombreArchivo, false))
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:18
{
foreach (Persona item in datos)
sr.WriteLine(item.ToString());
sr.Flush();
sr.Close();
}
}
}
}
2.4.4 Entidad: namespace EjemploTresCapas.Entidad
{
public class Persona
{
public string Nombre { get; set; }
public string Telefono { get; set; }
public string Email { get; set; }
public Persona() : this (string.Empty,string.Empty,string.Empty)
{
}
public Persona(string nombre, string telefono, string email)
{
this.Nombre = nombre;
this.Telefono = telefono;
this.Email = email;
}
public override string ToString()
{
return string.Format("{0};{1};{2}", Nombre, Telefono, Email);
}
}
}
Les dejo como tarea, cambiar la capa de datos por una en la cual los datos sean
guardados en una base de datos o en un archivo XML.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:19
Para terminar, me queda señalar que si bien en el ejemplo pusimos la validación del
nombre obligatorio como parte de nuestro negocio, esta responsabilidad podría
trasladarse a la presentación, esto se debe a que es común en los lenguajes modernos
tener controles inteligentes que, por ejemplo, obligan a ingresar datos, formatean
cuadros de texto, realizan validaciones de forma, etc. La decisión de donde poner cada
responsabilidad dependerá de la aplicación que se esté desarrollando.
Los métodos de validación del correo electrónico se obtuvieron desde
msdn.microsoft.com del artículo Cómo: Comprobar si las cadenas tienen un formato de
correo electrónico válido
3 Otro Ejemplo de Programacion en tres
capas con C# usando asp.net
En este ejemplo vamos a realizar una aplicacion usando el visual studio instalado con
C#, en donde paso a paso se mostrara como crear un programa en C# utilizando tres
capas, donde la tercera capa de presentacion se realizara en ASP.NET, este ejemplo
se ha realizado con lujo de detalles para que no existan dudas, pero aun asi, si las hay
favor de comentarlas.
3.1 Los requerimientos
Antes de comenzar necesitamos instalar
1. Visual Studio (en este ejemplo se usara 2008)
2. SQL Server (se puede usar cualquier gestor teniendo en cuenta que la cadena
de conexion cambiara, se recomienda usar SQL SERVER ya que el ejemplo que
se muestra tiene la intencion de evitar errores pero si tienes experiencia en otro
gestor se puede usar)
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:20
3.2 Empezemos con la cadena de conexion
La cadena de conexion es una de las partes mas importantes de este programa puesto
que es con lo que nuestra base de datos se comunicara con el programa,
especificamente solamente con la capa de datos, si tienes algo de experiencia con sql
server esto deberia ser algo sencillo para ti.
Despues de instalar SQL Server, se realiza una prueba de conexion donde podras
ingresar tu login sa y tu password (el cual se ingreso al instalar SQL), despues de que
se realize esta prueba satisfactoriamente, desconectate, con el boton y vuelve a
conectarte con el boton , asi podemos asegurar que lo que vamos a colocar en la
cadena de conexion sean parametros validos, y asi evitar errores.
Para realizar la cadena de conexion debemos saber 4 datos.
1. El nombre de nuestro servidor identificado como “Data Source” en la cadena de
conexion
2. El nombre de nuestra base de datos como “Initial Catalog”
3. El nombre de el usuario “User”
4. El password con el que se identifica el usuario “Password”
Todos estos datos a exepcion de el nombre de la base de datos (Initial Catalog) los
encontramos cuando nos conectamos con sql server asi que la siguente imagen aclara
los siguientes pasos de como construir la cadena de conexion.
Pasa a la siguiente pagina…
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:21
Para crear la cadena solo debemos substituir los datos mostrados en la imagen anterior
aqui dejo la cadena para que no exista confusion a la hora de transcibir
@"Data Source=???????????;Initial Catalog=??????;User ID=sa;Password=????????"
Nuestra ultima duda para la cadena de conexion es Initial Catalog la cual para efectos
de este ejemplo le asignaremos Empleados entonces nuestra cadena quedaria de la
siguiente manera
@"Data Source=???????????;Initial Catalog=Empleados;User ID=sa;Password=????????"
Si cuentas con conocimientos de base de datos solo asigna cualsea el nombre de tu
base de datos.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:22
3.3 Crear la base de datos e insertar un registro
Ahora nos conectamos en SQL Server y dando click en la opcion New Query escribimos
create database Empleados
y presionamos F5 nos deberia mandar el mensaje Command(s) completed successfully., con eso hemos creado la base de datos llamada Empleados ahora
tenemos que decirle a SQL que esa es la base de datos que queremos usar entonces
escribimos
use Empleados
y presionamos nuevamente F5 y nos vuelve a enviar el mensaje Command(s) completed successfully. ya creada la base de datos necesitamos crear una tabla
donde se puedan guardar nuestros datos que vamos a utilizar para esta nuestra
aplicacion entonces escribimos el siguiente script y presionamos F5
create table Datos
(
id int identity primary key not null,
strNombre varchar(20),
strApellido varchar(20),
intEdad tinyint
)
Este script crea la una tabla llamada Datos la cual tiene 4 campos:
1. id: es la llave primaria, es de tipo entero y no acepta valores nulos, y sirve para
darle un identificar al empleado.
2. strNombre: es de tipo varchar con capacidad para 20 caracteres el cual nos
sirve para almacenar el nombre del empleado.
3. strApellido: es de tipo varchar con capacidad para 20 caracteres el cual nos
sirve para almacenar el apellido del empleado.
4. intEdad: es de tipo entero de capacidad para guardar valores de hasta 127 el
cual nos sirve para almacenar la edad del empleado.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:23
Ahora ya con la tabla Datos vamos a hacerlo un poco mas interesante, crearemos un
procedimiento almacenado para que nuestro programa pueda guardar los datos
introducidos desde la capa de presentacion.
En SQL escribimos el siguiente script para crear nuestro procedimiento y presionamos
F5
create proc insDatos
(
@nombre varchar(20),
@apellido varchar(20),
@edad int
)
as insert into Datos values(@nombre,@apellido,@edad)
Este procedimiento realiza un insert y lo ejecutamos de la siguiente manera con su
correspondiente F5 despues de escribirlo
exec insDatos 'Juan','Perez',23
solo necesitamos saber los el tipo de argumentos que toma y el nombre del
procedimiento. Ahora solo nos falta verificar que el registro se haya incluido en nuestra
base de datos eso lo realizamos con lo siguiente seguido de un F5
select * from Datos
Con esto sql nos presentara en la ventana Results que se muestra en la imagen de
bajo, con los datos que corresponden a la insercion realizada por nuestro
procedimiento.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:24
Si lo deseas y tienes experiencia con scripts aqui pongo todo lo que se necesita para
nuestro ejemplo, un simple copy/paste realizara todo lo necesario
create database Empleados
GO
use Empleados
GO
create table Datos
(
id int identity primary key not null,
strNombre varchar(20),
strApellido varchar(20),
intEdad tinyint
)
GO
create proc insDatos
(
@nombre varchar(20),
@apellido varchar(20),
@edad int
)
as insert into Datos values(@nombre,@apellido,@edad)
GO
exec insDatos 'Juan','Perez',23
GO
select * from Datos
GO
Con esto finalizamos en nuestra base de datos es hora de programar en 3 capas
3.4 Capa de datos
Ya tenemos configurada nuestra base de datos lista para ser usada, ahora abriremos
Visual Studio y crearemos un nuevo proyecto en apartado tipo de proyecto
seleccionamos Visual C# y despues seleccionamos Windows, dentro de plantillas
seleccionamos Plantillas instaladas de Visual Studio despues Biblioteca de Clases,
llamaremos a nuestro proyecto Datos y la solucion llamada TresCapas, en la siguiente
imagen se aclara los pasos antes descritos para la configuracion de nuestra solucion
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:25
Ahora en Visual Studio nos presenta una clase llamada Class1.cs que nosotros no
pedimos, por lo que la eliminaremos, haciendo click derecho sobre la clase en el
explorador de soluciones y seleccionaremos eliminar, a continuacion Visual Studio nos
pedira una confirmacion a la cual aceptaremos.
Ahora crearemos una clase llamada Configuracion en la cual pondremos nuesta cadena
de conexion que anteriormente generamos para ello en el explorador de soluciones
seleccionaremos el proyecto Datos y le haremos un click derecho para que nos muestre
las opciones en ellas seleccionaremos agregar y por ultimo en el menu emergente
seleccionaremos clase, todo el proceso se muestra en la siguiente imagen
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:26
El paso anterior nos llevara a una pantalla donde se muestra todos los elementos que
Visual Studio puede agregar a nuestro proyecto, pero como hemos elegido agregar una
clase, Visual Studio tiene todo seleccionado por nosotros lo unico que hay que hacer en
este paso es escribir el nombre de nuestra clase la cual llamaremos Configuracion en el
cuadro de texto y dar click en agregar, a continuacion se muestra una imagen del
proceso.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:27
Ahora Visual Studio nos muestra la estructura basica de nuestro programa, para hacer
nuestra clase de configuracion tenemos que hacer publica nuestra clase agregandole la
palabra reservada public antes de class y acontinuacion creamos una cadena de
caracteres que contendra la cadena de conexion antes creada, y con esto ya
establecido le crearemos un metodo a la clase Configuracion el cual se llamara
CadenaConexion, y se encargara de proporcionar la cadena de conexion a cualquier
proceso que la necesite, el codigo siguiente muestra como deberia de quedar nuestra
clase y abajo se muestra una imagen de la clase en Visual Studio.
public class Configuracion
{
static string cadenaConexion =
@"Data Source=???;Initial Catalog=Empleados;User ID=sa;Password=???";
public static string CadenaConexion
{
get { return cadenaConexion; }
}
}
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:28
En el dado caso que se desee acceder con autentificacion de windows lo que se tiene
que hacer es agregar Trusted_Connection=true o Integrated Security=SSPI a la linea de
conexion en vez de el usuario y el password.
El siguiente paso es agregar otra clase de la misma manera que lo hicimos con
Configuracion, pero esta vez nuestra clase se llamara MetodosDatos, esta clase tendra
la tarea de acceder a la base de datos para que los metodos puedan obtener la
informacion de nuestra base de datos.
Al igual que configuracion le agregaremos la propiedad de public, pero ademas a esta
clase le agregaremos dos referencias.
using System.Data.SqlClient;
using System.Data;
Las cuales se insertan antes del namespace estas referencias nos sirven para llamar
metodos ya establecidos en C#, A continuacion agregaremos los siguientes tres
métodos:
CrearComando
Este metodo nos servira para crear un comando sql estandard como un select el cual
sera regresado por su metodo return
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:29
public static SqlCommand CrearComando()
{
string _cadenaConexion = Configuracion.CadenaConexion;
SqlConnection _conexion = new SqlConnection();
_conexion.ConnectionString = _cadenaConexion;
SqlCommand _comando = new SqlCommand();
_comando = _conexion.CreateCommand();
_comando.CommandType = CommandType.Text;
return _comando;
}
CrearComandoProc
Este metodo al igual que el anterior nos crea un comando sql, pero con la diferencia
que este metodo nos creara nuestro comando de manera que pueda ejecutar nuestro
procedimiento almacenado que establecimos anteriormente llamado InsDatos.
public static SqlCommand CrearComandoProc()
{
string _cadenaConexion = Configuracion.CadenaConexion;
SqlConnection _conexion = new SqlConnection(_cadenaConexion);
SqlCommand _comando = new SqlCommand("InsDatos", _conexion);
_comando.CommandType = CommandType.StoredProcedure;
return _comando;
}
EjecutarComandoInsert
Este metodo obtiene como parametro un comando sql que proviene de el metodo
anterior CrearComandoProc, este metodo ejecuta el procedimineto almacenado que se
le ha asignado al comando. En la siguiente clase que agregaremos veremos como se le
asigna el procedimiento almacenado a este comando.
public static int EjecutarComandoInsert(SqlCommand comando)
{
Try
{
comando.Connection.Open();
return comando.ExecuteNonQuery();
}
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:30
catch { throw; }
finally
{
comando.Connection.Dispose();
comando.Connection.Close();
}
}
EjecutarComandoSelect
Este metodo ejecutara un comando select el cual nos regresara un datatable con todos
los registros que se encuentren en alguna tabla dada, toma como parametro el
comando que contiene la sentencia sql select.
public static DataTable EjecutarComandoSelect(SqlCommand comando)
{
DataTable _tabla = new DataTable();
try{
comando.Connection.Open();
SqlDataAdapter adaptador = new SqlDataAdapter();
adaptador.SelectCommand = comando;
adaptador.Fill(_tabla);
}
catch (Exception ex)
{ throw ex; }
finally
{ comando.Connection.Close(); }
return _tabla;
}
Estas serian todas las clases que MetodosDatos.cs contendra.
Ahora crearemos la clase que generara los comandos que se pasaron como
parametros en la clase anterior MetodosDatos.cs.
Al igual que creamos las clases Configuracion y MetodosDatos anteriores crearemos
una clase llamada AccesoDatos y se le agregara la propiedad public y las referencias.
using System.Data.SqlClient;
using System.Data;
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:31
de la misma manera que se realizo en la clase MetodosDatos.cs. En esta clase
utilizaremos dos metodos:
Insert
Esta clase obtiene un comando sql proveniente de la clase MetodosDatos de su metodo
CrearComandoProc le agrega los parametros que se necesitan para completar el
procedimiento almacenado y despues lo ejecuta con el metodo EjecutarComandoInsert
que se encuentra en la clase MetodosDatos, de esta manera podemos ingresar
informacion a nuestra base de datos tan solo con asignarle parametros a nuestro
metodo Insert el cual tiene asignados 3 parametros Nombre, Apellido y Edad los cuales
son los campos que tenemos asignados en nuestra base de datos.
public int Insert(string Nombre, string Apellido, int Edad)
{
SqlCommand _comando = MetodosDatos.CrearComandoProc();
_comando.Parameters.AddWithValue("@nombre", Nombre);
_comando.Parameters.AddWithValue("@apellido", Apellido);
_comando.Parameters.AddWithValue("@edad", Edad);
return MetodosDatos.EjecutarComandoInsert(_comando);
}
ObtenerEmpleados
Esta clase obtiene un comando del metodo CrearComando de la Clase Metodos Datos
lo almacena en _comando y despues le agrega la sentencia a ejecutar y por medio de
el metodo EjecutarComandoSelect la ejecuta y nos regresa un DataTable que es un
objeto de datos que contiene la estructura de una tabla (filas, columnas, registros, etc).
public static DataTable ObtenerEmpleados()
{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT * FROM Datos";
return MetodosDatos.EjecutarComandoSelect(_comando);
}
Estas dos clases integran a AccesoDatos.cs.
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:32
Con esto hemos terminado con nuestra capa de datos es hora de crear nuestra capa de
negocio.
3.5 Capa de negocio
Para crear nuestra capa de negocio empezaremos por crear un nuevo proyecto, para
esto nos situaremos en el explorador de soluciones y le haremos un click derecho a
nuestra solucion llamada Tres Capas la cual nos presentara un menu y elegiremos
Agregar y en el menu emergente seleccionaremos Nuevo Proyeto.
Ahora Visual estudio nos presenta todos los tipos de proyectos que podemos agregar a
nuestra solucion, al igual que en Datos agregaremos una biblioteca de clases para ello
en tipos de proyecto seleccionamos Windows y en plantillas seleccionamos Biblioteca
de Clases, despues le asignamos el nombre de nuestra segunda capa en esta caso le
llamaremos Negocio y le daremos aceptar.
De igual manera que realizamos con la capa de Datos, Visual Studio nos presenta una
clase Class1.cs que no pedimos por lo que la borraremos y crearemos una nueva
llamada AccesoLogica esta sera la encargada de enviar y recibir informacion de las dos
capas la de Datos y la de Presentacion.
Ya con nuestra clase AccesoLogica.cs necesitamos agregar la referencia de nuestra
capa anterior por lo que en referencias del proyecto negocio le haremos un click
derecho y seleccionaremos agregar referencia.
Visual Studio nos presenta una ventana en la cual podemos elegir varios tipos de
referencias, en esta ventana seleccionaremos la pestaña de Proyectos y ahi nos
aparece nuestra biblioteca de clases Datos la cual esta contenida en nuestra Solucion
llamada TresCapas. la seleccionamos y aceptamos.
Ya con la referencia agregada, la podemos usar en nuestra clase AccesoLogica para
usarla debemos agregarla de igual manera que lo hicimos en las clases anteriormente
creadas, en la parte superior de nuestra clase agregamos.
using System.Data;
using System.Data.SqlClient;
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:33
Ahora agregaremos la propiedad de public a nuestra clase AccesoLogica.
Con lo anterior en su lugar podemos empezar a crear nuestros metodos para nuestra
clase que en este caso seran solo dos ObtenerEmpleados e Insert
El metodo ObtenerEmpleados de esta clase AccesoLogica utiliza el metodo con el
mismo nombre que se establecio en la capa de Datos que se encuentra en
AccesoDatos, el cual recordaremos que nos regresa un Datatable conteniendo el
resultado de la sentencia select. de esta manera la capa de negocio se comunica con la
capa de datos y obtiene informacion proveniente de la base de datos.
public static DataTable ObtenerEmpleados()
{
return AccesoDatos.ObtenerEmpleados();
}
El metodo Insert recibe los parametros Nombre, Apellido y Edad y los envia por medio
de una instancia de AccesoDatos a su metodo Insert.
public int Insert(string Nombre, string Apellido, int Edad)
{
AccesoDatos acceso = new AccesoDatos();
return acceso.Insert(Nombre, Apellido, Edad);
}
Con esto terminamos nuestra capa de Negocio y continuamos con nuestra ultima capa
la capa de Presentacion.
3.6 Capa de presentacion
La ulima capa sera de presentacion y la realizaremos en ASP.NET, para esto debemos
agregar un proyecto a nuestra solucion, para ello haremos click derecho en nuestra
solucion llamada TresCapas seleccionaremos agregar y ejemploeriormente Nuevo
Proyecto.
A continuacion se muestra la pantalla de agregar nuevo proyecto en el cual
seleccionaremos en tipo de proyectos, Visual C# y acontinuacion Web, ahora en
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:34
plantillas seleccionaremos Aplicacion Web ASP.NET y le asignaremos el nombre de
Presentacion y aceptaremos.
Ahora Visual Studio nos presentara Default.aspx el cual es un formulario web que
contiene etiquetas de tipo HTML y XML el cual nos sirve para presentar la informacion a
nuestro usuario. En esta ventana Visual Studio nos muestra lo que contiene
Default.aspx que es la estructura basica de una aplicacion web.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="Presentacion._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Página sin título</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
Ahora apartir de esto empezaremos a agregar los elementos que necesitaremos para
nuestra ultima capa, Para empezar cambiaremos el titulo de la pagina modificandole el
title, le pondremos Tres Capas como titulo como se muestra acontinuacion
<title>Tres Capas</title>
dentro de la etiqueta <div> agregaremos una etiqueta llamada lblMensaje la cual se
encargara de darle informacion a nuestro usuario de lo que esta sucediendo con
nuestro programa.
<div>
<asp:Label ID="lblMensaje" runat="Server" ForeColor="red" EnableViewState="False"/>
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:35
</div>
Despues de haber agregado nuestra etiqueta debajo de ella agregaremos una tabla la
cual contendra 7 filas.
<asp:Label ID="lblMensaje" runat="Server" ForeColor="red" EnableViewState="False"/>
<table style="border:2px solid #cccccc;">
<tr></tr>
<tr></tr>
<tr></tr>
<tr></tr>
<tr></tr>
<tr></tr>
<tr></tr>
</table>
Se escribiran acontinuacion el contenido de cada fila de la tabla.
Fila 1: A esta fila por ser el encabezado se le cambiara el estilo, tendra el fondo azul y
color de letra blanco, y se expande a lo largo de toda la tabla ocupando las 3 columnas
que contendra nuestra tabla, en el encabezado contrendra el mensaje de Agregar
Registros.
<tr style="background-color:#507CD1;color:White;">
<th colspan="3">Agregar Registros</th>
</tr>
Fila 2: Esta fila contendra tres columnas identificadas por la etiqueta <td> en la primera
columna se mostrara el mensaje Nombre para hacer referencia a el parametro
necesario para obtener el nombre, en la segunda columna, se colocara un textbox para
que el usuario introduzca el nombre a guardar en la base de datos el cual tendra el
nombre de txtNombre, la ultima columna contiene un validador de nombre val1 que
tendra la funcion de avisar al usuario que ha cometido un error al ingresar datos en
txtNombre.
<tr>
<td>Nombre:</td>
<td>
<asp:TextBox ID="txtNombre" runat="Server"></asp:TextBox>
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:36
</td>
<td>
<asp:RequiredFieldValidator ID="val1" runat="Server" Text="*"
ControlToValidate="txtNombre"
Display="dynamic"></asp:RequiredFieldValidator>
</td>
</tr>
Fila 3: Al igual que la fila anterior tiene 3 columnas, en la primera columna el mensaje
nombre en la segunda un textbox el con el nombre de txtApellido el cual nos provee de
el apellido a guardar en la base de datos y por ultimo en la columna 3 un validador de
nombre val2 el cual se encarga de verificar que el usuario indroduzca valores correctos
en txtApellido.
<tr>
<td>
Apellido:
</td>
<td>
<asp:TextBox ID="txtApellido" runat="Server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="val2" runat="Server" Text="*"
ControlToValidate="txtApellido"
Display="dynamic"></asp:RequiredFieldValidator>
</td>
</tr>
Fila 4: Esta fila en su columna 1 contiene el mensaje Edad, en la segunda columna se
encuentra un textbox de nombre txtEdad el cual es mas pequeño que los textbox
anteriores por su propiedad columns, en la ultima columna se encuentra un validador de
nombre val3 este validador verifica que el usuario solo ingrese numeros en el textbox
txtEdad, al ocurrir este error se le presenta al usurario un mensaje de error.
<td>
<asp:TextBox ID="txtEdad" runat="Server" Columns="4"></asp:TextBox>
</td>
<td>
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:37
<asp:RequiredFieldValidator ID="val3" runat="Server" Text="*"
ControlToValidate="txtEdad"
Display="dynamic"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="Comp" runat="Server" Text="Solo Enteros"
ControlToValidate="txtEdad"
Operator="DataTypeCheck" Type="Integer"></asp:CompareValidator>
</td>
</tr>
Fila 5: La fila cinco contendra dos botones uno nos servira para tomar la informacion
recolectada de los textbox y enviarla a la base de datos, el otro boton nos servira para
recibir todos los registros contenidos en la base de datos, los cuales tendran un evento
OnClick llamados Agregar y gvMostrar respectivamente.
<tr>
<td>&nbsp;</td>
<td>
<asp:Button ID="btnEnviar" runat="server" Text="Enviar" OnClick="Agregar" />
</td>
<td>
<asp:Button ID="Load" runat="server" Text="Mostrar" OnClick="gvMostrar" />
</td>
</tr>
Fila 6:Esta fila solo servira para separar a los botones de la fila 5 con el gridview de la
fila 7.
<tr>
<td/>
</tr>
Fila 7: En esta fila se encuentra el GridView que contendra los datos que previamente
se habran ido agregando a nuestra base de datos. En este GridView se tienen que
identificar los nombres de los campos que se quieren mostrar en la propiedad
BoundField DataField y en la propiedad de HeaderText tenemos el nombre de el campo
a mostrar en nuestra aplicacion.
<td colspan="3" align=center>
<asp:GridView ID="GridView" runat="server" AutoGenerateColumns="false">
<Columns>
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:38
<asp:BoundField DataField="id" HeaderText="Id" />
<asp:BoundField DataField="strNombre" HeaderText="Nombre" />
<asp:BoundField DataField="strApellido" HeaderText="Apellido" />
<asp:BoundField DataField="intEdad" HeaderText="Edad" />
</Columns>
</asp:GridView>
</td>
Con lo anterior definido, hemos completado la Interface de usuario, el codigo completo
se presenta acontinuacion asi como la ilustracion de como debe quedar.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="Presentacion._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Tres Capas</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblMensaje" runat="Server" ForeColor="red"
EnableViewState="False"/>
<table style="border:2px solid #cccccc;">
<tr style="background-color:#507CD1;color:White;">
<th colspan="3">Agregar Registros</th>
</tr>
<tr>
<td>
Nombre:
</td>
<td>
<asp:TextBox ID="txtNombre" runat="Server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:39
Apellido:
</td>
<td>
<asp:TextBox ID="txtApellido" runat="Server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="val2" runat="Server" Text="*"
ControlToValidate="txtApellido"
Display="dynamic"></asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>
Edad:
</td>
<td>
<asp:TextBox ID="txtEdad" runat="Server"
Columns="4"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="val3" runat="Server" Text="*"
ControlToValidate="txtEdad"
Display="dynamic"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="Comp" runat="Server" Text="Solo
Enteros" ControlToValidate="txtEdad"
Operator="DataTypeCheck" Type="Integer"></asp:CompareValidator>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>
<asp:Button ID="btnEnviar" runat="server" Text="Enviar"
OnClick="Agregar" />
</td>
<td>
<asp:Button ID="Load" runat="server" Text="Mostrar"
OnClick="gvMostrar" />
</td>
</tr>
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:40
<tr>
<td/>
</tr>
<tr>
<td colspan="3" align=center>
<asp:GridView ID="GridView" runat="server"
AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="id" HeaderText="Id" />
<asp:BoundField DataField="strNombre"
HeaderText="Nombre" />
<asp:BoundField DataField="strApellido"
HeaderText="Apellido" />
<asp:BoundField DataField="intEdad"
HeaderText="Edad" />
</Columns>
</asp:GridView>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Para realizar la programacion de esta parte primero necesitamos agregar la referencia
de nuestra capa de negocio, al igual que lo hicimos en la capa anterior.
Seleccionaremos la capa de presentacion y le daremos un click derecho en referencias
despues elegiremos agregar referencia
En esta ventana seleccionaremos la pestaña de Proyectos donde nos aparecera la
capa de Negocios y la capa de Datos que ya hemos creado, seleccionamos la capa de
Negocios y aceptamos.
Ahora debemos concluir nuestro programa, para esto solo basta con modificar el codigo
detras de nuestra interface, para ello nos dirigimos a el explorador de soluciones
seleccionamos nuestro proyecto presentacion dentro encontraremos el archivo
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:41
Default.aspx el cual modificamos anteriormente pero solo la parte de diseño ahora
modificaremos el codigo que realizara lo antes planteado, seleccionamos Default.aspx
le hacemos un click derecho y seleccionarmos Ver Codigo el cual nos llevara a el
codigo detras de nuestra pagina.
Antes de empezar a escribir nuestro codigo necesitamos agregar la referencia de
nuestra capa de Negocio, para ello agregaremos la referencia.
using Negocio;
Enseguida agregaremos una clase llamada Agregar la cual es un evento del botón
Enviar que se encuentra en la fila 5 de nuestra pagina, esta clase sera la encargada de
realizar todo el proceso de insertar un registro en la base de datos, utilizando todo lo
que hemos construido hasta ahora.
Esta clase funciona de la siguiente manera, verifica que los datos ingresados estén
correctos de lo contrario se aborta y sale de la ejecución, en caso de que no se
encuentren errores, se crea una instancia de la clase AccesoLogica que proviene de
nuestra capa de Negocios, a esta instancia se le da el nombre de negocio, después se
asignan todos los contenidos de los textbox en una variable los cuales
ejemploeriormente nos sirven para pasar los parámetros requeridos para una inserción
en nuestra capa de negocio por medio de su método insert el cual devuelve un
resultado, el cual sera negativo en caso de que ocurra un error en la base de datos. y a
continuacion se manda un mensaje por medio de la etiqueta lblMensaje en caso de que
exista o no error en la inserción, por ultimo se libera la memoria de la instancia negocio.
protected void Agregar(object sender, EventArgs e)
{
if (!Page.IsValid)
return;
AccesoLogica negocio = new AccesoLogica();
string nombre = txtNombre.Text;
string apellido = txtApellido.Text;
int edad = Int32.Parse(txtEdad.Text);
int resultado = negocio.Insert(nombre,apellido,edad);
if (resultado > 0)
Antologia Progamacion en Capas con C#
Prof. Mike Zamora González Pág.:42
lblMensaje.Text = "Nuevo Registro Agregado Satisfactoriamente.";
else
lblMensaje.Text = "Nombre: [<b>" + txtNombre.Text + "</b>] ya existe, agrege
otro";
negocio = null;
}
Ahora agregaremos otra clase llamada gvMostrar la cual, al igual que la anterior se
ejecutara al hacer click en el botón Mostrar, esta clase tendrá la tarea de llenar el
GridView con los datos contenidos en la base de datos, para ello obtiene sus datos de
la clase proveniente AccesoLogica llamada ObtenerEmpleados, el cual se le asigna
como DataSource a nuestro GridView y después se le liga a el GridView con la función
DataBind, por ultimo se deshace de todos los datos contenidos en los textbox.
protected void gvMostrar(object sender, EventArgs e)
{
GridView.DataSource = AccesoLogica.ObtenerEmpleados();
GridView.DataBind();
txtEdad.Text = txtNombre.Text = txtApellido.Text = "";
}
Ahora si deseamos ver la información contenida en nuestra base de datos, al momento
que ingresemos a nuestra pagina debemos agregar algo de codigo a nuestra clase
Page_Load la cual C# nos ha proporcionado por defecto a la hora de crear un proyecto
ASP, esta clase se ejecuta justo antes de que la pagina se muestre, por ello si
colocamos algo en esta clase, esto aparecera al momento de cargar la pagina.
En esta clase solo agregamos una linea de codigo, en la cual nos referiremos al evento
gvMostrar el cual hemos realizado anteriormente, y lo utilizaremos para mostrar la
informacion contenida en nuestra base de datos.
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsEjemploBack)
gvMostrar(sender, e);
}