programacion en capas c#

42
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

Upload: mike-zamora

Post on 21-Dec-2015

217 views

Category:

Documents


9 download

DESCRIPTION

Ejemplos

TRANSCRIPT

Page 1: Programacion en Capas C#

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

Page 2: Programacion en Capas C#

Antologia Progamacion en Capas con C#

Prof. Mike Zamora González Pág.:2

Contenido No se encontraron elementos de tabla de contenido.

Page 3: Programacion en Capas C#

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

Page 4: Programacion en Capas C#

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)

Page 5: Programacion en Capas C#

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.

Page 6: Programacion en Capas C#

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.

Page 7: Programacion en Capas C#

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

Page 8: Programacion en Capas C#

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:

Page 9: Programacion en Capas C#

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

Page 10: Programacion en Capas C#

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

Page 11: Programacion en Capas C#

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

Page 12: Programacion en Capas C#

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;

}

}

Page 13: Programacion en Capas C#

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

}

Page 14: Programacion en Capas C#

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

Page 15: Programacion en Capas C#

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)

{

Page 16: Programacion en Capas C#

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

Page 17: Programacion en Capas C#

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

Page 18: Programacion en Capas C#

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.

Page 19: Programacion en Capas C#

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)

Page 20: Programacion en Capas C#

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…

Page 21: Programacion en Capas C#

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.

Page 22: Programacion en Capas C#

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.

Page 23: Programacion en Capas C#

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.

Page 24: Programacion en Capas C#

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

Page 25: Programacion en Capas C#

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

Page 26: Programacion en Capas C#

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.

Page 27: Programacion en Capas C#

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

}

}

Page 28: Programacion en Capas C#

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

Page 29: Programacion en Capas C#

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

}

Page 30: Programacion en Capas C#

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;

Page 31: Programacion en Capas C#

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.

Page 32: Programacion en Capas C#

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;

Page 33: Programacion en Capas C#

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

Page 34: Programacion en Capas C#

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

Page 35: Programacion en Capas C#

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>

Page 36: Programacion en Capas C#

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>

Page 37: Programacion en Capas C#

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

Page 38: Programacion en Capas C#

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>

Page 39: Programacion en Capas C#

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

Page 40: Programacion en Capas C#

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

Page 41: Programacion en Capas C#

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)

Page 42: Programacion en Capas C#

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

}