como programar en n-capas con c# (parte 1)

Upload: serna-adoniesis

Post on 20-Jul-2015

2.502 views

Category:

Documents


0 download

TRANSCRIPT

08/05/12

Como programar en n-Capas con C# (Parte 1)

Sitios Asociados: SvMembers V3.0 / SmS Mensajitos PhP V2.22Bienvenido(a), Visitante. Por favor, ingresa o regstrate. Siempre Ingresar Buscar Noticias: SvMembers te presenta su nueva Tienda SvM! C reado por Staff SvM. Ir al tema oficial!

Ingresar con nombre de usuario, contrasea y duracin de la sesin

Inicio

Forum

Ayuda

Buscar

Tags SvM

Tienda SvM

Downloads

Ingresar

Registrarse

SvMembers | Unidos Somos Red! Soporte / Informtica / Tecnologa Programacin Otros C omo programar en n-C apas con C # (Parte 1)

Me gusta

76

anterior prximo Pginas: [1] Ir AbajoI M P RI M I R

Autor

Tema: Como programar en n-Capas con C# (Parte 1)0

0 (Ledo 2149 veces)estn viendo este tema. Usuarios y 1 Visitante

PhreakerAdministrator Member Supremo

Como programar en n-Capas con C# (Parte 1) : julio 23, 2010, 05:23:45 pm

Este es un tema polmico del que se habla mucho y nada, digo que se habla mucho porque al buscar algo de informacin en Internet, uno se da cuenta, que esta plagado de sitios donde preguntan como aplicar programacin en 3 capas, o N-Capas, pero en muy pocos lugares se responde con algo cierto y concreto, la mayora hacen referencia a libros gordos que tardaras en leer semanas (no estoy en contra de la lectura, es un proceso largo nada ms y casi todos buscamos aprenderlo un poco ms rpido). Este artculo tambin ser bastante largo y me aventuro a decir que me tomar varias noches escribirlo completamente, pero no ser nadaMensajes: 1836 99927772Pieza oro Ver Inventario Enviar oro a Phreaker Karma: +20/-0 Mis Objetos

