Programacion en tres capas en C# usando asp.net

En este post vamos a realizar una aplicación usando visual studio 2008 (revisado a 2010) en c#, en donde paso a paso se mostrara como crear un programa en c# utilizando tres capas, donde la tercera capa de presentación se realizara en asp.net, este blog lo he realizado con lujo de detalles para que no existan dudas, pero aun así, si las hay favor de comentarlas.

Empecemos

Para comenzar debemos tener una fundamentación teórica, así que recomiendo revisen como funciona la programación en tres capas en el siguiente articulo de Wikipedia Programacion por capas antes de comenzar con este lab.

Ahora los requerimientos

Antes de comenzar necesitamos instalar

  1. Visual Studio (se puede instalar 2008 o 2010 en este lab se usara 2008)
  2. SQL Server (se puede instalar 2005 ó 2008 ó 2008R2 ó cualquier otro gestor teniendo en cuenta que la cadena de conexión cambiara, se recomienda usar SQL SERVER ya que el ejemplo que se muestra tiene la intención de evitar errores pero si tienes experiencia en otro gestor úsalo)

Empezemos con la cadena de conexión

La cadena de conexión es una de las partes más importantes de este programa puesto que es con lo que nuestra base de datos se comunicara con el programa, específicamente solamente con la capa de datos, si tienes algo de experiencia con sql server esto debería ser algo sencillo para ti.

Después de instalar SQL Server, se realiza una prueba de conexión donde podrás ingresar tu login sa y tu password (el cual se ingreso al instalar SQL), después de que se realize esta prueba satisfactoriamente, desconéctate, con el botón y vuelve a conectarte con el botón, así podemos asegurar que lo que vamos a colocar en la cadena de conexión sean párametros validos, y así evitar errores.

Para realizar la cadena de conexión 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 excepción del nombre de la base de datos (Initial Catalog) los encontramos cuando nos conectamos con sql server así que la siguiente imagen aclara los siguientes pasos de como construir la cadena de conexión.

Para crear la cadena solo debemos sustituir los datos mostrados en la imagen anterior aquí dejo la cadena para que no exista confusión a la hora de transcibir

@"Data Source=???????????;Initial Catalog=??????;User ID=sa;Password=????????"

Nuestra última duda para la cadena de conexión es Initial Catalog la cual para efectos de este lab le asignaremos Empleados entonces nuestra cadena quedaría de la siguiente manera

@"Data Source=???????????;Initial Catalog=Empleados;User ID=sa;Password=????????"

Si cuentas con conocimientos de base de datos solo asigna cual sea el nombre de tu base de datos.

Crear la base de datos e insertar un registro

Ahora nos conectamos en SQL Server y dando clic en la opción New Query escribimos create database Empleados y presionamos F5 nos debería 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 aplicación 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

Ahora ya con la tabla Datos vamos a hacerlo un poco más interesante, crearemos un procedimiento almacenado para que nuestro programa pueda guardar los datos introducidos desde la capa de presentación.

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 una insert y lo ejecutamos de la siguiente manera con su correspondiente F5 después 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 inserción realizada por nuestro procedimiento.

Photobucket

Si lo deseas y tienes experiencia con scripts aqui pongo todo lo que se necesita para nuestro lab 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

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 después seleccionamos Windows, dentro de plantillas seleccionamos Plantillas instaladas de Visual Studio después Biblioteca de Clases, llamaremos a nuestro proyecto Datos y la solución llamada TresCapas, en la siguiente imagen se aclara los pasos antes descritos para la configuración de nuestra solución

 photo NuevoProyecto_zpsftatfqat.png

Ahora en Visual Studio nos presenta una clase llamada Class1.cs que nosotros no pedimos, por lo que la eliminaremos, haciendo clic derecho sobre la clase en el explorador de soluciones y seleccionaremos eliminar, a continuación Visual Studio nos pedirá una confirmación a la cual aceptaremos. En la siguiente imagen se muestra el proceso de borrar Class1.cs

 photo EliminarClass_cs_zps3fdjvjvq.png

Ahora crearemos una clase llamada Configuración en la cual pondremos nuestra cadena de conexión 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 último en el menú emergente seleccionaremos clase, todo el proceso se muestra en la siguiente imagen

 photo Agregar_clase_zpsvzjyqn2p.png

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 único que hay que hacer en este paso es escribir el nombre de nuestra clase la cual llamaremos Configuración en el cuadro de texto y dar clic en agregar, a continuación se muestra una imagen del proceso.

 photo Agregarclaseconfiguracion_zps9f5l43el.png

Ahora Visual Studio nos muestra la estructura basica de nuestro programa, para hacer nuestra clase de configuración tenemos que hacer publica nuestra clase agregándole la palabra reservada public antes de class y a continuación creamos una cadena de caracteres que contendrá la cadena de conexión antes creada.

