DotNetcr.com
Si deseas hacer un intercambio de links con DotNetcr, escríbenos aquí
Recibe las actualizaciones vía RSS
Te invitamos a unirte en nuestras redes
   http://www.facebook.com/DotNetcr
   http://www.twitter.com/dotnetcr

Utilizando .net Remoting , Programación en Capas, Programación Orientada a Objetos y patrones de programación, (SqlServer 2000 Back End)

Por rhernandez | 8/8/2005 | Visitas 6,191 | Voto 0.00
Parte III: Capa de Acceso a Datos (DAL)
Categorías : C#
<< Regresar al Indice del Artículo

Esta capa tiene la función de relizar los accesos hacia la base de datos (SQLServer2000 en este caso) para la persistencia de la información asi como tambien para las consultas de la misma.

Utiliza como metodo de acceso a la base de datos (SqlServer 2000) la herramienta de microsoft AutoSproc la cual nos facilita la llamada a procedimientos almacenados de SQLServer2000.

A continuación, comentaremos algunos de los métodos mas importantes de la clase de la Capa de Acceso a Datos :

Sin duda los mas importante de esta capa es la persistencia de datos, esto lo logramos a traves del metodo public string Guardar(ref Entity.ListaEntidades listaEntidades) que se muestra a continuacion.

/// <summary>
/// Obtiene un System.string que indica la respuesta de la aplicación del método al almacenar la información en la base de datos
/// </summary>
/// <param name="listaEntidades">Entity.ListaEntidades representa los elementos a guardar</param>
/// <returns>System.string</returns>
public string Guardar(ref Entity.ListaEntidades listaEntidades)
{
try
{
if(listaEntidades.HasDeleted())
{
this.Borrar(listaEntidades);
}

foreach(Entity.Entidad elemento in listaEntidades)
{
int codigo;
int ultimaActualizacion;
if(elemento.HasChanges())
{
codigo=elemento.Estado;
ultimaActualizacion = elemento.UltimaActualizacion;
proc.Entidad_Save(ref codigo, elemento.Pais.PaisId, elemento.Descripcion, ref ultimaActualizacion);
elemento.Estado = codigo;
elemento.UltimaActualizacion = ultimaActualizacion;
}
}
listaEntidades.AcceptChanges();

}
catch(Exception ex)
{
Entity.LogController.Instance().AgregarMensaje(ex);
throw;
}
return "ok";
}


Lo primero que podemos observar es que la lista que entra por parámetro, esta por referencia. Esto es por que al dar de alta un registro en la base de datos, es muy común que la misma base de datos nos asigne la llave primaria, ya sea un maximo de un campo + 1, o un uniqueidentifier generado en el procedimiento de guardar. Asi como tambien la UltimaActualizacion comentada el la parte I del manejo de Entidades, donde manejamos la version del registro. De esta forma, cuando se haga persistente la entidad que se tenian en memoria, por referencia le asignamos su llave primaria y su version de registro, para simular que se ubiera cargado la entidad para modificarla por el metodo traer comentado mas abajo, esto por que la instancia todavia esta en memoria en el programa cliente (interfas de usuario) y podría volverse a mandarla guardar, y en ese caso ya se trata como un cambio, ya que tiene versión de registro y llave primaria, cosa que no existia la primera vez que lo mandaron guardar.

Otra cosa que podemos apreciar es el metodo HasDeleted() de la lista, el cual lo tiene la Clase base de colecciones, comentada tambien en la parte I. Este metodo regresa una lista del mismo tipo de la coleccion. En esta lista estan todos los elementos que se desean borrar. ¿Como se llena esta lista?, se llena cada vez que utilizan el metodo Remove(IEntityBase entityBase), el cual quita ese elemento de la colección y lo almacena en otra lista interna del mismo tipo, y en esta parte de la capa de Acceso a Datos se utiliza como vemos a continuación:

/// <summary>
/// Elimina los elementos representados en la lista de la base de datos
/// </summary>
/// <param name = "listaEntidades">Entity.ListaEntidades representa los elementos a eliminar</param>
private void Borrar(Entity.ListaEntidades listaEntidades)
{
try
{

Entity.ListaEntidades listaBorrados = new Entity.ListaEntidades();
listaBorrados = (Entity.ListaEntidades)listaEntidades.GetDeleted();
foreach(Entity.Entidad elemento in listaBorrados)
{
proc.Entidad_Delete(elemento.Estado);
}

}
catch(Exception ex)
{
Entity.LogController.Instance().AgregarMensaje(ex);
throw;
}

}


Tambien podemos ver el uso del método HasChanges() dentro del ciclo foreach, esto es para saber si la entidad tubo modificaciones, si fue asi se mandara llamar el procedimeinto para almacenas los datos, de lo contrario simplemente se ignora ese elemento. Esto es para evitar llamadas en vano hacia la base de datos. Tambien se puede ver el uso del método AcceptChanges(), el cual nos sirve para inicializar el estatus de la entidad a "Sin cambios", para que de ahi en adelante cualquier dato que se mueva se vaya controlando el estado de la misma.

Bueno, pasando a la parte de las consultas, aqui de entrada se manejan 2 metodos, uno para traer todos los registros de la tabla en cuestion y pasarlos a una coleccion que se regresara como resultado del metodo hacia la interfas de usuario, y otro método por llave primaria que regresara un entidad hacia la aplicación cliente, recordemos que tanto las colecciones como las entidades son seriabilizables para que puedan viajar a traves de .net remoting hacia la aplicacion cliente, ya sea como parametros o como resultados de la llamada a un método. Echemos un vistazo a estos 2 metodos:

/// <summary>
/// Obtiene una Entity.ListaEntidades
/// </summary>
/// <returns>una entidad Entity.ListaEntidades</returns>
public Entity.ListaEntidades TraerEntidades()
{
Entity.ListaEntidades l w Entity.ListaEntidades();
try
{
Entity.ListaPaises listaPaises=new mobileDAL.Pais().TraerPaises();
DataSet dsEntidades = proc.Entidad_Select();
Entity.Entidad elemento;
foreach(DataRow ren in dsEntidades.Tables[0].Rows)
{
elemento = new Entity.Entidad();
elemento.Estado = int.Parse(ren["entidad"].ToString());
elemento.Pais = listaPaises.FindByPrimaryKey(int.Parse(ren["pais"].ToString()));
elemento.Descripcion = ren["descripcion"].ToString();
elemento.UltimaActualizacion = int.Parse(ren["ultimaAct"].ToString());

listaEntidades.Add(elemento);
}

}
catch(Exception ex)
{
Entity.LogController.Instance().AgregarMensaje(ex);
throw;
}
listaEntidades.AcceptChanges();
return listaEntidades;
}

/// <summary>
/// Obtiene una Entity.Entidad según el parámetro recibido
/// </summary>
/// <param name="entidadId">System.String representa la Entidad</param>
/// <returns>una entidad Entity.Entidad</returns>
public Entity.Entidad TraerEntidades(int entidadId)
{
Entity.Entidad elemento=null;
DataSet dsElementos=null;
Entity.ListaPaises listaPaises=new mobileDAL.Pais().TraerPaises();

try
{
dsElementos=proc.Entidad_Select(entidadId);
foreach(System.Data.DataRow row in dsElementos.Tables[0].Rows)
{
elemento = new Entity.Entidad();
elemento.Estado = int.Parse(row["entidad"].ToString());
elemento.Pais = listaPaises.FindByPrimaryKey(int.Parse(row["pais"].ToString()));
elemento.Descripcion = row["descripcion"].ToString();
elemento.UltimaActualizacion = int.Parse(row["UltimaAct"].ToString());

elemento.AcceptChanges();
}
}
catch(Exception ex)
{
Entity.LogController.Instance().AgregarMensaje(ex);
throw;
}
return elemento;
}