comparado con un libro con un lomo de 15 centmetros La primer gran confusin que noto, es que la mayora no sabe diferenciar entre los conceptos 1. Arquitectura de 3 capas: se basa ms bien en como ser construido el entorno, una manera de decirlo en romper el clsico concepto ClienteServidor para introducir conceptos como Back End (Base de Datos), Middleware (Servidor de Aplicaciones), Front End (Interfaz de Usuario). Este es un concepto grande que no veremos ahora, pero lo remarco para hacer entender que no tiene nada que ver con la programacin en capas. Se acerca ms a un concepto fsico. 2. Programacin en 3 (n) capas: este es el tema en cuestin y estira ms hacia un concepto lgico. En cmo partimos, agrupamos, clasificamos, optimizamos nuestro cdigo. El mismo introduce conceptos como Capa de Acceso a Datos (Esta nos permite conectarnos a la fuente de datos y1/16

La estupides humana no tiene limites...

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

08/05/12

Acceso a Datos (Esta nos permite conectarnos a la fuente de datos y operar contra ella), Capa de Negocios (es la que se encarga de procesar todo, validaciones, etc. la misma suele distribuirse en la aplicacin en s y en la BBDD), y Capa de Presentacin (es ms bien lo que el usuario percibe, su interfaz grfica por lo gral). Creo que con esos conceptos introductorios ya estamos preparados para comprender mejor ciertos aspectos de este paradigma. Para resaltar por ltimo, gracias a la separacin en capas quiere decir que podemos cambiar de proveedor de base de datos, y no necesitaremos reescribir toda la aplicacin de vuelta, sino solamente esa pequea capa y reutilizaramos la interfaz y las reglas de negocios, o tambin podemos mantener las reglas de negocios y el motor de base de datos, y fcilmente cambiarnos de una interfaz WinForm a WebForm, siempre la ms dura de cambiar en la de negocios ya que afecta en un nivel mnimo a las otras 2 capas. Creo que ya es suficiente teora de momento y podemos comenzar con la accin, el cdigo que voy a ir escribiendo lo har en Visual Studio 2010 por que es la que tengo instalada ahora mismo en la maquina, pero funciona desde la versin 2005 con el framework 2.0 en adelante, ya que ADO.Net no ha sufrido grandes cambios desde esa versin, as que ustedes lo pueden ir creando en la versin del IDE o framework que ms gusten. Primeramente vamos a crear una solucin con un proyecto de Biblioteca de Clases, el mismo tendr 3 clases principales para representar la capa de Acceso a Datos, la primera llamaremos GDatos.cs, la misma le asignaremos el namespace AccesoDatos, y una clase abstracta con el mismo nombre. Haremos uso de estos 2 namespace:u i gSystem; sn 1 2

Como programar en n-Capas con C# (Parte 1)

using System.Data;

Lo siguiente que haremos ser estructurar en cdigo con regiones para una mayor comodidad en la lectura del mismo, la primer regin es la de Declaracin de Variables en la misma creamos las variables o atributos para la conexion a la BBDD, ms un objeto de interfaz de conexin para que sea implementada de manera especfica por la clase hija, si se han dado cuenta estamos usando ya conceptos de OOP avanzados, y lo seguiremos usando fuertemente en el transcurso del artculo. Esta es una clase que obligatoriamente debe ser hereda por otra. El nivel de acceso por eso estn definidas como protected para que sean modificadas por si misma o por sus clases derivadas.#ein"elrc d Vrals rgo Dcaain e aibe"

1 2 3 4 5 6 7 8 9

protected protected protected protected protected protected

string MServidor = ""; string MBase = ""; string MUsuario = ""; string MPassword = ""; string MCadenaConexion = ""; IDbConnection MConexion;

1 #endregion 0

Lo siguiente por hacer es muy sencillo, crear los setters y getters de nuestros atributos anteriormente definidos:#ein"etr yGtes rgo Stes etr"

1 2 3 4 5 6 7 8 9

// Nombre del equipo servidor de datos. public string Servidor { get { return MServidor; } set { MServidor = value; } } // end Servidor // Nombre de la base de datos a utilizar. public string Base

1 0

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

2/16

08/05/12

public string Base { 1 2 get { return MBase; } 1 3 set { MBase = value; } 1 4 } // end Base1 1 1 5 1 6 1 7

Como programar en n-Capas con C# (Parte 1)

// Nombre del Usuario de la BD. public string Usuario 1 8 { 1 9 get { return MUsuario; } 2 0 set { MUsuario = value; } 2 1 } // end Usuario2 2 2 3 2 4

// Password del Usuario de la BD. public string Password 2 5 { 2 6 get { return MPassword; } 2 7 set { MPassword = value; } 2 8 } // end Password2 9 3 0 3 1 3 3 3 4 3 5 3 6 3 7 3 8 3 9

// Cadena de conexin completa a la base. public abstract string CadenaConexion 3 2 { get; set; } #endregion #region "Privadas"

// Crea u obtiene un objeto para conectarse a la base de datos. protected IDbConnection Conexion 4 0 { 4 1 get 4 2 { 4 3 // si aun no tiene asignada la cadena de conexion lo hace 4 4 if (MConexion == null) 4 5 MConexion = CrearConexion(CadenaConexion);4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 4

// si no esta abierta aun la conexion, lo abre if (MConexion.State != ConnectionState.Open) MConexion.Open(); // retorna la conexion en modo interfaz, para que se adapte a cualquier

5 implementacion 3

de los distintos fabricantes de motores de bases de datos return MConexion; 5 5 } // end get 5 } // end Conexion 65 7

#endregion Creamos ahora los mtodos para hacer lecturas a la fuente de datos, lo hacemos ya en esta clase porque son metodos generales que pueden implementar tal cual las clases hijas. En el caso de los DataReader que son muy especificos del driver utilizados, vamos a utilizar el objeto IDataReader que es una interfaz de implementacin general.#ein"etrs rgo Lcua"

1 2 3 4 5 6 7 8 9 1 0 1 1

// Obtiene un DataSet a partir de un Procedimiento Almacenado. public DataSet TraerDataSet(string procedimientoAlmacenado) { var mDataSet = new DataSet(); CrearDataAdapter(procedimientoAlmacenado).Fill(mDataSet); return mDataSet; } // end TraerDataset //Obtiene un DataSet a partir de un Procedimiento Almacenado y sus3/16

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

08/05/12

Como programar en n-Capas con C# (Parte 1)1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9

parmetros. public DataSet TraerDataSet(string procedimientoAlmacenado, params Object[] args) { var mDataSet = new DataSet(); CrearDataAdapter(procedimientoAlmacenado, args).Fill(mDataSet); return mDataSet; } // end TraerDataset // Obtiene un DataSet a partir de un Query Sql. public DataSet TraerDataSetSql(string comandoSql) { var mDataSet = new DataSet(); CrearDataAdapterSql(comandoSql).Fill(mDataSet); return mDataSet; } // end TraerDataSetSql

