Foros del Web » Programación para mayores de 30 ;) » .NET »

Arquitectura de 3 capas en vb.net

Estas en el tema de Arquitectura de 3 capas en vb.net en el foro de .NET en Foros del Web. Hola a tod@s. Tengo una duda sobre la arquitectura de 3 capas. Estoy intentado entender correctamente esta arquitectura y para ello he creado una clase ...
  #1 (permalink)  
Antiguo 19/07/2011, 11:01
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Arquitectura de 3 capas en vb.net

Hola a tod@s. Tengo una duda sobre la arquitectura de 3 capas. Estoy intentado entender correctamente esta arquitectura y para ello he creado una clase que la he llamado DGridDL en esta clase creo la conexion a un bd ahora lo que me sucede es que no se como mostrar los datos de la tabla en mi DataGrid deberia crear otra clase (capa Negocio) en la cual se accede a la clase DataGridDL la teoria la tengo pero la practica no se como hacerlo, si alguien me puede ayudar para enterderlo se lo agradecería. Muchas gracias
Código PHP:
Public Class DataGridDL
    Dim con 
As New SqlConnection
    Dim dSet 
As New DataSet
    Dim sqltext 
As String
    Dim dTable 
As DataTable
    Dim dAdapter 
As SqlDataAdapter
    Dim dReader 
As SqlDataReader
    Dim lector 
As SqlDataReader
    Sub abrir
()
        
con = New SqlConnection(ConfigurationManager.ConnectionStrings("CadenaConexion").ConnectionString)
        
con.Open() ABRO LA CONEXION        
    End Sub
    
Public Function leer() As SqlDataAdapter
        abrir
()
        
Dim cmd As New SqlCommand("productos"con)
        
cmd.Connection con
        dAdapter
.SelectCommand cmd
        Dim datos 
As Data.DataTable = New Data.DataTable
        dAdapter
.Fill(datos)
        Return 
dAdapter
    End 
Function
End Class 
  #2 (permalink)  
Antiguo 19/07/2011, 11:21
Avatar de galletica12  
Fecha de Ingreso: mayo-2011
Ubicación: Tekax, Yucatán
Mensajes: 213
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: Arquitectura de 3 capas en vb.net

Yo he estado haciendo algo de programacion con capas, el codigo es un poco mas corto por que en otras capas declaras tus metodos y clases y luego solo las llamas para poder utilizarlas.
  #3 (permalink)  
Antiguo 19/07/2011, 12:34
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 13 años, 4 meses
Puntos: 33
Respuesta: Arquitectura de 3 capas en vb.net

Algo asi...

Código vb:
Ver original
  1. CapaD
  2.  
  3. Public Funcion ListarEmpleados() AS List(OF EntidadesEmpleados.Empleado)
  4. ''aqui va la conexion y los query que ejecutas
  5.  
  6. despues lleno un dataset y lo recorro agregandolos a un arrego o la capa de entidades.
  7. dim Empleado as new CapaEntidades.Empleado
  8. Dim LEmpleado as new List(of CapaEntidades.Empleado)
  9. for each dtr as datarow in ds.tables(0).rows
  10. Empleado = new capaentidades.empleado
  11. Empleado.codigo = dtr("Codigo")
  12. LEmpleado.add(Empleado)
  13. return LEmpleado
  14. next
  15.  
  16. ''Capa Entidades
  17.  
  18. Public Class Empleado
  19. private _Empleado as string
  20. public property Empleado as string
  21. get
  22. return _empleado
  23. end get
  24. set (Byval value as string)
  25. if not string.isnullorempty(value) then
  26. _empleado = value
  27. end if
  28. end get
  29. end property
  30.  
  31. Capa Logicas
  32.  
  33. Public Class LogicEmpleado as list(of CapaEntidades.Empleados)
  34. public Funcion GetEmpleados
  35. dim CDatos as new capaDatos.Empleados
  36. return cdatos.ListarEmpleados
  37.  
  38. ''algo asi
  #4 (permalink)  
Antiguo 19/07/2011, 12:35
Avatar de giovani_loera  
Fecha de Ingreso: mayo-2011
Ubicación: Tijuana
Mensajes: 225
Antigüedad: 13 años, 6 meses
Puntos: 21
Respuesta: Arquitectura de 3 capas en vb.net