Con lo anterior ya establecido le crearemos un método a la clase Configuración el cual se llamara CadenaConexion, y se encargara de proporcionar la cadena de conexión a cualquier proceso que la necesite.
el código siguiente muestra como debería 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; }
    }
}

En el dado caso que se desee acceder con autentificación de windows lo que se tiene que hacer es agregar Trusted_Connection=true o Integrated Security=SSPI a la línea de conexión en vez de el usuario y el password.

El siguiente paso es agregar otra clase de la misma manera que lo hicimos con Configuración, pero esta vez nuestra clase se llamara MetodosDatos, esta clase tendrá la tarea de acceder a la base de datos para los métodos para obtener la información de nuestra base de datos.
Al igual que configuración le agregaremos la propiedad de public, pero además 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 métodos ya establecidos en C#, A continuación agregaremos los siguientes tres métodos

CrearComando
Este método nos servirá para crear un comando sql standard como un select el cual será regresado por su método return

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 método al igual que el anterior nos crea un comando SQL, pero con la diferencia que este método 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 del método anterior CrearComandoProc, este método ejecuta el procedimiento 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();
    }
    catch { throw; }
    finally
    {
        comando.Connection.Dispose();
        comando.Connection.Close();
    }
}

EjecutarComandoSelect
Este método ejecutara un comando select el cual nos regresara un datatable con todos los registros que se encuentren en alguna tabla dada, toma como párametro 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 contendrá, para evitar confusiones he agregado una imagen que muestra la estructura completa de nuestro método.

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 Configuración 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;

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 método CrearComandoProc le agrega los parametros que se necesitan para completar el procedimiento almacenado y después lo ejecuta con el método EjecutarComandoInsert que se encuentra en la clase MetodosDatos, de esta manera podemos ingresar información a nuestra base de datos tan solo con asignarle parametros a nuestro método 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 método CrearComando de la Clase Métodos Datos lo almacena en _comando y después le agrega la sentencia a ejecutar y por medio de el método EjecutarComandoSelect la ejecuta y nos regresa un DataTable que es un objeto que 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 en la siguiente imagen se muestra la estructura completa

Con esto hemos terminado con nuestra capa de datos es hora de crear nuestra capa de negocio.

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 clic derecho a nuestra solución llamada Tres Capas la cual nos presentara un menú y elegiremos Agregar y en el menú emergente seleccionaremos Nuevo Proyecto el proceso se muestra en la siguiente imagen

Ahora Visual estudio nos presenta todos los tipos de proyectos que podemos agregar a nuestra solución, 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, después le asignamos el nombre de nuestra segunda capa en esta caso le llamaremos Negoció y le daremos aceptar. el proceso ilustra a continuación.

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 será la encargada de enviar y recibir información de las dos capas la de Datos y la de Presentación.

Ya con nuestra clase AccesoLogica.cs necesitamos agregar la referencia de nuestra capa anterior por lo que en referencias del proyecto negocios le haremos un clic derecho y seleccionaremos agregar referencia.

Visual Studio nos presenta con una ventana en la cual podemos elegir varios tipos de referencias, en esta ventana seleccionaremos la pestaña de Proyectos y ahí nos aparece nuestra biblioteca de clases Datos la cual esta contenida en nuestra Solución 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 Datos;

Ahora agregaremos la propiedad de public a nuestra clase AccesoLogica.

Con lo anterior en su lugar podemos empezar a crear nuestros métodos para nuestra clase que en este caso serán solo dos ObtenerEmpleados e Insert

El método ObtenerEmpleados de esta clase AccesoLogica utiliza el método con el mismo nombre que se estableció 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 información proveniente de la base de datos.

public static DataTable ObtenerEmpleados()
{
return AccesoDatos.ObtenerEmpleados();
}

El método Insert recibe los parametros Nombre, Apellido y Edad y los envía por medio de una instancia de AccesoDatos a su método Insert.

public int Insert(string Nombre, string Apellido, int Edad)
{
AccesoDatos acceso = new AccesoDatos();
return acceso.Insert(Nombre, Apellido, Edad);
}

Todo lo anteriormente descrito se resume en la siguiente imagen

Con esto terminamos nuestra capa de Negocio y continuamos con nuestra última capa la capa de Presentación.

Capa de presentación

La ulima capa sera de presentacion y la realizaremos en ASP.NET, para esto debemos agregar un proyecto a nuestra solucion, para ello en haremos click derecho en nuestra solucion llamada TresCapas seleccionaremos agregar y posteriormente 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 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 título de la pagina modificandole el title, le colocaremos Tres Capas como título como se muestra a continuación.

<title>Tres Capas</title>

D entro de la etiqueta (Label) agregaremos una etiqueta llamada lblMensaje la cual se encargara de darle información a nuestro usuario de lo que esta sucediendo con nuestro programa.

<div>
  <asp:Label ID="lblMensaje" runat="Server" ForeColor="red" EnableViewState="False"/>