// Obtiene un DataTable a partir de un Procedimiento Almacenado. public DataTable TraerDataTable(string procedimientoAlmacenado) 3 0 { return TraerDataSet(procedimientoAlmacenado).Tables[0].Copy(); } // 3 1 end TraerDataTable3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1

//Obtiene un DataSet a partir de un Procedimiento Almacenado y sus parmetros. public DataTable TraerDataTable(string procedimientoAlmacenado, params Object[] args) { return TraerDataSet(procedimientoAlmacenado, args).Tables[0].Copy(); } // end TraerDataTable

//Obtiene un DataTable a partir de un Query SQL public DataTable TraerDataTableSql(string comandoSql) 4 2 { return TraerDataSetSql(comandoSql).Tables[0].Copy(); } // end 4 3 TraerDataTableSql4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 7 0 7 1 7 2 7 3 7 4 7 5

// Obtiene un DataReader a partir de un Procedimiento Almacenado. public IDataReader TraerDataReader(string procedimientoAlmacenado) { var com = Comando(procedimientoAlmacenado); return com.ExecuteReader(); } // end TraerDataReader // Obtiene un DataReader a partir de un Procedimiento Almacenado y sus parmetros. public IDataReader TraerDataReader(string procedimientoAlmacenado, params object[] args) { var com = Comando(procedimientoAlmacenado); CargarParametros(com, args); return com.ExecuteReader(); } // end TraerDataReader // Obtiene un DataReader a partir de un Procedimiento Almacenado. public IDataReader TraerDataReaderSql(string comandoSql) { var com = ComandoSql(comandoSql); return com.ExecuteReader(); } // end TraerDataReaderSql // Obtiene un Valor Escalar a partir de un Procedimiento Almacenado. Solo funciona con SP's que tengan // definida variables de tipo output, para funciones escalares mas abajo se declara un metodo public object TraerValorOutput(string procedimientoAlmacenado) { // asignar el string sql al command4/16

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

08/05/12

Como programar en n-Capas con C# (Parte 1)7 6 7 7 7 8 7 9 8 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 9 0 9 1 9 2

var com = Comando(procedimientoAlmacenado); // ejecutar el command com.ExecuteNonQuery(); // declarar variable de retorno Object resp = null; // recorrer los parametros del SP foreach (IDbDataParameter par in com.Parameters) // si tiene parametros de tipo IO/Output retornar ese valor if (par.Direction == ParameterDirection.InputOutput || par.Direction == ParameterDirection.Output) resp = par.Value; return resp; } // end TraerValor

// Obtiene un Valor a partir de un Procedimiento Almacenado, y sus parmetros. 9 public object TraerValorOutput(string procedimientoAlmacenado, 3 9 params Object[] args) 4 9 { 5 9 6 // asignar el string sql al command 9 7 var com = Comando(procedimientoAlmacenado); 9 8 // cargar los parametros del SP 9 9 CargarParametros(com, args); 1 0 // ejecutar el command 0 1 1 com.ExecuteNonQuery(); 012 0 13 0 14 0 15 0 16 0

// declarar variable de retorno Object resp = null;

// recorrer los parametros del SP foreach (IDbDataParameter par in com.Parameters) 17 0 // si tiene parametros de tipo IO/Output retornar ese valor 18 0 if (par.Direction == ParameterDirection.InputOutput || par.Direction 1 9== ParameterDirection.Output) 0 10 1 resp = par.Value; 1 1 return resp; 1 1 2} // end TraerValor 113 1 1 4// 1 1 6{ 1 17 1 18 1 19 1 10 2 11 2 12 2 13 2 14 2 1 5public 1

Obtiene un Valor Escalar a partir de un Procedimiento Almacenado. object TraerValorOutputSql(string comadoSql)

// asignar el string sql al command var com = ComandoSql(comadoSql); // ejecutar el command com.ExecuteNonQuery(); // declarar variable de retorno Object resp = null;

// recorrer los parametros del Query (uso tipico envio de varias sentencias en el mismo command) 1 6 foreach (IDbDataParameter par in com.Parameters) 2 17 2 // si tiene parametros de tipo IO/Output retornar ese valor 18 2 if (par.Direction == ParameterDirection.InputOutput || par.Direction 1 9== ParameterDirection.Output) 2 10 3 resp = par.Value; 1 1 return resp; 3 1 2} // end TraerValor 31 5sql 2 13 3 1 4// 3

Obtiene un Valor de una funcion Escalar a partir de un Procedimiento object TraerValorEscalar(string procedimientoAlmacenado)