Lo que yo ago es tener 5 capas principales para un proyecto:

Common: En esta capa tengo mi clases comunes q utilizan todas demas clases, igualmente tengo las enumeracion. Por ejmplo clase 'Perro','Gato' y las enumeraciones enumCanino,enumFelino.

DataAccess: En esta capa se encarga especialmente para conectarse a la DB, realiza insert,update, query,etc. Por ejemplo para agregar un registro nuevo en la tabla de Perro, ago mas o menos asi:

Código C#:
Ver original
  1. public bool InsertPerro(Perro perro)
  2. {
  3. SqlCommand command=new SqlCommand("SP_InsertPerro",objConexion);
  4. command.CommandType=CommandType.StoreProcedure;
  5. commad.Parameter.Add(new Parameter("Nombre",perro.Nombre));
  6. //....y asi todos las propiedades de la clase perro , cada propiedad de la clase perro corresponde a un campo de la Tabla Perro.
  7.  
  8. objConexion.Open();
  9. if(command.ExcueteNonQuery()==1)
  10.      return true;
  11.   else
  12.     return false;
  13. }

Business: es la conexion entre la Capa DataAccess y la Capa UI (presentacion) y/o Provider (Proveedor de Datos). Pero a la vez, en esta capa valido los datos antes de mandarlo a la Capa d DataAccess o a la Capa de UI.

Provider: En esta capa, guardo un tipo de lista de los registros de la DB, es decir si quiera desplegar una lista de perro en un ComboBox, entonces al iniciar la aplicacion realizo una consulta donde me traigo todos los registros de la tabla de perros y guardarla como una lista observable de Perros (public Observable<Perros> lstPerros;) y cuando necesite desplegarlos no tengo q ir a la DB a consultar xq ya los tengo en memoria y sera mas rapido y asi no saturo el servidor.

GUI o UI: Es la capa de Presentacion, donde en ella lo unico q ago es desplegar datos y realizar un poco de logica.


Teniendo esto puedes tener varias capas de presentacion por ejemplo.
-WindowsForms
-WPF
-ASP
-Silverlight
-...

Y no importa q presentacion uses, solo cambiara la forma de desplegar los datos xq las reglas de negocio seran las mismas.


Espero q te aya servido
Creo q escribi demaciado
  #5 (permalink)  
Antiguo 19/07/2011, 13:02
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 13 años, 4 meses
Puntos: 33
Respuesta: Arquitectura de 3 capas en vb.net

Ummm, muy interesante giovani_loera, mas que todo, me gustaria ponerle las garras a tu clase de Common y la Observable...pero si se puede a todo, jajajaja...
  #6 (permalink)  
Antiguo 19/07/2011, 14:50
Avatar de galletica12  
Fecha de Ingreso: mayo-2011
Ubicación: Tekax, Yucatán
Mensajes: 213
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: Arquitectura de 3 capas en vb.net

Yo la clase conexion las hago asi:

Código HTML:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;

namespace Conexion
{
    public class Conexion
    {
        public SqlConnection conexionBD()
        {

            SqlConnection cn = new SqlConnection("Data Source =" +
            "(Local)\\SQLEXPRESS;" +
            "Initial Catalog = bodega;" +
            "Integrated security = True");
            cn.Open();
            return cn;
            
        }
    }
}
Esta es mi capa de datos donde llamo mis procedimientos almacenados:

Código PHP:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Microsoft.ApplicationBlocks.Data;
using System.IO;
using System.Data.SqlClient;