</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

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

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

Fila 5: La fila cinco contendra dos botones uno nos servira para enviar 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;amp;amp;amp;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>
      <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>
          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;amp;amp;amp;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>
      <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 que detras de nuestra interface, para ello nos dirigimos a el explorador de soluciones seleccionamos nuestro proyecto presentacion dentro de el encontraremos el archivo 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 de que se encuentra en la fila 5 de nuestra, 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 esta instancia se le da el nombre de negocio, después se asigna todos los contenidos de los textbox en una variable los cuales posteriormente 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)
                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.IsPostBack)
                gvMostrar(sender, e);
        }

A continuacion el codigo completo de la capa de presentacion.

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Negocio;

namespace Presentacion
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!Page.IsPostBack)
                gvMostrar(sender, e);
        }
        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)
                lblMensaje.Text = "Nuevo Registro Agregado Satisfactoriamente.";
            else
                lblMensaje.Text = "Nombre: [" + txtNombre.Text + "] ya existe, agrege otro";
            negocio = null;
        }

        protected void gvMostrar(object sender, EventArgs e)
        {
            GridView.DataSource = AccesoLogica.ObtenerEmpleados();
            GridView.DataBind();
            txtEdad.Text = txtNombre.Text = txtApellido.Text = "";
        }
    }
}

Con esto concluimos nuestro proyecto. pero antes de ejecutar nuestro proyecto por primera vez debemmos establecer la capa de presentacion como proyecto de unico.

En el siguiente link les comparto el Código Completo para la aplicación antes descrita.

