You are on page 1of 16

08/05/12

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

SV MEMBERS

cambate a la nueva tecnologa de informtica

Buscar

Sitios Asociados: SvMembers V3.0 / SmS Mensajitos PhP V2.22


Bienvenido(a), Visitante. Por favor, ingresa o regstrate. Siempre

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

Ingresar

Noticias: SvMembers te presenta su nueva Tienda SvM! C reado por Staff SvM. Ir al tema oficial!

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 Abajo

I M P RI M I R

Autor

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

0 Usuarios y 1 Visitante estn viendo este tema.

Phreaker
Administrator Member Supremo

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


: julio 23, 2010, 05:23:45 pm

u u

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 nada comparado con un libro con un lomo de 15 centmetros

Mensajes: 1836 99927772Pieza oro Ver Inventario Enviar oro a Phreaker Karma: +20/-0 Mis Objetos

La primer gran confusin que noto, es que la mayora no sabe entre los conceptos

diferenciar

1. Arquitectura de 3 capas: se basa ms bien en como ser construido el entorno, una manera de decirlo en romper el clsico concepto ClienteBase de Datos), Servidor para introducir conceptos como Back End ( Middlew are (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 y
1/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 framew ork 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 framew ork 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: System; using System.Data;
using

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

1 2

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 sus clases derivadas.
#region "Declaracin de Variables" 1 2 3

por si misma o

protected protected 4 protected 5 protected


6 7 8 9 10#endregion

string string string string

MServidor = ""; MBase = ""; MUsuario = ""; MPassw ord = "";

protected string MCadenaConexion = ""; protected IDbConnection MConexion;

Lo siguiente por hacer es muy sencillo, crear los setters y nuestros atributos anteriormente definidos:
#region "Setters y Getters" 1 2 3 4 5 6 7 8 9 1 0public

getters de

// 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. string Base
2/16

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

08/05/12

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

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

2 2 2 3 2 4 2 2 2 2

// Nombre del Usuario de la BD. public string Usuario 8 { 9 get { return MUsuario; } 0 set { MUsuario = value; } 1 } // end Usuario // Password del Usuario de la BD. public string Passw ord 5 { 6 get { return MPassw ord; } 7 set { MPassw ord = value; } 8 } // end Password

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

// 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 0 { 1 get 2 { 3 // si aun no tiene asignada la cadena de conexion lo hace 4 if (MConexion == null) 5 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

4 6 4 7 4 8 4 9 5 0 5 1 5 2 53implementacion 54

de los distintos fabricantes de motores de bases de datos return MConexion; 55 } // end get 56} // end Conexion
57

#endregion Creamos ahora los mtodos para hacer lecturas a la fuente de datos, hacemos ya en esta clase porque son metodos generales que pueden lo

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.
#region "Lecturas" 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 sus
3/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 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1

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) { return TraerDataSet(procedimientoAlmacenado).Tables[0].Copy(); } // end TraerDataTable //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 TraerDataTableSql
4 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

// 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 7 3 public object TraerValorOutput(string procedimientoAlmacenado) 7 4 { // asignar el string sql al command 7 5
www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4 4/16

08/05/12

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


76 77 78 79 80 81 82 83

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) 84 // si tiene parametros de tipo IO/Output retornar ese valor 85 if (par.Direction == ParameterDirection.InputOutput || par.Direction 86 == ParameterDirection.Output)
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106

resp = par.Value; return resp; } // end TraerValor // Obtiene un Valor a partir de un Procedimiento Almacenado, y sus parmetros. public object TraerValorOutput(string procedimientoAlmacenado, params 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;

// recorrer los parametros del SP foreach (IDbDataParameter par in com.Parameters) 107 // si tiene parametros de tipo IO/Output retornar ese valor 108 if (par.Direction == ParameterDirection.InputOutput || par.Direction 109== ParameterDirection.Output)
110 111 112} 113 114// 116{ 117 118 119 120 121 122 123 124 115public

resp = par.Value; return resp; // end TraerValor 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) 126 foreach (IDbDataParameter par in com.Parameters) 127 // si tiene parametros de tipo IO/Output retornar ese valor 128 if (par.Direction == ParameterDirection.InputOutput || par.Direction 129== ParameterDirection.Output)
125sql 130 131 132} 133 134//

resp = par.Value; return resp; // end TraerValor Obtiene un Valor de una funcion Escalar a partir de un Procedimiento object TraerValorEscalar(string procedimientoAlmacenado)

135Almacenado. 136public 137{ 138 139

var com = Comando(procedimientoAlmacenado); return com.ExecuteScalar(); 140} // end TraerValorEscalar


www.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.
#region "Acciones" 1 2 3 5 6 8 9

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

// metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar() 5 { 6 if (Conexion.State != ConnectionState.Open) 7 Conexion.Open(); 8 return true; 9 }// end Autenticar // metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar(string vUsuario, string vPassw ord) 3 { 4 MUsuario = vUsuario; 5 MPassw ord = vPassw ord; 6 MConexion = CrearConexion(CadenaConexion);

2 0 2 1 2 2 2 2 2 2

2 7 2 8 2 9 3 1 3 2 3 3// 3 4 3 3 3 3

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

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


6/16

3 9

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

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 Ejecutar
4 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[]

50{ 51

52//Ejecuta 53public 54args) 55{

var com = Comando(procedimientoAlmacenado); CargarParametros(com, args); 58 var resp = com.ExecuteNonQuery(); 59 for (var i = 0; i < com.Parameters.Count; i++) 60 { 61 var par = (IDbDataParameter)com.Parameters[i]; 62 if (par.Direction == ParameterDirection.InputOutput || par.Direction 63== ParameterDirection.Output) args.SetValue(par.Value, i - 1); }// end for return resp; } // end Ejecutar
56 57

#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:
#region "Transacciones" 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1

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

1 6 1 7 1 8 2 2 2 2 2 2 2 2 2 1 9public

//Confirma la transaccin activa. void TerminarTransaccion() 0{ 1 try 2 { MTransaccion.Commit(); } 3 finally 4 { 5 MTransaccion = null; 6 EnTransaccion = false; 7 }// end finally 8}// end TerminarTransaccion
7/16

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

2 9

08/05/12

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


2 9 3 0 3 1

//Cancela la transaccin activa. void AbortarTransaccion()

32public 33{ 34 35

try { MTransaccion.Rollback(); } 36 finally 37 { 38 MTransaccion = null; 39 EnTransaccion = false; 40 }// end finally 41}// end AbortarTransaccion
42 43#endregion 4 4

El cdigo completo lo pueden ver aqui: System; using System.Data;


using

1 2 3 4 5 6 7 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 42 43 44 45 46

namespace AccesoDatos { public abstract class GDatos { #region "Declaracin de Variables" protected protected protected protected protected protected string MServidor = ""; string MBase = ""; string MUsuario = ""; string MPassw ord = ""; 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

// Password del Usuario de la BD. public string Passw ord { get { return MPassw ord; } set { MPassw ord = value; }
8/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)


46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

set { MPassw ord = 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 72 de datos 73 return MConexion; 74 } // end get
70 71 75 76 77 78 79 80 81 82 83 84 8 5 8 6 8 7 8 8 8 9 9 0 9 1 9 2 9 3

} // end Conexion #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) 9 4 { 9 5 var mDataSet = new DataSet(); CrearDataAdapter(procedimientoAlmacenado, args).Fill(mDataSet); 9 8 return mDataSet;
9 6 9 7 9 9 100 101 102 103 104 105 106 107 108 109 110 111

} // 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) { 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)


111

{ return } // end

112TraerDataSet(procedimientoAlmacenado).Tables[0].Copy(); 113TraerDataTable 114 115 116 118 120 122

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

117parmetros. 119params

121args).Tables[0].Copy(); 123 124

//Obtiene un DataTable a partir de un Query SQL public DataTable TraerDataTableSql(string comandoSql) 125 { return TraerDataSetSql(comandoSql).Tables[0].Copy(); } // end 126TraerDataTableSql
127 128 129 131 132 133 134 135 136 137 138sus 139 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155Solo 156 157se 158 159 160 161 162 163 164 165 166 167 168 169 170 172 173 174 175

// Obtiene un DataReader a partir de un Procedimiento Almacenado. public IDataReader TraerDataReader(string { var com = Comando(procedimientoAlmacenado); return com.ExecuteReader(); } // end TraerDataReader

130procedimientoAlmacenado)

// Obtiene un DataReader a partir de un Procedimiento Almacenado y parmetros. public IDataReader TraerDataReader(string 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. funciona con SP's que tengan

140procedimientoAlmacenado,

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

// si tiene parametros de tipo IO/Output retornar ese valor if (par.Direction == ParameterDirection.InputOutput || 171par.Direction == ParameterDirection.Output) resp = par.Value; return resp; } // end TraerValor
10/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)


176 177 179 181 182 183 184 185 186 187 188 189 190 191 192

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

178parmetros. 180params