1 5Almacenado. 3 1 6public 3 1 7{ 3 18 3 19 3

var com = Comando(procedimientoAlmacenado); return com.ExecuteScalar(); 1 0} // end TraerValorEscalar 4www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4 5/16

08/05/12

Como programar en n-Capas con C# (Parte 1)

} // end TraerValorEscalar

/// Obtiene un Valor de una funcion Escalar a partir de un Procedimiento Almacenado, con Params de Entrada public Object TraerValorEscalar(string procedimientoAlmacenado, params object[] args) { var com = Comando(procedimientoAlmacenado); CargarParametros(com, args); return com.ExecuteScalar(); } // end TraerValorEscalar // Obtiene un Valor de una funcion Escalar a partir de un Query SQL public object TraerValorEscalarSql(string comandoSql) { var com = ComandoSql(comandoSql); return com.ExecuteScalar(); } // end TraerValorEscalarSql

#endregion El siguiente bloque es para ejecutar procesos que no devuelven valores, al inicio tendremos varios mtodos abstractos, para que las clases derivadas estn obligadas a implementarlas a su manera, en un modo especifico, ya que los objetos connection, command, dataadapter, son muy especficos y deben ser implementados por cada una.#ein"cins rgo Acoe"

1 2 3

protected abstract IDbConnection CrearConexion(string cadena); protected abstract IDbCommand Comando(string 4 procedimientoAlmacenado); 5 protected abstract IDbCommand ComandoSql(string comandoSql); 6 protected abstract IDataAdapter CrearDataAdapter(string 7 procedimientoAlmacenado, params Object[] args); 8 protected abstract IDataAdapter CrearDataAdapterSql(string 9 comandoSql); 1 0 protected abstract void CargarParametros(IDbCommand comando, 1 1 Object[] args);1 2 1 3 1 4

// metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar() 1 5 { 1 6 if (Conexion.State != ConnectionState.Open) 1 7 Conexion.Open(); 1 8 return true; 1 9 }// end Autenticar2 0 2 1 2 2

// metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar(string vUsuario, string vPassword) 2 3 { 2 4 MUsuario = vUsuario; 2 5 MPassword = vPassword; 2 6 MConexion = CrearConexion(CadenaConexion);2 7 2 8 2 9 3 1 3 2 3 3 3 4

MConexion.Open(); return true; 3 0 }// end Autenticar

// cerrar conexion public void CerrarConexion() 3 5 { 3 6 if (Conexion.State != ConnectionState.Closed) 3 7 MConexion.Close(); 3 8 }3 9

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

6/16

08/05/12

3 9 4 0 4 1 4 2 4 3 4 4

Como programar en n-Capas con C# (Parte 1)

// end CerrarConexion

// Ejecuta un Procedimiento Almacenado en la base. public int Ejecutar(string procedimientoAlmacenado) 4 5 { return Comando(procedimientoAlmacenado).ExecuteNonQuery(); } // 4 6 end Ejecutar4 7 4 8 4 9

// Ejecuta un query sql public int EjecutarSql(string comandoSql) return ComandoSql(comandoSql).ExecuteNonQuery(); } // end Ejecutar un Procedimiento Almacenado en la base, utilizando los parmetros. int Ejecutar(string procedimientoAlmacenado, params Object[]

