Você está na página 1de 42

Antologa

Universidad Tecnolgica Costarricense


Mike Zamora Gonzlez
Ingenieria de Sistemas Computacionales

PROGRAMACION EN CAPAS
CON C#
Tomado de varios documentos publicados en la Internet

Antologia

Progamacion en Capas con C#

Contenido
No se encontraron elementos de tabla de contenido.

Prof. Mike Zamora Gonzlez

Pg.:2

Antologia

Progamacion en Capas con C#

1 Programacin por capas.


La programacin por capas es un estilo de programacin en el que el objetivo primordial
es la separacin de la lgica de negocios de la lgica de diseo. La ventaja principal de
este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en caso de
que sobrevenga algn cambio, slo se ataca al nivel requerido sin tener que revisar
entre cdigo mezclado. Un buen ejemplo de este mtodo de programacin sera el
modelo de interconexin de sistemas abiertos.
Dicho de otra manera, la programacin en capas no es ms que separar las
"responsabilidades" del software en distintos "responsables". Esta separacin facilita la
mantencin del software y permite, por ejemplo, cambiar fcilmente a los responsables.
Para que se entienda dar un ejemplo de la vida moderna.
Cuando una persona se somete a una operacin, pasa por las manos de a lo menos
tres personas: un anestesilogo, el cirujano y un instrumentista. El primero se encarga
de aplicar la anestesia, el segundo de realizar la operacin y el tercero de facilitar al
cirujano los instrumentos que requiere para dicha operacin. Si la operacin es de
cerebro o de corazn la especialidad del cirujano debera ser distinta y por tanto el
cirujano ser otro.
La programacin 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 fcil hacerlo. La estructura ms comn de este concepto es la
programacin en tres capas. En sta los responsables son el encargado de los datos, el
encargado del negocio y el encargado de la interaccin con el usuario.
Desde luego las responsabilidades varan dependiendo del sistema y por consecuencia
los responsables tambin, sin embargo, las responsabilidades antes mencionadas son
las ms comunes en los sistemas de administracin.
Espero que hasta este punto se entienda el concepto, y si es as, es probable que
algunos estn pensado algo como "Ok, suena bonito!, pero cmo llevo esto a una

Prof. Mike Zamora Gonzlez

Pg.:3

Antologia

Progamacion en Capas con C#

aplicacin?", 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 algn cambio, solo se ataca al nivel requerido sin
tener que revisar entre cdigo mezclado. Un buen ejemplo de este mtodo de
programacin sera el modelo de interconexin de sistemas abiertos.
Adems, permite distribuir el trabajo de creacin de una aplicacin por niveles; de este
modo, cada grupo de trabajo est totalmente abstrado del resto de niveles, de forma
que basta con conocer la API que existe entre niveles.
En el diseo de sistemas informticos actual se suelen usar las arquitecturas multinivel
o Programacin por capas. En dichas arquitecturas a cada nivel se le confa una misin
simple, lo que permite el diseo de arquitecturas escalables (que pueden ampliarse con
facilidad en caso de que las necesidades aumenten).
El ms utilizado actualmente es el diseo en tres niveles (o en tres capas)

Prof. Mike Zamora Gonzlez

Pg.:4

Antologia

Progamacion en Capas con C#

1.1 Capas y niveles