// recorrer los parametros del SP foreach (IDbDataParameter par in com.Parameters) 193 // si tiene parametros de tipo IO/Output retornar ese valor 194 if (par.Direction == ParameterDirection.InputOutput || 195par.Direction == ParameterDirection.Output) 196 resp = par.Value; 197 return resp; 198 } // end TraerValor
199 200 201 202 203 204 205 206 207 208 209 210 212 213 214 216 217 218 219 220 221 223 224 225 226 227 228 229 231 233 234 235 236 237 238 239 240 230Procedimiento 232params 211sentencias

// 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 || 215par.Direction == ParameterDirection.Output) resp = par.Value; return resp; } // end TraerValor

// Obtiene un Valor de una funcion Escalar a partir de un Procedimiento public object TraerValorEscalar(string procedimientoAlmacenado) { var com = Comando(procedimientoAlmacenado); return com.ExecuteScalar(); } // end TraerValorEscalar /// Obtiene un Valor de una funcion Escalar a partir de un Almacenado, con Params de Entrada public Object TraerValorEscalar(string procedimientoAlmacenado, 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)
11/16

222Almacenado.

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

08/05/12

240 241 242 243 244 245 246 247 248 249 250 251

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 252procedimientoAlmacenado); 253 protected abstract IDbCommand ComandoSql(string comandoSql); 254 protected abstract IDataAdapter CrearDataAdapter(string 255procedimientoAlmacenado, params Object[] args);
256 258 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290

protected abstract IDataAdapter CrearDataAdapterSql(string protected abstract void CargarParametros(IDbCommand comando, args); // 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 vPassw ord) { MUsuario = vUsuario; MPassw ord = vPassw ord; MConexion = CrearConexion(CadenaConexion); MConexion.Open(); return true; }// end Autenticar

257comandoSql); 259Object[]

// 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) 293 { return Comando(procedimientoAlmacenado).ExecuteNonQuery(); 294} // end Ejecutar
291 292 295

// Ejecuta un query sql public int EjecutarSql(string comandoSql) 298 { return ComandoSql(comandoSql).ExecuteNonQuery(); } // end 299Ejecutar
296 297 300 301 303 305

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

302parmetros. 304Object[]

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)


305 306 307

var com = Comando(procedimientoAlmacenado); CargarParametros(com, args); 308 var resp = com.ExecuteNonQuery(); 309 for (var i = 0; i < com.Parameters.Count; i++) 310 { 311 var par = (IDbDataParameter)com.Parameters[i]; 312 if (par.Direction == ParameterDirection.InputOutput || 313par.Direction == ParameterDirection.Output) 314 args.SetValue(par.Value, i - 1); 315 }// end for
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334

return resp; } // end Ejecutar

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

Y.'
SvMembers

facebook

SvMembers Status: None Fans: 76

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 facebook

Gasta ms de $ 00 136,000 . en operac iones para parec er un personaje de anim

4000 animac iones Flash (botones, intros, mens, e t c , .c digo fuente . FLA inc luid

Ideas muy originales para tu perfil de fac ebook

[?]
i

Negro
Silver 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!!..

&2

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, matric Microsoft Office 365 Sus Programas de Office Disponibles Dnde y Cundo quieras. Cheap C Strings & Thongs Worldwide free shipping above 30EUR Thongs, C-Strings,
i

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

P ue s e sta m uy bie n la info pe ro e n co nclucio n no ha y te o ria sino la e x plica cio n ba sica e n un co digo de co ne x io n a la BD pe ro e sta bie n la info ...y e n la Mensajes: 157 de cla ra cio n de la s va ria ble s re co rda r que se tie ne n que inicia lisa r....ya que 701Pieza oro so n www.svmembers.org/como-programar-en-ncapas-con-c-parte-1-t2521.0.html#.T6lXnugtiE4 uno de lo s pa so s m a s im po rta nte s de la pro gra m a cio n e n C Sha rp o C #..

14/16

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

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

uno de lo s pa so s m a s im po rta nte s de la pro gra m a cio n e n C Sha rp o C #.. Gra cia s po r la info !!..

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 declares

fj

J
Negro
Silver Member

En lnea

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

Phreaker
Administrator 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 co n se q la s // so n co m e nta rio s pe ro e sta bue na la info ...e n o tro s le njua gue s se usa #... o de pe nde pe ro e sta bie n...

u u

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

facebook

La estupides humana no tiene limites...

SvMembers Status: None Fans: 76

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 :

ir ===> Otros 15/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)

Ir a :

===> Otros

ir

P o we re d by SMF 2.0.2 | SMF 20062009, Sim ple Ma chine s LLC | Mo ds by SMFSim ple .co m SMFAds fo r Fre e Fo rum s Sim ple P o rta l 2.3.3 2008-2010, Sim ple P o rta l XHTML R SS W AP 2 P gina cre a da e n 5.375 se gundo s co n 32 co nsulta s.

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

16/16

You might also like