5 { 0 5 1

5 //Ejecuta 2 5 public 3 5 args) 4 5 { 5

var com = Comando(procedimientoAlmacenado); CargarParametros(com, args); 5 8 var resp = com.ExecuteNonQuery(); 5 9 for (var i = 0; i < com.Parameters.Count; i++) 6 0 { 6 1 var par = (IDbDataParameter)com.Parameters[i]; 6 2 if (par.Direction == ParameterDirection.InputOutput || par.Direction 6 == ParameterDirection.Output) 3 args.SetValue(par.Value, i - 1); }// end for return resp; } // end Ejecutar5 6 5 7

#endregion Ahora bien, no podemos olvidarnos de la seccin transaccional, no se utiliza normalmente en todos lados desde la aplicacin, pero en procesos dependientes es necesario, as que si necesitamos usarlo, podemos crearlo de este modo:#ein"rnacoe" rgo Tascins

1 2 3 4 5 6

protected IDbTransaction MTransaccion; protected bool EnTransaccion;

//Comienza una Transaccin en la base en uso. public void IniciarTransaccion() 7 { 8 try 9 { 1 0 MTransaccion = Conexion.BeginTransaction(); 1 1 EnTransaccion = true; 1 2 }// end try 1 3 finally 1 4 { EnTransaccion = false; } 1 5 }// end IniciarTransaccion1 6 1 7 1 8 1 9

//Confirma la transaccin activa. public void TerminarTransaccion() 2 0 { 2 1 try 2 2 { MTransaccion.Commit(); } 2 3 finally 2 4 { 2 5 MTransaccion = null; 2 6 EnTransaccion = false; 2 7 }// end finally 2 8 }// end TerminarTransaccionwww.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE42 9

7/16

08/05/12

Como programar en n-Capas con C# (Parte 1)2 9 3 0 3 1

//Cancela la transaccin activa. void AbortarTransaccion()

3 public 2 3 { 3 3 4 3 5

try { MTransaccion.Rollback(); } 3 6 finally 3 7 { 3 8 MTransaccion = null; 3 9 EnTransaccion = false; 4 0 }// end finally 4 }// end AbortarTransaccion 14 2 4 #endregion 3 4 4

El cdigo completo lo pueden ver aqui:u i gSystem; sn

1 2 3 4

using System.Data;

namespace AccesoDatos { 5 public abstract class GDatos 6 { 7 #region "Declaracin de Variables"8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6

protected protected protected protected protected protected

string MServidor = ""; string MBase = ""; string MUsuario = ""; string MPassword = ""; string MCadenaConexion = ""; IDbConnection MConexion;

#endregion #region "Setters y Getters" // Nombre del equipo servidor de datos. public string Servidor { get { return MServidor; } set { MServidor = value; } } // end Servidor // Nombre de la base de datos a utilizar. public string Base { get { return MBase; } set { MBase = value; } } // end Base // Nombre del Usuario de la BD. public string Usuario { get { return MUsuario; } set { MUsuario = value; } } // end Usuario

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

// Password del Usuario de la BD. public string Password { get { return MPassword; } set { MPassword = value; }

8/16

08/05/12

Como programar en n-Capas con C# (Parte 1)4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 7 0 7 1

set { MPassword = value; } } // end Password // Cadena de conexin completa a la base. public abstract string CadenaConexion { get; set; } #endregion #region "Privadas" // Crea u obtiene un objeto para conectarse a la base de datos. protected IDbConnection Conexion { get { // si aun no tiene asignada la cadena de conexion lo hace if (MConexion == null) MConexion = CrearConexion(CadenaConexion); // si no esta abierta aun la conexion, lo abre if (MConexion.State != ConnectionState.Open) MConexion.Open();

// retorna la conexion en modo interfaz, para que se adapte a cualquier implementacion de los distintos fabricantes de motores de bases 7 de datos 2 7 3 return MConexion; 7 4 } // end get 7 5 } // end Conexion7 6 7 7 7 8 7 9 8 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 9 0 9 1 9 2 9 3 9 4 9 5 9 6 9 7 9 8 9 9 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 10 1

#endregion #region "Lecturas" // Obtiene un DataSet a partir de un Procedimiento Almacenado. public DataSet TraerDataSet(string procedimientoAlmacenado) { var mDataSet = new DataSet(); CrearDataAdapter(procedimientoAlmacenado).Fill(mDataSet); return mDataSet; } // end TraerDataset

//Obtiene un DataSet a partir de un Procedimiento Almacenado y sus parmetros. public DataSet TraerDataSet(string procedimientoAlmacenado, params Object[] args) { var mDataSet = new DataSet(); CrearDataAdapter(procedimientoAlmacenado, args).Fill(mDataSet); return mDataSet; } // end TraerDataset // Obtiene un DataSet a partir de un Query Sql. public DataSet TraerDataSetSql(string comandoSql) { var mDataSet = new DataSet(); CrearDataAdapterSql(comandoSql).Fill(mDataSet); return mDataSet; } // end TraerDataSetSql

// Obtiene un DataTable a partir de un Procedimiento Almacenado. public DataTable TraerDataTable(string procedimientoAlmacenado) 11 1 { return www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

9/16

08/05/12

Como programar en n-Capas con C# (Parte 1)11 1

{ return } // end

1 2TraerDataSet(procedimientoAlmacenado).Tables[0].Copy(); 1 1 3TraerDataTable 1 14 1 15 1 16 1 18 1

//Obtiene un DataSet a partir de un Procedimiento Almacenado y sus

1 7parmetros. 1

public DataTable TraerDataTable(string procedimientoAlmacenado, Object[] args) 10 2 { return TraerDataSet(procedimientoAlmacenado, 1 1args).Tables[0].Copy(); } // end TraerDataTable 21 9params 1 12 2

//Obtiene un DataTable a partir de un Query SQL public DataTable TraerDataTableSql(string comandoSql) 15 2 { return TraerDataSetSql(comandoSql).Tables[0].Copy(); } // end 1 6TraerDataTableSql 213 2 14 2 17 2

// Obtiene un DataReader a partir de un Procedimiento Almacenado. public IDataReader TraerDataReader(string 1 0procedimientoAlmacenado) 3 11 3 { 12 3 var com = Comando(procedimientoAlmacenado); 13 3 return com.ExecuteReader(); 14 3 } // end TraerDataReader18 2 19 2 15 3 16 3

// Obtiene un DataReader a partir de un Procedimiento Almacenado y parmetros. 19 3 public IDataReader TraerDataReader(string 1 0procedimientoAlmacenado, params object[] args) 4 11 4 { 12 4 var com = Comando(procedimientoAlmacenado); 13 4 CargarParametros(com, args); 14 4 return com.ExecuteReader(); 15 4 } // end TraerDataReader17 3 1 8sus 3 16 4 17 4 18 4 19 4 10 5 11 5 12 5 13 5 14 5 1 5Solo 5 16 5 1 7se 5 18 5 19 5 10 6 11 6 12 6 13 6 14 6 15 6 16 6 17 6 18 6

// Obtiene un DataReader a partir de un Procedimiento Almacenado. public IDataReader TraerDataReaderSql(string comandoSql) { var com = ComandoSql(comandoSql); return com.ExecuteReader(); } // end TraerDataReaderSql // Obtiene un Valor Escalar a partir de un Procedimiento Almacenado. funciona con SP's que tengan

// definida variables de tipo output, para funciones escalares mas abajo declara un metodo public object TraerValorOutput(string procedimientoAlmacenado) { // asignar el string sql al command var com = Comando(procedimientoAlmacenado); // ejecutar el command com.ExecuteNonQuery(); // declarar variable de retorno Object resp = null;

// recorrer los parametros del SP foreach (IDbDataParameter par in com.Parameters) 19 6 // si tiene parametros de tipo IO/Output retornar ese valor 10 7 if (par.Direction == ParameterDirection.InputOutput || 1 1par.Direction == ParameterDirection.Output) 7 12 7 resp = par.Value; 13 7 return resp; 14 7 } // end TraerValor15 7

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

10/16

08/05/12

Como programar en n-Capas con C# (Parte 1)16 7 17 7 19 7 11 8 12 8 13 8 14 8 15 8 16 8 17 8 18 8 19 8 10 9 11 9 12 9

// Obtiene un Valor a partir de un Procedimiento Almacenado, y sus public object TraerValorOutput(string procedimientoAlmacenado, Object[] args) { // asignar el string sql al command var com = Comando(procedimientoAlmacenado); // cargar los parametros del SP CargarParametros(com, args); // ejecutar el command com.ExecuteNonQuery(); // declarar variable de retorno Object resp = null;

1 8parmetros. 7 1 0params 8

// recorrer los parametros del SP foreach (IDbDataParameter par in com.Parameters) 13 9 // si tiene parametros de tipo IO/Output retornar ese valor 14 9 if (par.Direction == ParameterDirection.InputOutput || 1 5par.Direction == ParameterDirection.Output) 9 16 9 resp = par.Value; 17 9 return resp; 18 9 } // end TraerValor19 9 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 20 1 22 1 23 1 24 1 2 1sentencias 1

// Obtiene un Valor Escalar a partir de un Procedimiento Almacenado. public object TraerValorOutputSql(string comadoSql) { // asignar el string sql al command var com = ComandoSql(comadoSql); // ejecutar el command com.ExecuteNonQuery(); // declarar variable de retorno Object resp = null; // recorrer los parametros del Query (uso tipico envio de varias sql en el mismo command) foreach (IDbDataParameter par in com.Parameters)

// si tiene parametros de tipo IO/Output retornar ese valor if (par.Direction == ParameterDirection.InputOutput || 2 5par.Direction == ParameterDirection.Output) 1 26 1 resp = par.Value; 27 1 return resp; 28 1 } // end TraerValor29 1 20 2 21 2 23 2 24 2 25 2 Bienvenido a 26 2 27 2 28 2 29 2

// Obtiene un Valor de una funcion Escalar a partir de un Procedimiento public object TraerValorEscalar(string procedimientoAlmacenado) { var com = Comando(procedimientoAlmacenado); SvMembers, Has click aqui para registrarte!! return com.ExecuteScalar(); } // end TraerValorEscalar

2 2Almacenado. 2

/// Obtiene un Valor de una funcion Escalar a partir de un Almacenado, con Params de Entrada 21 3 public Object TraerValorEscalar(string procedimientoAlmacenado, 2 2params object[] args) 3 23 3 { 24 3 var com = Comando(procedimientoAlmacenado); 25 3 CargarParametros(com, args); 26 3 return com.ExecuteScalar(); 27 3 } // end TraerValorEscalar2 0Procedimiento 3 28 3 29 3 20 4

// Obtiene un Valor de una funcion Escalar a partir de un Query SQL public object TraerValorEscalarSql(string comandoSql)11/16

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

08/05/12

20 4 21 4 22 4 23 4 24 4 25 4 26 4 27 4 28 4 29 4 20 5 21 5

Como programar en n-Capas con C# (Parte 1)

public object TraerValorEscalarSql(string comandoSql) { var com = ComandoSql(comandoSql); return com.ExecuteScalar(); } // end TraerValorEscalarSql #endregion #region "Acciones"

protected abstract IDbConnection CrearConexion(string cadena); protected abstract IDbCommand Comando(string 2 2procedimientoAlmacenado); 5 23 5 protected abstract IDbCommand ComandoSql(string comandoSql); 24 5 protected abstract IDataAdapter CrearDataAdapter(string 2 5procedimientoAlmacenado, params Object[] args); 5 26 5 protected abstract IDataAdapter CrearDataAdapterSql(string 2 7comandoSql); 5 28 5 protected abstract void CargarParametros(IDbCommand comando, 2 9Object[] args); 520 6 21 6 22 6 23 6 24 6 25 6 26 6 27 6 28 6 29 6 20 7 21 7 22 7 23 7 24 7 25 7 26 7 27 7 28 7 29 7 20 8 21 8 22 8 23 8 24 8 25 8 26 8 27 8 28 8 29 8 20 9

// metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar() { if (Conexion.State != ConnectionState.Open) Conexion.Open(); return true; }// end Autenticar // metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar(string vUsuario, string vPassword) { MUsuario = vUsuario; MPassword = vPassword; MConexion = CrearConexion(CadenaConexion); MConexion.Open(); return true; }// end Autenticar

// cerrar conexion public void CerrarConexion() { if (Conexion.State != ConnectionState.Closed) MConexion.Close(); } // end CerrarConexion

// Ejecuta un Procedimiento Almacenado en la base. public int Ejecutar(string procedimientoAlmacenado) 23 9 { return Comando(procedimientoAlmacenado).ExecuteNonQuery(); 2 4} // end Ejecutar 921 9 22 9 25 9

// Ejecuta un query sql public int EjecutarSql(string comandoSql) 28 9 { return ComandoSql(comandoSql).ExecuteNonQuery(); } // end 2 9Ejecutar 926 9 27 9 30 0 31 0 33 0 35 0

//Ejecuta un Procedimiento Almacenado en la base, utilizando los public int Ejecutar(string procedimientoAlmacenado, params args) {

3 2parmetros. 0 3 4Object[] 0

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

12/16

08/05/12

35 0 36 0 37 0

Como programar en n-Capas con C# (Parte 1)

{

var com = Comando(procedimientoAlmacenado); CargarParametros(com, args); 38 0 var resp = com.ExecuteNonQuery(); 39 0 for (var i = 0; i < com.Parameters.Count; i++) 30 1 { 31 1 var par = (IDbDataParameter)com.Parameters[i]; 32 1 if (par.Direction == ParameterDirection.InputOutput || 3 3par.Direction == ParameterDirection.Output) 1 34 1 args.SetValue(par.Value, i - 1); 35 1 }// end for 36 1 return resp; 37 1 } // end Ejecutar38 1 39 1 30 2 31 2 32 2 33 2 34 2 35 2 36 2 37 2 38 2 39 2 30 3 31 3 32 3 33 3 34 3

#endregion #region "Transacciones" protected IDbTransaction MTransaccion; protected bool EnTransaccion;

//Comienza una Transaccin en la base en uso. public void IniciarTransaccion() { try { MTransaccion = Conexion.BeginTransaction(); EnTransaccion = true; }// end try finally { EnTransaccion = false; } }// end IniciarTransaccion

//Confirma la transaccin activa. public void TerminarTransaccion() { try { MTransaccion.Commit()[En lnea

AYUDANOS ENVIANDO ESTE TEMA A LAS REDES SOCIALES:

SvMembers

SvMembers | Unidos Somos Red!

Como programar en n-Capas con C# (Parte 1) : julio 23, 2010, 05:23:45 pm

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

13/16

08/05/12

Como programar en n-Capas con C# (Parte 1)

Nuestros lectores tambin disfrutaron

Gasta ms de $ 136,000. en 00 operaciones para parecer un personaje de anim

4000 animaciones Flash (botones, intros, mens, etc. , cdigo fuente . F LA incluid

Ideas muy originales para tu perfil de facebook

[?]

NegroSilver Member

Re:Como programar en n-Capas con C# (Parte 1) Respuesta #1 : enero 25, 2011, 02:29:29 pm

Pues esta muy bien la info pero en conclucion no hay teoria sino la explicacion basica en un codigo de conexion a la BD pero esta bien la info...y en la declaracion de las variables recordar que se tienen que inicialisar....ya que son uno de los pasos mas importantes de la programacion en C Sharp o C#..Mensajes: 252 618Pieza oro Ver Inventario Enviar oro a Negro Karma: +0/-0

Gracias por la info!!..En lnea Su sistema Operativo es Windows XP y Utiliza Firefox! Es de sabios preguntar y de tontos el callar

SvMembers | Unidos Somos Red!

Re:Como programar en n-Capas con C# (Parte 1) Respuesta #1 : enero 25, 2011, 02:29:29 pm

Lenguaje de programacin Hazlo a travs del uso de macros en Excel. Ven, matriclate ya en E Microsoft Office 365 Sus Programas de Office Disponibles Dnde y Cundo quieras.

Cheap C Strings & Thongs Worldwide free shipping above 30EUR Thongs, C-Strings, Bras and M

grisliMember Superior

Re:Como programar en n-Capas con C# (Parte 1) Respuesta #2 : enero 26, 2011, 12:42:29 pm Cita de: Negro en enero 25, 2011, 02:29:29 pm Pue s e sta m uy bie n la info pe ro e n conclucion no hay te oria sino la e x plicacion basica e n un codigo de cone x ion a la BD pe ro e sta bie n la info...y e n la de claracion de las variable s re cordar que se tie ne n que inicialisar....ya que son uno de los pasos m as im portante s de la program acion e n C Sharp o C #..

Mensajes: 157 701Pieza oro www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

14/16

08/05/12701Pieza oro Ver Inventario Enviar oro a grisli Karma: +1/-0

Como programar en n-Capas con C# (Parte 1)Gracias por la info!!..

uno de los pasos m as im portante s de la program acion e n C Sharp o C #..

creo que con los comentarios en cada linea de codigo te da mas que teoria te explica con lujo de detalles que hace esa linea ( //comentario ) y las variables las podes inicializar donde queras siempre y cuando no las este utilizando antes de que las declaresEn lnea

NegroSilver Member

Re:Como programar en n-Capas con C# (Parte 1) Respuesta #3 : enero 26, 2011, 04:29:39 pm

Sii con se q las // son comentarios pero esta buena la info...en otros lenjuagues se usa #... o depende pero esta bien...En lnea Su sistema Operativo es Windows XP y Utiliza Firefox! Es de sabios preguntar y de tontos el callar

Mensajes: 252 618Pieza oro Ver Inventario Enviar oro a Negro Karma: +0/-0

PhreakerAdministrator Member Supremo

Re:Como programar en n-Capas con C# (Parte 1) Respuesta #4 : noviembre 14, 2011, 05:31:12 pm Cita de: Negro en enero 26, 2011, 04:29:39 pm Sii con se q las // son com e ntarios pe ro e sta bue na la info...e n otros le njuague s se usa #... o de pe nde pe ro e sta bie n...

Bueno y al final lograste hacer lo que querias?En lnea Mensajes: 1836 99927772Pieza oro Ver Inventario Enviar oro a Phreaker Karma: +20/-0 Mis Objetos SvMembers

La estupides humana no tiene limites...

Pginas: [1]

Ir Arriba

I M P RI M I R

anterior prximo

Tags SvM:SvMembers | Unidos Somos Red! Soporte / Informtica / Tecnologa Programacin Otros C omo programar en n-C apas con C # (Parte 1)

Ir a:

===> Otros

ir

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

15/16

08/05/12

Como programar en n-Capas con C# (Parte 1)

Ir a:

===> Otros

ir

Powe re d by SMF 2.0.2 | SMF 20062009, Sim ple Machine s LLC | Mods by SMFSim ple .com SMFAds for Fre e Forum s Sim ple Portal 2.3.3 2008-2010, Sim ple Portal XHTML R SS W AP2 Pgina cre ada e n 5.375 se gundos con 32 consultas.

www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4

16/16