1. Capa de presentacin: la que ve el usuario (tambin se la denomina "capa de
usuario"), presenta el sistema al usuario, le comunica la informacin y captura la
informacin del usuario en un mnimo de proceso (realiza un filtrado previo para
comprobar que no hay errores de formato). Tambin es conocida como interfaz
grfica y debe tener la caracterstica de ser "amigable" (entendible y fcil 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 envan las respuestas tras el proceso. Se
denomina capa de negocio (e incluso de lgica 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 presentacin, 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. Tambin se consideran aqu los
programas de aplicacin, validaciones y procesos especficos 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 ms gestores de bases de datos que realizan
todo el almacenamiento de datos, reciben solicitudes de almacenamiento o
recuperacin de informacin desde la capa de negocio. Aqu no solo pueden ser
gestores de bases de datos, el alamacenamiento puede ser de cualquier tipo
existente. Tambin hay preprocesamiento de datos y algunos procesos
especficos de la informacin.
Todas estas capas pueden residir en un nico computador, si bien lo ms usual es que
haya una multitud de servidores o computadores en donde reside la capa de
presentacin (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 ms servidores o computadores.

Prof. Mike Zamora Gonzlez

Pg.:5

Antologia

Progamacion en Capas con C#

As, si el tamao o complejidad de la base de datos aumenta, se puede separar en


varios servidores o computadores los cuales recibirn 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
separacin, esta capa de negocio podra residir en uno o ms servidores o
computadores que realizaran 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 trminos "capas" y "niveles" no significan lo
mismo ni son similares.
El trmino "capa" hace referencia a la forma como una solucin es segmentada desde
el punto de vista lgico:

Presentacin. (Conocida como capa Web en aplicaciones Web o como capa de


usuario en Aplicaciones Nativas)

Lgica de Negocio. (Conocida como capa Aplicativa)

Datos. (Conocida como capa de Base de Datos)

En cambio, el trmino "nivel" corresponde a la forma en que las capas lgicas se


encuentran distribuidas de forma fsica. Por ejemplo:

Una solucin de tres capas (presentacin, lgica del negocio, datos) que residen
en un solo computador (Presentacin+lgica+datos). Se dice que la arquitectura
de la solucin es de tres capas y un nivel.

Una solucin de tres capas (presentacin, lgica del negocio, datos) que residen
en

dos

servidores o

computadores (presentacin+lgica por un lado;

lgica+datos por el otro lado). Se dice que la arquitectura de la solucin es de


tres capas y dos niveles.

Prof. Mike Zamora Gonzlez

Pg.:6

Antologia

Progamacion en Capas con C#

2 Programacin en capas con un ejemplo en


C#
El ejemplo consistir en algo tan simple como un mantenedor de datos de personas
(nombre, telfono y correo electrnico) y nuestros responsables se encargarn 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 interaccin con el usuario y se encarga de las
validaciones que sern dos:

El nombre no puede estar en blanco.

El correo electrnico, si es ingresado, debe ser vlido.

2.3 Interface (interaccin con el usuario)


Contendr

Una grilla para mostrar y editar los datos.

Un botn Cargar

Un botn 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

Prof. Mike Zamora Gonzlez

Pg.:7

Antologia

Progamacion en Capas con C#

leer, el encargado de negocios debe saber sobre que aplicar las reglas de negocio y el
encargado de la interaccin 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:

Presentacin utiliza Negocio

Uno o ms Negocios utilizan solo un Dato

Presentacin, Negocio y Dato requieren de Persona.

Al momento de construir la aplicacin, es una buena prctica 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 podran generarse conflictos de responsabilidad y
desorden, por ejemplo, un programador inexperto podra utilizar el mtodo grabar de la
clase Dato desde la Presentacin, lo que implicara que se estara saltando las reglas
de negocios, en nuestro caso, no se validara el nombre ni el correo electrnico.
De todos modos aqu est el cdigo:

Prof. Mike Zamora Gonzlez

Pg.:8

Antologia

Progamacion en Capas con C#

2.4.1 Presentacin:
namespace EjemploTresCapas
{
partial class Presentacion
{
/// <summary>
///

Variable del diseador requerida.

/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Limpiar los recursos que se estn 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 Cdigo generado por el Diseador de Windows Forms
/// <summary>
/// Mtodo necesario para admitir el Diseador. No se puede modificar
/// el contenido del mtodo con el editor de cdigo.
/// </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();

Prof. Mike Zamora Gonzlez

Pg.:9

Antologia

Progamacion en Capas con C#

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";

Prof. Mike Zamora Gonzlez

Pg.:10

Antologia

Progamacion en Capas con C#

//
// 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);

Prof. Mike Zamora Gonzlez

Pg.:11

Antologia

Progamacion en Capas con C#

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;
}
}

Prof. Mike Zamora Gonzlez

Pg.:12

Antologia

Progamacion en Capas con C#

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>);
}

Prof. Mike Zamora Gonzlez

Pg.:13

Antologia

Progamacion en Capas con C#

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.");

Prof. Mike Zamora Gonzlez

Pg.:14

Antologia

Progamacion en Capas con C#

if (!string.IsNullOrEmpty(item.Email) && !IsValidEmail(item.Email))


throw new Exception(string.Format("El correo electrnico {0} no
es vlido", 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]*\.)+[az0-9]{2,17}))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException)
{

Prof. Mike Zamora Gonzlez

Pg.:15

Antologia

Progamacion en Capas con C#

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);

Prof. Mike Zamora Gonzlez

Pg.:16

Antologia

Progamacion en Capas con C#

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))

Prof. Mike Zamora Gonzlez

Pg.:17

Antologia

Progamacion en Capas con C#

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

Prof. Mike Zamora Gonzlez

Pg.:18

Antologia

Progamacion en Capas con C#

Para terminar, me queda sealar que si bien en el ejemplo pusimos la validacin del
nombre obligatorio como parte de nuestro negocio, esta responsabilidad podra
trasladarse a la presentacin, esto se debe a que es comn en los lenguajes modernos
tener controles inteligentes que, por ejemplo, obligan a ingresar datos, formatean
cuadros de texto, realizan validaciones de forma, etc. La decisin de donde poner cada
responsabilidad depender de la aplicacin que se est desarrollando.
Los

mtodos

de

validacin

del

correo

electrnico

se

obtuvieron

desde

msdn.microsoft.com del artculo Cmo: Comprobar si las cadenas tienen un formato de


correo electrnico vlido

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)

Prof. Mike Zamora Gonzlez

Pg.:19

Antologia

Progamacion en Capas con C#

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
conectarte con el boton

y vuelve a

, 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

Prof. Mike Zamora Gonzlez

Pg.:20

Antologia

Progamacion en Capas con C#

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.

Prof. Mike Zamora Gonzlez

Pg.:21

Antologia

Progamacion en Capas con C#

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.

Prof. Mike Zamora Gonzlez

Pg.:22

Antologia

Progamacion en Capas con C#

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.

Prof. Mike Zamora Gonzlez

Pg.:23

Antologia

Progamacion en Capas con C#

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

Prof. Mike Zamora Gonzlez

Pg.:24

Antologia

Progamacion en Capas con C#

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

Prof. Mike Zamora Gonzlez

Pg.:25

Antologia

Progamacion en Capas con C#

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.

Prof. Mike Zamora Gonzlez

Pg.:26

Antologia

Progamacion en Capas con C#

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; }
}
}