namespace Datos
{
    public class 
Estado
    
{
        
Conexion.Conexion cn = new Conexion.Conexion();

        public 
int MantenimientoEstado(Entidad.Estado objEstado)
        {
            return 
SqlHelper.ExecuteNonQuery(cn.conexionBD(),
            
"pa_InsUpdEstado",
            
objEstado.IdEstado,
            
objEstado.Nombre);

        }

Esta es mi capa Entidad para devolverme los valores de cada tabla:

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Entidad
{
    public class Cliente
    {
        int _IdCliente;
        public int IdCliente
        {
            get { return _IdCliente; }
            set { _IdCliente = value; }
        }
}
y esta de Negocio donde llama los metodos de mi capa datos

Código HTML:
using System;
using System.Data;

namespace Negocio
{
    public class Ciudad
    {
        Datos.Ciudad datos = new Datos.Ciudad();

        public bool MantenimientoCiudad(Entidad.Ciudad objCiudad)
        {
            int resultado = datos.MantenimientoCiudad(objCiudad);
            if (resultado == 0)
                return false;
            else
                return true;
        }
}
Esta de funciones donde tengo algunos metodos:

Código HTML:
using System;
using System.Data;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Windows.Forms;

namespace Funciones
{
    public class Utiles
    {

        public void Mensaje(string mensaje, Page pagina)
        {
            pagina.Response.Write("<script language=javascript>alert('" + mensaje + "');</script>");
        }
        public void CargarGrid(GridView grilla, DataSet ds)
        {
            grilla.DataSource = ds;
            grilla.DataBind();
            ds.Dispose();
        }
        public string EstaMarcado(System.Windows.Forms.CheckBox chk, string valorTrue, string valorFalse)
        {
            if (chk.Checked)
                return valorTrue;
            else
                return valorFalse;
        }
        public void LlenarCombo(ComboBox cbo, DataView dv, String texto, String valor)
        {
            try
            {
                cbo.DisplayMember = texto;
                cbo.ValueMember = valor;
                cbo.DataSource = dv;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al poner datos en Combo" +
                        ex.Message, "Error", MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
            }
        }
}
  #7 (permalink)  
Antiguo 26/07/2011, 11:33
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

Ante todo muchas gracias por los aportes que habeis realizado sobre este tema. Ahora tengo las siguientes clases

Código PHP:
Public Class DataGridBL
    
Private Shared m_current As New DataGridBL
    Dim dl 
As New DataGridDL
    
Public Shared ReadOnly Property Current() As DataGridBL
        Get
            
Return m_current
        End Get
    End Property
    
Private Sub New()

    
End Sub
    
Public Function getDataGrid(ByVal ProductoID As String) As DataGridEEList
        
Return Current.dl.DataGridEntidad(ProductoID)
    
End Function
End Class 
Y en esta última clase (la capa datos) es donde me he quedado estancado ¿cómo podría continuar? según esta estructura que he seguido igual me estoy liando demasiado.
Muchas gracias.
Código PHP:
Public Class DataGridEE
    
Private m_productsID As String
    
Private m_productsName As String
    
Private m_UnitPrice As Integer
    
Private m_QtyAvailable As Integer
    Sub 
New()
    
End Sub
    Property ProductsID 
As String
        Get
            
Return m_productsID
        End Get
        Set
(ByVal value As String)
            
m_productsID value
        End Set
    End Property
    Property ProdcutsName 
As String
        Get
            
Return m_productsName
        End Get
        Set
(ByVal value As String)
            
m_productsName value
        End Set
    End Property
    Property UnitPrice 
As Integer
        Get
            
Return m_UnitPrice
        End Get
        Set
(ByVal value As Integer)
            
m_UnitPrice value
        End Set
    End Property
    Property QtyAvailable 
As Integer
        Get
            
Return m_QtyAvailable
        End Get
        Set
(ByVal value As Integer)
            
m_QtyAvailable value
        End Set
    End Property
    
Public Sub New(ByVal pProductsID As String,
                    
ByVal pProdcutsName As String,
                    
ByVal pUnitPrice As Integer,
                    
ByVal pQtyAvailable As Integer)
        
m_productsID pProductsID
        m_productsName 
pProdcutsName
        m_UnitPrice 
pUnitPrice
        m_QtyAvailable 
pQtyAvailable
    End Sub
End 
Class
Public Class 
DataGridEEList
    Inherits SortableList
(Of DataGridEE)
End Class 
Código PHP:
Imports System.Data.SqlClient
Imports System
.Data
Friend 
Class DataGridDL
    Dim con 
As New SqlConnection
    Sub abrir
()
        
con = New SqlConnection(ConfigurationManager.ConnectionStrings("CadenaConexion").ConnectionString)
        
con.Open()
    
End Sub
    
Public Function DataGridEntidad(ByVal productoId As String) As DataGridEEList
        abrir
()
       
        
Dim ret As DataGridEEList = New DataGridEEList
        Dim oDataGridEE 
As DataGridEE
        Dim param 
As New SqlParameter
        Using bd 
As New SqlConnection(ConfigurationManager.ConnectionStrings("cadenaConexion").ConnectionString)
            
Using cmd As New SqlCommand("productos"bd)

                Return 
ret
            End Using

        End Using
        
Return ret
    End 
Function
End Class 
  #8 (permalink)  
Antiguo 26/07/2011, 11:48
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 13 años, 4 meses
Puntos: 33
Respuesta: Arquitectura de 3 capas en vb.net

Aqui te dejo un ejemplo sencillo, tienes que implementar tu clase de mantenimiento porque yo solo coloque los datos crudos, en lugar de tendrias que recorrer el dataset, y fijate en las referencias de los proyectos esta hecho con 2010, pero las clases si las puedes importar o agregar a un proyecto y solo copias el codigo del form1 que es una simple llamada a la clase de logicas...
me cuentas...

http://www.mediafire.com/?f4fw8vsfa5ufs70
  #9 (permalink)  
Antiguo 26/07/2011, 12:47
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

Nada que no hay forma de aclararme
Código PHP:
Imports System.Data.SqlClient
Imports System
.Data
Friend 
Class DataGridDL
    Dim con 
As New SqlConnection
    Sub abrir
()
        
con = New SqlConnection(ConfigurationManager.ConnectionStrings("CadenaConexion").ConnectionString)
        
con.Open()
    
End Sub
    
Public Function DataGridEntidad(ByVal productoId As String) As DataGridEEList
        abrir
()
       
        
Dim ret As DataGridEEList = New DataGridEEList
        Dim oDataGridEE 
As DataGridEE
        Dim param 
As New SqlParameter
        Using bd 
As New SqlConnection(ConfigurationManager.ConnectionStrings("cadenaConexion").ConnectionString)
            
Using cmd As New SqlCommand("productos"bd)
                
Dim dr As IDataReader cmd
                With dr
                    
While dr.Read
                        oDataGridEE
.ProductsID dr.Item(1)
                        
ret.add(oDataGridEE)
                    
End While

                
End With

                
Return ret
            End Using

        End Using

    End 
Function
End Class 
Me dice:
Cita:
Advertencia 1 Se pueden producir errores en tiempo de ejecución al convertir 'System.Data.SqlClient.SqlCommand' en 'System.Data.IDataReader'. C:\Users\Ivan\documents\visual studio 2010\Projects\PruebaDataGrid\PruebaDataGrid\DLayer \DataGridDL.vb 17 41 PruebaDataGrid
Cita:
Advertencia 2 La variable 'oDataGridEE' se utiliza antes de que se le haya asignado un valor. Podría darse una excepción de referencia nula en tiempo de ejecución. C:\Users\Ivan\documents\visual studio 2010\Projects\PruebaDataGrid\PruebaDataGrid\DLayer \DataGridDL.vb 20 25 PruebaDataGrid
  #10 (permalink)  
Antiguo 26/07/2011, 13:10
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 13 años, 4 meses
Puntos: 33
Respuesta: Arquitectura de 3 capas en vb.net

bueno revisalo,

ahora con tu codigo, prueba esto

Dim dr As IDataReader = cmd.executereader
With dr
While dr.Read
oDataGridEE.ProductsID = dr.Item(1)
ret.add(oDataGridEE)
End While

End With

oDataGridEE o le asignas un nothing o un new
oDataGridEE = nothing
oDataGridEE = new
eso es en si lo que te dice
  #11 (permalink)  
Antiguo 26/07/2011, 13:57
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

En esta ocasion me da el siguiente error. El using serviria como abrir y cerrar conexion ¿no?

Cita:
ExecuteReader requiere una Connection abierta y disponible. El estado actual de la conexión es cerrada.
Código PHP:
Public Function DataGridEntidad(ByVal productoId As String) As DataGridEEList
        abrir
()
       
        
Dim ret As DataGridEEList = New DataGridEEList
        Dim oDataGridEE 
As New DataGridEE
        Dim param 
As New SqlParameter
        Using bd 
As New SqlConnection(ConfigurationManager.ConnectionStrings("cadenaConexion").ConnectionString)
            
Using cmd As New SqlCommand("productos"bd)
                
Dim dr As IDataReader cmd.ExecuteReader
                With dr
                    
While dr.Read
                        oDataGridEE
.ProductsID dr.Item(1)
                        
ret.add(oDataGridEE)
                    
End While

                
End With


                
Return ret
            End Using

        End Using

    End 
Function 
  #12 (permalink)  
Antiguo 26/07/2011, 14:19
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 13 años, 4 meses
Puntos: 33
Respuesta: Arquitectura de 3 capas en vb.net

Nop, el using solo sirve o creo que, para utilizar y liberar el recurso tienes que especificar un open de la conexion,
  #13 (permalink)  
Antiguo 27/07/2011, 10:37
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

Casi casi lo tengo lo único que me ha surgido otro error en ret.add(oDataGridEE) el cual es
Cita:
No se puede implementar el método o la operación.
Código PHP:
 Public Function DataGridEntidad(ByVal productoId As String) As DataGridEEList
        abrir
()
       
        
Dim ret As DataGridEEList = New DataGridEEList
        Dim oDataGridEE 
As DataGridEE
        Using bd 
As New SqlConnection(ConfigurationManager.ConnectionStrings("cadenaConexion").ConnectionString)
            
Using cmd As New SqlCommand("productos"bd)
                
bd.Open()
                
Dim dr As IDataReader cmd.ExecuteReader
                With dr
                    
While dr.Read

                        oDataGridEE 
= New DataGridEE
                        oDataGridEE
.ProductsID dr.Item(0)
                        
oDataGridEE.ProdcutsName dr.Item(1)
                        
ret.add(oDataGridEE)
                    
End While

                
End With


                
Return ret
            End Using

        End Using

    End 
Function 
  #14 (permalink)  
Antiguo 27/07/2011, 11:37
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 13 años, 4 meses
Puntos: 33
Respuesta: Arquitectura de 3 capas en vb.net

Pero DataGridEE es una entidad que tiene sus propiedades entonces para poder hacer una LISTA tienes que declarar asi

dim LDataGridEE as new List(OF DataGridEE)

y ahi ya te funciona el .add
  #15 (permalink)  
Antiguo 28/07/2011, 11:11
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

Bueno ya conseguí que funcionara de la manera anterior, pero ahora he realizado unas modificiones para poder comprender mejor esta arquitectura. Y muchísimas gracias por vuestra ayuda y espero que como a mi esto ayude a resolver estas dudas a mas gente. En esta ocasión tengo las siguientes capas:
CapaEE:
Código PHP:
Public Class CapaEE

    
Private m_productsID As String
    
Private m_productsName As String
    
Private m_UnitPrice As Integer
    
Private m_QtyAvailable As Integer
    Sub 
New()
    
End Sub
    Property ProductsID 
As String
        Get
            
Return m_productsID
        End Get
        Set
(ByVal value As String)
            
m_productsID value
        End Set
    End Property
    Property ProdcutsName 
As String
        Get
            
Return m_productsName
        End Get
        Set
(ByVal value As String)
            
m_productsName value
        End Set
    End Property
    Property UnitPrice 
As Integer
        Get
            
Return m_UnitPrice
        End Get
        Set
(ByVal value As Integer)
            
m_UnitPrice value
        End Set
    End Property
    Property QtyAvailable 
As Integer
        Get
            
Return m_QtyAvailable
        End Get
        Set
(ByVal value As Integer)
            
m_QtyAvailable value
        End Set
    End Property
  
    Sub add
(ByVal oCapaEE As CapaEE)
        Throw New 
NotImplementedException
    End Sub


End 
Class 
CapaDL:
Código PHP:
Imports System.Data.SqlClient
Imports System
.Data
Friend 
Class CapaDL
    Dim con 
As New SqlConnection
    Sub abrir
()
        
con = New SqlConnection(ConfigurationManager.ConnectionStrings("CadenaConexion").ConnectionString)
        
con.Open()
    
End Sub
    
Public Function CapaEntidad(ByVal productoId As String) As CapaEE
        abrir
()

        
Dim ret As CapaEE = New CapaEE

               Using bd 
As New SqlConnection(ConfigurationManager.ConnectionStrings("cadenaConexion").ConnectionString)
            
Using cmd As New SqlCommand("Productos"bd)
                
bd.Open()
                
Dim dr As IDataReader cmd.ExecuteReader
                With dr
                    
While dr.Read
                        ret
.ProductsID = .Item(0).ToString.Trim

                                          End 
While
                
End With
            End Using
        End Using
        
Return ret
    End 
Function
End Class 
CapaBL:
Código PHP:
Public Class CapaBL

    
Private Shared m_current As New CapaBL
    Dim dl 
As New CapaDL
    
Public Shared ReadOnly Property Current() As CapaBL
        Get
            
Return m_current
        End Get
    End Property
    
Private Sub New()

    
End Sub
    
Public Function getCapa(ByVal ProductoID As String) As CapaEE
        
Return Current.dl.CapaEntidad(ProductoID)
    
End Function
End Class 
CapaVista
Código PHP:
 Protected Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgsHandles Me.Load
        Dim oCapa 
As New CapaEE

        oCapa 
CapaBL.Current.getCapa("P001")
        
LblID.Text oCapa.ProductsID

    End Sub 
y ademas tengo el siguiente procedimiento almacenado
Código PHP:
USE [Prueba]
GO
/****** Object:  StoredProcedure [dbo].[Ver_Productos]    Script Date: 07/28/2011 18:42:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE 
[dbo].[Ver_Productos]
    @
ProductID varchar    
AS
   
Select from Products where ProductID=@ProductID order by ProductID desc
En esta ocasión me muestra en el dr el siguiente error (se el motivo de este error pero no se como adjuntar este parametro desde la capa correspondiente)
Cita:
Procedure or function 'Ver_Productos' expects parameter '@ProductID', which was not supplied.
  #16 (permalink)  
Antiguo 28/07/2011, 11:22
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 13 años, 4 meses
Puntos: 33
Respuesta: Arquitectura de 3 capas en vb.net

Tienes que enviar entidades a traves de las capas tanto de ida a la UI como de la UI a la BD entonces ya en la BD haces las inversa
no me acuerdo mucho de la sintaxis de los parametros pero seria algo asi

public funcion GetClientByID(Byval EEClient as Entidad.Cliente)

SQLCmd.Parameters.AddWithValue("ID",EEClient.ID)
  #17 (permalink)  
Antiguo 28/07/2011, 12:18
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

Muchas gracias, ya he comprendido el funcionamiento. Aquí les paso el resultado.
Código PHP:
Imports System.Data.SqlClient
Imports System
.Data
Friend 
Class CapaDL
    Dim con 
As New SqlConnection
    Sub abrir
()
        
con = New SqlConnection(ConfigurationManager.ConnectionStrings("CadenaConexion").ConnectionString)
        
con.Open()
    
End Sub
    
Public Function CapaEntidad(ByVal productoId As String) As CapaEE
        abrir
()

        
Dim ret As CapaEE = New CapaEE
        
        
        
'Dim oCapaEE As CapaEE
        Using bd As New SqlConnection(ConfigurationManager.ConnectionStrings("cadenaConexion").ConnectionString)
            Using cmd As New SqlCommand("Ver_Productos", bd)
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.AddWithValue("@ProductID", productoId)
                bd.Open()
                Dim dr As IDataReader = cmd.ExecuteReader
                With dr
                    While dr.Read()
                        ret.ProductsID = .Item(0).ToString.Trim
                        ret.ProdcutsName = .Item(1).ToString.Trim
                        '
oCapaEE = New CapaEE
                        
'oCapaEE.ProductsID = dr.Item(0)
                        '
oCapaEE.ProdcutsName dr.Item(1)
                        
ret.add(oCapaEE)
                    
End While
                
End With
            End Using
        End Using
        
Return ret
    End 
Function
End Class 
  #18 (permalink)  
Antiguo 08/08/2011, 10:36
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

Bueno me ha surgido otra duda y esta es al rellenar un DataGrid con la arquitectura anteriormente usada.
El codigo que tengo es el siguiente:
Código PHP:
Public Class DataGridEE
    
Private m_productsID As String
    
Private m_productsName As String
    
Private m_UnitPrice As Integer
    
Private m_QtyAvailable As Integer
    Sub 
New()
    
End Sub
    Property ProductsID 
As String
        Get
            
Return m_productsID
        End Get
        Set
(ByVal value As String)
            
m_productsID value
        End Set
    End Property
    Property ProdcutsName 
As String
        Get
            
Return m_productsName
        End Get
        Set
(ByVal value As String)
            
m_productsName value
        End Set
    End Property
    Property UnitPrice 
As Integer
        Get
            
Return m_UnitPrice
        End Get
        Set
(ByVal value As Integer)
            
m_UnitPrice value
        End Set
    End Property
    Property QtyAvailable 
As Integer
        Get
            
Return m_QtyAvailable
        End Get
        Set
(ByVal value As Integer)
            
m_QtyAvailable value
        End Set
    End Property
    
Public Sub New(ByVal pProductsID As String,
                    
ByVal pProdcutsName As String,
                    
ByVal pUnitPrice As Integer,
                    
ByVal pQtyAvailable As Integer)
        
m_productsID pProductsID
        m_productsName 
pProdcutsName
        m_UnitPrice 
pUnitPrice
        m_QtyAvailable 
pQtyAvailable
    End Sub
End 
Class
Public Class 
DataGridEEList
    Inherits SortableList
(Of DataGridEE)
    
Dim LDataGridEE As New List(Of DataGridEE)


    
Sub add(ByVal oDataGridEE As DataGridEE)
        Throw New 
NotImplementedException
    End Sub

End 
Class 
Código PHP:
Public Class DataGridBL
    
Private Shared m_current As New DataGridBL
    Dim dl 
As New DataGridDL
    
Public Shared ReadOnly Property Current() As DataGridBL
        Get
            
Return m_current
        End Get
    End Property
    
Private Sub New()

    
End Sub
    
Public Function getDataGrid(ByVal ProductoID As String) As DataGridEEList
        
Return Current.dl.getCapaEntidad(ProductoID)
    
End Function
End Class 
Código PHP:
Imports System.Data.SqlClient
Imports System
.Data
Friend 
Class DataGridDL
    Dim con 
As New SqlConnection
    Sub abrir
()
        
con = New SqlConnection(ConfigurationManager.ConnectionStrings("CadenaConexion").ConnectionString)
        
con.Open()
    
End Sub
    
Public Function getCapaEntidad(ByVal productoId As String) As DataGridEEList
        abrir
()

        
Dim ret As DataGridEEList = New DataGridEEList
        Dim oDataGridEE 
As DataGridEE

        Dim oCapaEE 
As CapaEE
        Using bd 
As New SqlConnection(ConfigurationManager.ConnectionStrings("cadenaConexion").ConnectionString)
            
Using cmd As New SqlCommand("Ver_Productos"bd)
                
cmd.CommandType CommandType.StoredProcedure
                cmd
.Parameters.AddWithValue("@ProductID"productoId)
                
bd.Open()
                
Dim dr As IDataReader cmd.ExecuteReader
                With dr
                    
While dr.Read()

                        
oDataGridEE = New DataGridEE()
                        
oDataGridEE.ProductsID dr.Item(0)
                        
oDataGridEE.ProdcutsName dr.Item(1)
                        
ret.add(oDataGridEE)
                    
End While
                
End With
            End Using
        End Using
        
Return ret
    End 
Function

    
Sub DataGridEntidad(ByVal p1 As String)
        Throw New 
NotImplementedException
    End Sub

End 
Class 
Código PHP:
        sqltext "select c_idprueba, c_nombre from T_prueba"
        
dAdapter = New SqlDataAdapter(sqltextcon)
        
dAdapter.Fill(dSet"Prueba")
       
        
MyDataGrid.DataSource dSet.Tables(0)
        
        
MyDataGrid.DataSource dSet
        MyDataGrid
.DataBind()
        
con.Close()

        
Dim da As New SqlDataAdapter
        Dim objDs 
As New Data.DataSet
      
        Dim oDataGridList 
As New DataGridEEList
        oDataGridList 
DataGridBL.Current.getDataGrid("P001")
       
        
Me.MyDataGrid2.DataSource oDataGridList
        Me
.MyDataGrid2.DataBind()
        
Me.MyDataGrid2.Focus()

    
End Sub    
End 
Class 
La clase me recoge datos pero luego en me salta la siguiente exception al pasar por ret.add(oDataGridEE)

Cita:
No se puede implementar el método o la operación.
¿Cual es mi error? Muchas gracias
  #19 (permalink)  
Antiguo 09/08/2011, 09:55
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

¿Nadie sabe la razón de este error? Gracias
  #20 (permalink)  
Antiguo 10/08/2011, 11:34
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

ahora me salta otro error diferente:
Código PHP:

Imports System
.Data.SqlClient
Imports PruebaDataGrid
.Entities
Imports PruebaDataGrid
.BusinessLayer
Imports System
.Data
Namespace DataLayer
    
Public Class DataGridDL
        Dim con 
As New SqlConnection
        Sub abrir
()
            
con = New SqlConnection(ConfigurationManager.ConnectionStrings("CadenaConexion").ConnectionString)
            
con.Open()
        
End Sub
        
Public Function getDataGridEntidad(ByVal productoId As String) As DataGridEEList
            abrir
()

            
Dim ret As DataGridEEList = New DataGridEEList
            Dim oDataGridEE 
As DataGridEE


            Using bd 
As New SqlConnection(ConfigurationManager.ConnectionStrings("cadenaConexion").ConnectionString)
                
Using cmd As New SqlCommand("Ver_Productos"bd)
                    
cmd.CommandType CommandType.StoredProcedure
                    cmd
.Parameters.AddWithValue("@ProductID"productoId)
                    
bd.Open()
                    
Dim dr As IDataReader cmd.ExecuteReader
                    With dr
                        
While dr.Read()

                            
oDataGridEE = New DataGridEE()
                            
oDataGridEE.ProductsID dr.Item(0)
                            
oDataGridEE.ProdcutsName dr.Item(1)

                            
ret.add(oDataGridEE)
                        
End While
                    
End With
                End Using
            End Using
            
Return ret
        End 
Function



    
End Class
End Namespace 
en ret.add(oDataGridEE):
Cita:
Error 1 'add' no es un miembro de 'PruebaDataGrid.Entities.DataGridEEList'.
  #21 (permalink)  
Antiguo 11/08/2011, 10:32
 
Fecha de Ingreso: agosto-2011
Ubicación: Buenos Aires
Mensajes: 78
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: Arquitectura de 3 capas en vb.net

Capaz es un poco tarde pero te paso un link sobre programación en capas que te puede interesar. Es en C#, pero la lógica es la misma.

http://www.orientadoanet.com/2011/07/programacion-en-capas-introduccion.html
__________________
www.orientadoanet.com
  #22 (permalink)  
Antiguo 11/08/2011, 11:29
 
Fecha de Ingreso: junio-2008
Mensajes: 250
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Arquitectura de 3 capas en vb.net

Muchas gracias laguzzigerardo y nunca es tarde si la dicha es buena.
Eso si estoy totalmente estancado con el tema del datagrid.
  #23 (permalink)  
Antiguo 11/08/2011, 12:53
Avatar de giovani_loera  
Fecha de Ingreso: mayo-2011
Ubicación: Tijuana
Mensajes: 225
Antigüedad: 13 años, 6 meses
Puntos: 21
Respuesta: Arquitectura de 3 capas en vb.net

El error te sale, por que el estas creando un objeto de tipo 'PruebaDataGrid.Entities.DataGridEEList' y no una lista de objetos.

Para eso ay que crear una lista:


Código VB:
Ver original
  1. Dim lstRet as New List(Of PruebaDataGrid.Entities.DataGridEE)

Para que asi puedas agregar objetos de tipo 'DataGridEE' a la lista lstRet (que asu vez es una lista de DataGridEE).


Y como resultado regresas..

Código VB:
Ver original
  1. Public Function getDataGridEntidad(ByVal productoId As String) As List(Of PruebaDataGrid.Entities.DataGridEE)


Espero que te sirva

Nota: No es recomendable tener una clase para una lista de objeta, pero si puedes tener una clase q dentro de ella exista un atributo de tipo de lista.

Y si vas a utilizar asi tu programacion, debe aver un metodo 'Add' para agregar un objeto y un atributo en la clase de tipo list.

asi...
Código VB:
Ver original
  1. public class ClassList
  2. public lst as List(Of PruebaDataGrid.Entities.DataGridEE).
  3.  
  4. public sub Add(ByVal obj as PruebaDataGrid.Entities.DataGridEE)
  5. lst.add(obj)
  6. End Sub
  7.  
  8. 'Igual sus metodos para limpiar,regresar y borrar un obj de la lista

Etiquetas: arquitectura, bd, capas, datagrid, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 08:04.