Como podemos ver, en estos métodos también utilizamos en método AcceptChanges() al final de la cargada de los datos en las entidades o colecciones. Esto es para que de ahi en adelante empieze a controlarse lo que se haga con ellas, cambios, remove, etc.. Estas entidades, tanto la colección como la entidad individual, se pasaran hasta la aplicacion cliente, ellos podran trabajar con estas instancias y regresarlas al servidor de componentes por el método Guardar que expone la fachada (que se comentara en la parte IV). Y como ya tenemos el control del estatus de la entidad, tomamos la desición correcta, ya sea llamar el Borrar o el Guardar o simplemente no hacer nada, con esto logramos darle "Vida propia" a las entidades, aunque esten fuera del dominio del servidor.

Ir a parte IV: Capa de Reglas de Negocios y Fachadas

<< Regresar al Indice del Artículo

Espacios de nombres usados en el código de este artículo:

using AutoSproc;
using System.Data;
using System.Data.SqlClient;
using System;
using System.Xml;


Descargar Solución ArqSoft_mobileDAL.zip
Area de Comentarios
Por Anónimo - Fecha: 2012/07/19 01:59 AM
Hello there, just become alert to your wboleg thru Google, and found that it's really informative. I'm going to watch out for brussels. I will be grateful should you proceed this in future. Numerous other folks shall be benefited from your writing. Cheers!
Por Anónimo - Fecha: 2012/07/20 06:38 AM
l8qRpd , [url=http://uhmcauosdocd.com/]uhmcauosdocd[/url], [link=http://sccqieepreqq.com/]sccqieepreqq[/link], http://ozkrrfvzqmzk.com/
Por Anónimo - Fecha: 2012/07/21 12:52 PM
KcOAJ3 , [url=http://mwooheiiwfxo.com/]mwooheiiwfxo[/url], [link=http://ngylylhbpxnu.com/]ngylylhbpxnu[/link], http://mtlijuypmese.com/
Por Anónimo - Fecha: 2012/09/26 03:08 PM
This will only work when getting your etteniis from a main ObjectSet(like you do above). If you retrieve your etteniis from a relation like:var etteniis = MyProduct.InvoicePositions.Where(p => p.DeleteExpression == true);you'll get an exception that the colelction has changed, due to the fact that the enumeration will enumerate on the EntityCollection.
Por Anónimo - Fecha: 2012/09/28 01:56 AM
uMjlJq , [url=http://yotrcemnbxjt.com/]yotrcemnbxjt[/url], [link=http://awpppssyjdps.com/]awpppssyjdps[/link], http://mtddiacjdhpi.com/
Por Anónimo - Fecha: 2012/09/29 02:04 PM
FGP3cc , [url=http://chklnwayknsk.com/]chklnwayknsk[/url], [link=http://esxcfwyjupxb.com/]esxcfwyjupxb[/link], http://hzztsyysogam.com/
Por Anónimo - Fecha: 2015/12/17 03:08 PM
Hmmm..All user profiles are dslyiaped like /profile/username in Elgg by default.Perhaps you changed something in the files or install a new plugin.You can to try searching for 'profile/id' or 'profile/$user->guid' in the all Elgg files and then replace it with 'profile/$user->username'But I can not help you without the more information about the problem
Por Anónimo - Fecha: 2015/12/19 02:49 AM
Hi thank you so much for helping with this code. I am wnoierdng if it is possible to display on the profile page the number of page views (i.e. times that a profile has been viewed by everyone in total?). Thanks, http://zuuoolz.com [url=http://drplucs.com]drplucs[/url] [link=http://xcktxjsp.com]xcktxjsp[/link]
Por Anónimo - Fecha: 2015/12/20 02:22 PM
I can see why you were showcased. Your site has a beaftiuul balance in colour, and your content reflects your experience and expertise when it comes to food. I'm still at the bottom of the rock pile for gaining visitors to my site, but it helps to see what makes the real difference for the sites that have succeeded, and by all accounts, yours is a true success Veron! http://vrbvnmz.com [url=http://vfoiqbwvl.com]vfoiqbwvl[/url] [link=http://sefjsn.com]sefjsn[/link]
Ingrese su Comentario
Comentario
Para poder votar debe estar registrado en DotNetcr.com
Solo queda registrado el primer voto enviado
Voto


Últimos Recursos
ricardo leppe t
pedrojavier
CALIN
willipinru
richard
ragomez
PER 238
MEX 236
CRI 188
COL 118
ESP 105
ARG 88