Prof. Mike Zamora Gonzlez

Pg.:27

Antologia

Progamacion en Capas con C#

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
mtodos:
CrearComando
Este metodo nos servira para crear un comando sql estandard como un select el cual
sera regresado por su metodo return

Prof. Mike Zamora Gonzlez

Pg.:28

Antologia

Progamacion en Capas con C#

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();
}

Prof. Mike Zamora Gonzlez

Pg.:29

Antologia

Progamacion en Capas con C#

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;

Prof. Mike Zamora Gonzlez

Pg.:30

Antologia

Progamacion en Capas con C#

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.

Prof. Mike Zamora Gonzlez

Pg.:31

Antologia

Progamacion en Capas con C#

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 pestaa 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;

Prof. Mike Zamora Gonzlez

Pg.:32

Antologia

Progamacion en Capas con C#

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

Prof. Mike Zamora Gonzlez

Pg.:33

Antologia

Progamacion en Capas con C#

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>Pgina sin ttulo</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"/>

Prof. Mike Zamora Gonzlez

Pg.:34

Antologia

Progamacion en Capas con C#

</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>

Prof. Mike Zamora Gonzlez

Pg.:35

Antologia

Progamacion en Capas con C#

</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 pequeo 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>

Prof. Mike Zamora Gonzlez

Pg.:36

Antologia

Progamacion en Capas con C#

<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>&amp;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>

Prof. Mike Zamora Gonzlez

Pg.:37

Antologia

Progamacion en Capas con C#

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

Prof. Mike Zamora Gonzlez

Pg.:38

Antologia

Progamacion en Capas con C#

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>&amp;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>

Prof. Mike Zamora Gonzlez

Pg.:39

Antologia

Progamacion en Capas con C#

<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 pestaa 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

Prof. Mike Zamora Gonzlez

Pg.:40

Antologia

Progamacion en Capas con C#

Default.aspx el cual modificamos anteriormente pero solo la parte de diseo 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 botn
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 estn
correctos de lo contrario se aborta y sale de la ejecucin, 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, despus se
asignan

todos los contenidos de los textbox en

una

variable

los cuales

ejemploeriormente nos sirven para pasar los parmetros requeridos para una insercin
en nuestra capa de negocio por medio de su mtodo 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 insercin, 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)

Prof. Mike Zamora Gonzlez

Pg.:41

Antologia

Progamacion en Capas con C#

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 botn 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 despus se le liga a el GridView con la funcin
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 informacin 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);
}

Prof. Mike Zamora Gonzlez

Pg.:42

Você também pode gostar