171 thoughts on “Programacion en tres capas en C# usando asp.net

  1. Hola antes que nada buen tutorial aunque, tengo unas dudas ojala me pudieras ayudar a despejar las en la capa de datos ahi se mapean todas las tablas que usare, igual en la capa de negocio y en la capa de presentación irian todas las aspx que usare ó necesito hacer una capa de negocio y datos por cada aspx que yo tenga?????. Gracias y saludos.

    • Solo necesitas crear mas objetos clases o metodos en los proyectos ya existentes.
      Digamoslo de esta manera. puedes extender cada capa como tu desees.

      por ejemplo para consultar, modificar y eliminar, necesitas crear sus metodos en datos, negocio y presentacion.

      Espero te haya entendio.
      Si necesitas algun ejemplo hazmelo saber.

  2. Exactamente esa era mi duda, creo que si me vendria bien un ejemplo, si fueras tan amable de realizar uno te lo agradeceria mucho. Gracias y saludos.

  3. Hola, ya hice parte del programa pero en la parte de agregar la referencia de Datos para usar AccesoDatos me marca un error el cual dice que no existe en el contexto actual y manda otro error que dice que no se puedo encontrar que esta perdida el using o la referencia del ensamblado cuando ya he agregado la referencia ¿porque me salen estos errores? gracias.

  4. Muy buen material, lo probe con windows form y tambien funciona, soy nuevo en esto la pregunta es como seria si usaria un combo box el cual estrae datos de otra tabla???

    Igual muchisimas Gracias….

    • Muy facil solo haz otro metodo parecido a obtenerEmpleados pero en el query ingresale el select de tu otra tabla, despues en tu capa de Negocio accesoLogica haces lo mismo que en obtener empleados, ya que tienes eso solo lo ligas a tu combobox, creo que la sintaxis es: suponiendo que tu combobox se llama cbx, tu metodo en accesoLogica se llama obtenerDatos y tu consulta es “select datos from Empleados”, seria cbx.DataSource = AccesoLogica.ObtenerDatos(); cbx.ValueMember = “datos”; espero te sirva, si tienes alguna duda aqui estamos para ayudarte.

  5. hola he seguido el tutorial al pie de la letra y me corre la pagina web pero no consigo registrar datos.

  6. Hola, super bueno tu código, pero igual que al otro amigo, sigo los pasos, pero no consigo insertar los datos.

      • Listo se ha realizado la verificación, falto una sola linea en el Page_Load, la cual realizaba una limpieza de los textbox en cada evento.
        la linea es if(!Page.IsPostBack) la cual se encarga de cargar el grid de consultas solo la primera vez que se ingresa a la pagina.

  7. hola!! muy bueno .. me ayudo mucho pero x ahy me salen unos incovenientes crees q podrias enviar a mi correo el proyecto 🙂
    … spero q si gracias!!

  8. Hola que tal, cómo podrías obtener la cadena de configuración a la Bd desde el web.config? Esto debido a que no son los mismos datos en el ambiente de desarrollo que el de producción.

  9. Buenas si lo quiero hacer en Visual Studio 2010 no hay problemas es que estoy comenzando a programar en este lenguaje. saludos

    • Es practicamente lo mismo, el unico cambio considerable es la capa de presentacion, en especifico el marcado.
      Las funciones, las capas, todo el codigo detras lo que es C# funciona de la misma manera, solo pon especial atencion en los elementos que integran el ASP de VS2010, es casi lo mismo pero si existen algunas diferencias.

  10. Muy buen tutorial te felicito!!!,yo practicamente uso la misma estructura lo unico que uso deferentes es una capa de Entidades(Con sus respectivos metodos GETs ty SETs) la cual uso para trasportar los datos Ejem:

    String nombreMarcaP = “Honda”;

    marcaP = new Marca(nombreMarcaP);

    cantRegiAfec = mMarca.registrarMarca(marcaP);//aqui invoco mi metodo insert y envio mi objeto con mis datos

    En el metodo propiamente lo que inserto son los atributos del objeto(Sacado medianes sus respectivos metodos Gets)

    Que opinas? es mas “ordenado” tener una capa de entidades? o mas bien me estoy complicando la existencia?

    Es que mas me beneficia esto?

    • Muy bueno tu comentario, de hecho yo igual lo realizo de la manera que mencionaste, pero este ejemplo es muy sencillo seria otra capa, y trabajo extra por la simplicidad, pero en proyectos mas grandes es necesario, para simplificar las cosas, talvez en el futuro haga un ejemplo de eso. pero sencillo para evitar hacer tan largo el tutorial, gracias por tu aporte….

  11. Hola buen aporte para aprender un poco mas sobre capas: Tengo una consulta ojala y me ayudes con esta yo s evb.net pero ahora queria pasar una clase que tenia sobre capas de vb.net a c# pero tengo varios problemas ya que en mi capa de negocio en vb.net yo lo hago con interfaces y despues estas se implementan en una capa DAO en su respectiva clase pero cuando lo hago en c# para implementar estas interfaces tengo que escribirlas una por una no t lo autocompleta como en vb.net no se si sabes alguna otra manera de hacerlo. Muy parte de eso tambien declaro un Event Mensaje(string msg) en mi interface de vb.net pero en c# ya he probado con delegados y event para hacer un mantenimiento el problema es que me agrega y todo pero nunca sale el mensaje ojala puedas realizar algunos ejemplos de interfaces y eventos en c#

  12. Que tutorial tan excelente nunca habia visto algo tan bien explicado y menos de esto en 3 capas, yo estuve sigiendo paso paso aun que yo la conexion la hice a MySql y solo fueon cambios en unas instrucciones, pero todo jalo genial no trono en nada, FELICITACIONES que bueno eres para explicar.

    Saludos…

      • Ok gracias por responder, el problema que estoy teniendo ahora es con el &gt de la sentencia if(resultado >0) que me dice que no existe en el contexto actual, y ya agregue las referencias y ademas el using.. alguna pista?

      • buenisimo!!!! ahora lo que no me anda es la coneccion a la base, tengo que instalar algo mas ademas del SQL server 2005, tengo la base andando, cree los stores procedures, la tabla anda todo, hay que instalar un adaptadro como el de Mysql y referenciar alguna dll?

      • Checa bien la cadena de conexión a la base de datos,
        no necesitas instalar nada extra, con las bibliotecas descritas en este tutorial debería funcionar.

        Cual es el problema?? no vez los datos? o te manda un error?

      • me da este error: ExecuteReader: CommandText property has not been initialized en la seccion MetodoDatos.cs – public Static DataTable ( te comento que le agregue para que al levantar muestre los datos de la base y tengo al menos un registo para msotrar.

      • Si las bibliotecas using System.Data.SqlClient;
        using System.Data; estan declaradas, el problema deberia ser tu consulta a la base de datos.

        Primero verifica en SQL Server que funcione y despues la colocas en el _comando.CommandText.

      • ANDA!!! sos un genio!!! ahora te comento, habia dejado la linea del SELECT comentada porque queria ver si podia agregarle un Where para que la busqueda sea por un criterio pero no me salio… no se como pasarle la referencia..

      • Eso es mas fácil, te comento…

        En otro post
        https://programaspasoapaso.wordpress.com/2011/11/26/ejemplo-de-aplicacion-usando-programacion-en-tres-capas/
        realice varios where, revisa el metodo verificarUsuario.

        en especifico la linea

        “SELECT usuario FROM usuarios WHERE usuario = ‘”+usuario+”‘ AND password = ‘”+pass+”‘”;

        en ese post te puedes dar una idea clara de lo que quieres realizar, ese post no esta terminado pero es muy entendible para lo que deseas realizar.

  13. Hola mui buen tutorial, sera que me podrias enviar tu proyecto a mi correo xq tmb me aparecen algunos detallitos, y no se si puedo trabajarlo en 2010

  14. Exelente tutorial aunque me hubiese gustado que usara wpf tambien para saber como implementarlo en aplicaciondes de escritorio
    me podrias mandar el codigo del ejemplo para verlo mas detalladamente y ver si puedo aplicarlo en wpf

    gracias

    • Enviado, es exactamente lo mismo, lo bueno de este modelo es que puedes usar como presentacion de escritorio o web, ademas de que si lo desearas tambien podrias escoger otro gestor de base de datos, eso es lo que te proporciona hacerlo en capas. En cuanto al wpf, no tengo mucha experiencia ese si lo tendre que rechazar por el momento.

  15. Antes que nada, felicidades por el tutorial, muy completo y muy detallado con todos los comentarios y capturas.
    Después de terminarlo me surge una duda:
    Al método ObtenerEmpleados le he añadido un parámetro para obtener un empleado dado el ID, ahora bien, si el usuario me proporciona un ID inválido, ¿Dónde haría esta comprobación?
    Gracias.

    • Muy buena tu observacion, mira en ese caso
      cambias o agregas (jejeje, la ventaja de las capas) en el negocio.

      public static string ObtenerEmpleados(int id)
      {
      try
      {
      DataTable tabla = AccesoDatos.ObtenerEmpleados(id);
      return tabla.Rows[0][0].ToString();
      }
      catch
      {
      return “No existe ese empleado”;
      }
      }

      demaciado facil para ser verdad, Saludos

  16. Determinar si la consulta devuelve un resultado no es problema, puedo utilizar el método Any(), que hace exactamente eso. El problema lo tengo cuando la consulta sí devuelve resultados, que no sé cómo mostrar el string generado en un GridView

    • Pues si estas regresando un string entonces no deberias usar gridview,
      Pero si necesitas hacerlo, deberias regresar el Iqueryable intego a la presentacion, al regresar el Iqueryable verificas que tenga datos, si tiene, los muestras, si no pues escondes el gridview, espero te haya ayudado, Saludos

      • Sí, necesito mostrar un GridView :S. El IQueryable lo paso íntegro a la presentación, el problema es que si me llega un parámetro inválido a la función de la capa de datos, me lanza un error en la capa datos, que es donde está la función que recibe el parámetro, necesito poner el control ahí, he intentado devolver un IQueryable vacío, pero no doy con la función apropiada para hacerlo.

      • Se exactamente cual es tu problema, es mas de logica que de capas,

        Pero mira, lo que puedes hacer es verificar antes de mandar el query si hay registros o no! depende de eso si usas el grid o no!

        por ejemplo!
        if (existen datos)
        {
        llenar grid
        }
        else
        {
        crear un list predeterminado que contenga el mensaje de error y llenar el grid con el
        }

        Espero te ayude!

  17. Muchas gracias por la ayuda, al final he dejado un poco de lado LINQ para cuando tenga tiempo de investigar y estoy utilizando SqlDataSource.
    En lugar de montar la consulta completa en la capa de Datos, creo un procedimiento al que le paso un SqlDataSource y una condicion y filtro utilizando SelectParameters.
    La comprobación de si la consulta devuelve o no datos la hago en la capa de aplicación.
    De nuevo, gracias por tu seguimiento 😉

  18. Disculpa me marta error en la clase AccesoDatos.cs en la cadena

    @”Data Source=???;Initial Catalog=Empleados;User ID=sa;Password=???”;

    y tambien puse los valores de conexion que tengo con SQLServer…

  19. Hola, me puedes hacer el favor de enviarme el código fuente, cosa que te agradecería. mi email es b*****8@hotmail.com, gracias.

  20. Excelente aporte muchas gracias mi buen!!! soy tu fan si nos compartes mas de tu conocimiento haber como me enteras. Gracias de nuevo!!!

  21. Super bueno tu post, anduve buscando algo así por todos lados pero por fin me encontré con esta pagina super bueno, se agradecería que subieras uno mas completo con delete y update, si tiene unos así te agradecería que me los enviaras a mi correo, lo que pasa que me estoy preparando para mi examen de titulo. saludos!!

  22. Estimado muy buena la explicacion de como trabajar en mvc ahora bien queria saber si es que serias tan amable de enviarme este mismo proyecto ??

    saludos y sigue aportando de esa manera 🙂

  23. hola buenos dias he estado mirando tu tutorial y pues empece a tratar de hacerlo y he seguido todos tus pasos tal cual y no me funciona queria ver si me pudieras ayudar

  24. Excelente tutorial , muy bien explicado mis Respetos….
    a mi me corrio ala perfeccion , haora lo me falta agregarle los Elimnar,Actulizar, y a lo mejor buesquedas con `parametros ………………..Gracias Man muy bien explicado…..
    solo una cosa master aqui te dejo mi correo iter_particula@hotmail.com si me pudieras agregar atu mesenger o face ….
    o dame tu correo para intercambiar opiniones sobre el MVVM que usa Silverlght y wpf ….

  25. el ejenplo esta chevere per solo un detalle es que no me valida no se si yo lo abre copiado mal pero lo revise varias veses y lo veo exacto pero buneo me podrias decir en qu etoy fallando porfavor ingresa los mismos nombres
    grasias de verdad grasias
    y si tuvieras mas ejemplos de tres capas con todo (insertar,modificar,eliminary buscar ) te lo agrdeeria vastante
    es qyue de verdd nesecito aprender esto de veras
    grasias nuevamente

  26. Hola amigo, estoy revisando tu ejemplo. Por favor podrías enviarme el código para poder revisarlo con detenimiento. En mi proyecto usaremos una capa de entidades. Pero primero quiero aprender bien con el tutorial que has puesto. Muchas gracias y buen tutorial.

  27. muy buen ejemplo y funciona que es lo mas importante, me gustaria saber como llamar a la aplicacion al momento de colgarala en els servidor IE ya qu la solucion TresCapas es la que contiene a la capa presentación que tiene la pagina aspx, he probado llamando a la carpeta presentación directamente asi como a la carpeta tresCapas

  28. Hola y gracias por publicar este tipo de proyectos, son de gran ayuda, excelente explicación.
    Solo tengo una duda la cual radica en la cadena de conexión, En data source es el servidor, en el initial catalog es la bd y si no tengo user ni password, ya que se conecta con Windows authentication, que debo de poner o no poner??

    gracias

    • Mira es muy buena tu observacion, me consumiria muchisimo tiempo, pero es posible.
      Exactamente que necesitas, te podria ayudar a aclarar tus dudas, o si lo prefieres puedes esperar a el tutorial seria demaciado tiempo alrededor de un mes por que ya se me estan apilando las ideas.

  29. Hola espero que puedas ayudarme, tengo un problema al insertar datos con un programa similar a este, pero la diferencia que la insercción de datos es dinámica, ya que tengo un stored procedure que hace referencia a parametros, los cuales son los registros que debo de introducir a una tabla cualesquiera, podrias hacer un tutorial parecido a lo que te menciono. Gracias

  30. Hola que tal muy bueno excelente tu guia hermano…como te podras dar cuenta soy un novato en programacion pero me gustaria que pusieras un tutorial desde cero para conectar la bd sql con C#, desde como configurar sql para conexiones remotas, ya que tengo demaciados problemas al hacer eso…

  31. Hola, realmente muy buen tutorial, mis mas sinceras felicitaciones por darte el tiempo de explicarlo detalladamente. Pero en verdad me gustaría saber como puedes hacer consultas. ejemplo: un pantallaso donde puedes buscar todas tus ventas registradas por filtro de fechas, por tipo de documento, por cliente; todo esa consulta en un pantallaso. realmente se programar en vb.net que es programación de escritorio y todo eso lo domino pero en programación web recién estoy empezando y quería saber si me podrías brindar ese ejemplo. Te dejo mi correo a*****4@hotmail.com . De ante mano muchas gracias.

  32. thank master!! muy buen ejemplo de programacion se te agradece mucho, …puedes subir mas post de asp por fa

  33. hola esta genial tu explicacion desde ya muchisimas gracias, serias tan amable de enviarme el proyecto a mi correo? saludos!

  34. Genial tu explicación he leído bastante sobre este tema y solo a ti te entendí 😀

    Saludos y gracias por compartir lo que sabes.
    PD: si puedes me mandas el archivo, te lo agradeceré aun mas 🙂

  35. Hola que tal, antes que nada muy buen ejemplo y explicación.
    Queria saber si tienes un ejemplo de sesiones, he tenido muchos problemas y dudas respecto a ese tema, ya que no me gustan usar los famosos membership y sus objetos de login que ya tiene visual studio 2010.
    si tienes alguno que no utilize estas características y que además se manejen roles de usuario, te lo agradecería mucho.
    saludos.

    • Si, ese seria el siguiente tutorial pero por el momento no puedo realizarlo, si te urge avisame y te mando un correo y te oriento para como realizarlo de lo contrario espera un tiempo a que lo redacte, Tambien tuve problemas cuando intente usar los membership de vs2010 por lo que use interfases y las sesiones de asp.

      Saludos

  36. Master una consulta, que pasa con la capa de datos, si estuviésemos trabajando con mas tablas desde el SQL ?…. Tendrías que hacer una clase por cada tabla?

  37. Tengo una duda con respecto al dll que genera, apenas acabo de ver este tutorial muy bueno.
    Mi duda es la siguiente, El dll que genera esta aplicación contiene los querys que requieren los programas, es decir la lógica se encuentra en los dll´s.
    Lo que pasa es que tengo una aplicación en el lugar donde trabajo pero esta aplicación no contiene los cs ni nada, es decir yo no tengo la aplicación en visual studio y no veo donde hace el llamado a base de datos, más que en el dll vienen los querys que se requieren en el programa pero no entiendo como lo hicieron.
    Y me podrías enviár esta aplicación si la tienes en VS2010.
    Muchas gracias

  38. Oye Hermano tengo un problema al ejecutar el proyecto, me manda un desbordamiento de pila en la clase Configuracion en el acceso de lectura de CadenaConexión, a que crees que se deba el error?
    Ya cheque de nuevo el código y según yo esta tal cual en tu ejemplo.
    Un saludo

  39. Excelente tutorial, había googleado bastante y solo encontraba cosas a medias, pero este blog es lo mejor que he encontrado, porque no lograba hacer una conexión a la BD y ejecutar procedimientos almacenados y con este tutorial lo logré.

    Solo quisiera pedirte si podes postear los métodos de Update y Delete, es que lo intenté pero no me funcionan.

  40. Hola buno es muy buneo tu tutorial pero ami me sale un error utilizo el visual 2012 y Sql tambiem

    public static SqlDataAdapter createSqladapter(SqlCommand comando)
    {

    try
    {

    comando.Connection.Open();
    return comando.ExecuteNonQuery();// aqui comando.Executequery
    }

    catch{throw;}
    finally
    {
    comando.Connection.Dispose();
    comando.Connection.Close();
    }

    }

  41. Excelente Tuto hermano, me marco unos errores en el cual me decia algo de agregar un ScriptSourcemanager algo asi, llamado jquery, supuse que era en las validaciones que se agregaron para cada campo, elimine esas validaciones y corre sin problemas, obvio sin validar nada, haber si me puedes hechar la mano de otra manera para validarlo, el detalle es que lo hice con VS 2012, nose si tengo que agregar alguna referencia de jquery, saludos…

  42. Excelente tutorial espero me puedas ayudar con una aplicacion para hacer encuestas! O me des algun ejemplo de formularlo! Gracias! Y que bueno que existen personas como ti que comparten sus conocimientos!

  43. hola muy buen tutorial mee encanto 😀 oie una preguntota espero puedas responderme 😀
    lo qe pasa es qe qiero insertar varios campos de diferentes tablas como le pongo en obtener empleado, en la clase acceso a datos…

    • solo necesitas agregar mas parametros, es decir mas campos que acepta la clase, y estos colocarlos en la sentencia insert, esto lo podrias, revisar mi otro post que se llama ejemplo de aplicacion, ahi se muestra.

      Saludos

      • Excelente explicación de la programación en capas, pero aun tengo una duda.

        Como controlar la cadena de conexion si el nombre del servidor o la contrase;a en el db server cambiara, como se manejaria, si el proyecto ya esta compilado????
        o bien, si el server se encontrara en dentro de una red o internet por ejemplo, como manejarias eso.

        Saludos.

  44. hola lo que son dataset, datatable son muy pesados en memoria es mejor usar lista genericas ya que no consumen tanta memoria solo es un comentario amigo pero tu codigo esta bien 😀

  45. El nombre ‘lblMensaje’ no existe en el contexto actual
    Me salen esos errores con los txt y lbl en Default.aspx ):

  46. hola amigo, gracias por el tutorial estuvo fantástico! muy buen explicado paso a paso sin embargo me sale un error que no puedo identificar he seguido paso a paso cada parte del código en las clases formulario y no logro dar. Estoy programando el ejercicio en Visual 2012 Web Developer y lo que obtengo al ejecutarlo es lo siguiente: Error de instancia.

    Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.

    Detalles de la excepción: System.InvalidOperationException: Error de instancia.

    Error de código fuente:

    Línea 55: }
    Línea 56: catch (Exception ex)
    Línea 57: { throw ex; }
    Línea 58: finally
    Línea 59: { comando.Connection.Close(); }

    Archivo de origen: d:\Usuario\Documents\Visual Studio 2012\Projects\Tres_Capas\Datos\MetodosDato.cs Línea: 57

    Espero me puedas ayudar y si puedes por favor envíame tu proyecto de ejemplo para verificar mas al detalle en donde se esta presentado mi error.

    Saludos desde Perú

    Mark Himura
    yoshiki200@gmail.com

  47. hola me interesa tu aplicación me lo podrías enviar porfavor.
    estoy haciendo mi proyecto de residencia y me interesa saber el manejo de capas.
    Gracias

  48. Hola, gracias por tu tutorial, esta muy bueno, yo ya lo pase a MYSQL se alguien le interesa, pero tengo una duda, y esto me daba igual con SQLSERVER, luego de darle en el voton ENVIAR, y luego le doy
    if (resultado > 0)
    lblMensaje.Text = “Nuevo Registro Agregado Satisfactoriamente.”;
    else
    lblMensaje.Text = “Nombre: [” + txtNombre.Text + “] ya existe, agrege otro”;
    negocio = null;

    Justamente abajo de esto le puse,

    gvMostrar(sender, e);
    Con la finalidad de que me muestre el ultimo registro grabado.

    El problema es que cuando le doy el votoy ENVIAR (se agrega un registro en mi tabla datos) y al darle F5 o acualizar a mi explorador (yo utilizo FireFox) como que guardara el la rutina ENVIAR y y si le doy 5 veces refrescar a la pantalla siempre me agrega un registro nuevo (es decir me agrega un registro por cada refrescada).

  49. Estimado,
    podrias enviarme el codigo del tutorial para estudiarlo y corregir mis errores:
    Gracias.

  50. Hola… Empecé a leer tu ejemplo pero me dí cuenta que algunas imágenes no están; podrías subirlas de nuevo.

    Gracias!!

  51. Pingback: Ejercicios ASP | bAsmoxo

  52. muy bien detallado la explicación en 3 capas, yo necesito códigos sin capas es decir , en un formulario para ingresar usuario y a la vez me muestre en un listview, la verdad soy nueva en esta herramienta.
    gracias por su atencion

  53. desde ya te lo agracere mucho amigo , inmensas felicitaciones y muchas gracias por compartir.
    y estare atento al update y delete

  54. Hola amigo. Antes que nada gracias por compartir el conocimiento. Creo que tu entrada esta muy completa, sabes ya tengo un tiempo programando en asp net, pero lo venia haciendo de una forma incorrecta, ultimamente he empezado a leer esto del modelo por capas y es una mejor forma de manejar el codigo. Te agredeceria mucho si me puedes ayudar con el manejo de excepciones, a lo que me refiero es que no se bien en que parte colocarlo si deberia colocarlo en las 3 capas o solo en alguna en especifico. Tambien se me ocurria tratar de personalizar el mensaje enviado por la exception, como por ejemplo el nombre del metodo que lo lanza, el numero de linea y la excepcion.

    Espero me puedas ayudar.
    PD: Podrias compartir tu codigo? y tambien podria actualizar las capturas en algunas partes de esta entrada no cargan.

    Saludos y gracias de antemano.

  55. Gracias por el post, estoy iniciando con esto de las 3 capas y este post me ayudo un buen, solo una pregunta amigo,como sabes que va en cada capa? creo que para ti es facil distinguirlo porque se ve que tienes un buen de experiencia, podrías recomendarme un link donde pueda aclarar que es lo que va en cada capa ya no tanto el código si no la lógica que se sigue para ordenar el problema del mundo real y descomponerlo en capas, una disculpa si em dejo ver demasiado novato pero es mi realidad jejejeje…

  56. Que tal excelente aportación, solo me gustaría que actualizaras las imágenes que algunas no se cargan.

    Saludos.

  57. Hola Amigo, muchas gracias por compartir tu conocimientos, me sería de mucha utilidad si me comparte tu código. Saludos y gracias

  58. que tal buen dia, disculpa podrias ayudarme con la realización del login por favor? soy nuevo en esto de la programacion en c#

  59. Buen día amigo, excelente tutorial!!

    nadamas comentarte que hay varias imagenes que ya no apareces, han de estar rotos los links.

    Crees que puedas enviarme el código a mi correo de favor? De antemano mil gracias.

    • Que tal Wilmara, te comentó que para acceder a varias tablas en la base, sólo debes crear más métodos en la capa de datos. Puedes ver mi otro post el que tiene como nombre Ejemplo de aplicacion. Ahí se muestra este caso

  60. Hola, que tal estoy chechando este tutorial, pero varias imágenes están caídas, no tendrás algún doc de esto o podrías subir de nuevo las imágenes.

    Saludos.

  61. Estaria bueno complementar con una capa de entidades, asi pasas los objetos como parametros…
    Saludos
    Excelente trabajo!

  62. Hola programaspasoapaso, está muy bueno este post. Por favor, me puedes enviar los fuentes a eestradaa(arroba)hotmail(punto)com
    Muchas gracias.
    eestradaa.

  63. Lo maximo tu explicacion,,,buneo me falta hacerlo correr pero muy bueno amigo…de verdad interesante y productiva explicacion

  64. hola soy nuevo en esto de la programación web, conozco un poco de C#; se agradece mucho a Dios por personas como tu. De aquí una buena piedra, para seguir aprendiendo. Dios te bendiga.

  65. Hola como estas?, excelente explicación. Seguí tus pasos y funciona de maravillas. La consulta que te quiero hacer es como tendría que hacer si quiero que el datatable llene el gridview con una consulta parametrizada. Modifique en “AccesoDatos” la consulta agregándole la clausula WHERE pero da una excepción: Must declare the scalar variable.
    Gracias

  66. Hola, como estas, el ejemplo esta buenisimo, me ha servido bastante. Cuando lo trato de usar el codigo en otro ejemplo y subirlo a un hosting que tengo de asp.net. No me funciona, podrias decirme el motivo?

  67. Estoy desarrollando mi primer proyecto en tres capas y tu post me ha caído como anillo al dedo. Muchas gracias, maestro. Espero seguir aprendiendo más de tus post. Saludos desde México

Leave a reply to programaspasoapaso Cancel reply