Como Programar en N-Capas Con C# (Parte 1)

08/05/12 Como programar en n-Capas con C# (Parte 1) Sitios Asociados: SvMembers V3.0 / SmS Mensajitos PhP V2.22 Bienve

Views 44 Downloads 0 File size 868KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

08/05/12

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

Sitios Asociados: SvMembers V3.0 / SmS Mensajitos PhP V2.22 Bienvenido(a), Visitante. Por favor, ingresa o regístrate. Siempre

Ingresar

Ingresar con nombre de usuario, contraseña y duración de la sesión

Inicio

Forum

Ayuda

Buscar

Tags SvM

Tienda SvM

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

Downloads

Ingresar

Registrarse

SvMembers | Unidos Somos Red! » Soporte / Informática / Tecnología » Programación » Otros » C omo programar en n-C apas con C # (Parte 1)

Me gusta

76

« anterior próximo » Páginas: [1]

Ir Abajo

Autor

I M P RI M I R

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

0 (Leído Usuarios2149 y 1 Visitante veces)están viendo este tema.

Phreaker Administrator Member Supremo

0

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

Este es un tema polémico del que se habla mucho y nada, digo que se habla mucho porque al buscar algo de información en Internet, uno se da cuenta, que esta plagado de sitios donde preguntan como aplicar programación en 3 capas, o N-Capas, pero en muy pocos lugares se responde con algo cierto y concreto, la mayoría hacen referencia a libros gordos que tardarías en leer semanas (no estoy en contra de la lectura, es un proceso largo nada más y casi todos buscamos aprenderlo un poco más rápido). Este artículo también será bastante largo y me aventuro a decir que me tomará varias noches escribirlo completamente, pero no será nada Mensajes: 1836 99927772Pieza oro Ver Inventario Enviar oro a Phreaker Karma: +20/-0 Mis Objetos

La estupides humana no tiene limites...

comparado con un libro con un lomo de 15 centímetros La primer gran confusión que noto, es que la mayoría no sabe diferenciar entre los conceptos 1. Arquitectura de 3 capas: se basa más bien en como será construido el entorno, una manera de decirlo en romper el clásico 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 programación en capas. Se acerca más a un concepto físico. 2. Programación en 3 (n) capas: este es el tema en cuestión y estira más hacia un concepto lógico. En cómo partimos, agrupamos, clasificamos, optimizamos nuestro código. El mismo introduce conceptos como Capa de Acceso a Datos (Esta nos permite conectarnos a la fuente de datos y

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

1/16

08/05/12

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

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 aplicación en sí y en la BBDD), y Capa de Presentación (es más bien lo que el usuario percibe, su interfaz gráfica 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 separación en capas quiere decir que podemos cambiar de proveedor de base de datos, y no necesitaremos reescribir toda la aplicación de vuelta, sino solamente esa pequeña capa y reutilizaríamos la interfaz y las reglas de negocios, o también podemos mantener las reglas de negocios y el motor de base de datos, y fácilmente cambiarnos de una interfaz WinForm a WebForm, siempre la más dura de cambiar en la de negocios ya que afecta en un nivel mínimo a las otras 2 capas. Creo que ya es suficiente teoría de momento y podemos comenzar con la acción, el código 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 versión 2005 con el framework 2.0 en adelante, ya que ADO.Net no ha sufrido grandes cambios desde esa versión, así que ustedes lo pueden ir creando en la versión del IDE o framework que más gusten. Primeramente vamos a crear una solución 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: usingSystem; 1

using System.Data;

2

Lo siguiente que haremos será estructurar en código con regiones para una mayor comodidad en la lectura del mismo, la primer región es la de Declaración de Variables en la misma creamos las variables o atributos para la conexion a la BBDD, más un objeto de interfaz de conexión para que sea implementada de manera específica 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 artículo. Esta es una clase que obligatoriamente debe ser hereda por otra. El nivel de acceso por eso están definidas como protected para que sean modificadas por si misma o por sus clases derivadas.

1 2 3 4 5 6 7 8

#region "Declaración de Variables"

protected protected protected protected protected protected

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

9 10#endregion

Lo siguiente por hacer es muy sencillo, crear los setters y getters de nuestros atributos anteriormente definidos:

1 2 3 4 5 6 7 8 9

#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

10

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

2/16

08/05/12

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

public string Base { 12 get { return MBase; } 13 set { MBase = value; } 14 } // end Base 11

15 16

// Nombre del Usuario de la BD. public string Usuario 18 { 19 get { return MUsuario; } 20 set { MUsuario = value; } 21 } // end Usuario 17

22 23

// Password del Usuario de la BD. public string Password 25 { 26 get { return MPassword; } 27 set { MPassword = value; } 28 } // end Password 24

29 30

// Cadena de conexión completa a la base. public abstract string CadenaConexion 32 { get; set; } 31 33 34

#endregion

35 36

#region "Privadas"

37 38

// Crea u obtiene un objeto para conectarse a la base de datos. protected IDbConnection Conexion 40 { 41 get 42 { 43 // si aun no tiene asignada la cadena de conexion lo hace 44 if (MConexion == null) 45 MConexion = CrearConexion(CadenaConexion); 39

46 47 48 49 50 51 52

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

53implementacion

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

57

#endregion Creamos ahora los métodos 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 implementación general.

1 2 3 4 5 6 7 8 9 10 11

#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

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

3/16

08/05/12

Como programar en n-Capas con C# (Parte 1) 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

parámetros. 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

28

// Obtiene un DataTable a partir de un Procedimiento Almacenado. public DataTable TraerDataTable(string procedimientoAlmacenado) 30 { return TraerDataSet(procedimientoAlmacenado).Tables[0].Copy(); } // 31 end TraerDataTable 29

32 33 34 35 36 37 38 39

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

40

//Obtiene un DataTable a partir de un Query SQL public DataTable TraerDataTableSql(string comandoSql) 42 { return TraerDataSetSql(comandoSql).Tables[0].Copy(); } // end 43 TraerDataTableSql 41

44 45 46 47 48 49 50

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

51 52 53 54 55 56 57 58 59 60

// Obtiene un DataReader a partir de un Procedimiento Almacenado y sus parámetros. public IDataReader TraerDataReader(string procedimientoAlmacenado, params object[] args) { var com = Comando(procedimientoAlmacenado); CargarParametros(com, args); return com.ExecuteReader(); } // end TraerDataReader

61 62 63 64 65 66 67

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

68 69 70 71 72 73 74 75

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

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)

var com = Comando(procedimientoAlmacenado); // ejecutar el command com.ExecuteNonQuery(); // declarar variable de retorno Object resp = null;

76 77 78 79 80 81

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

82 83 84 85 86 87 88 89 90

// Obtiene un Valor a partir de un Procedimiento Almacenado, y sus parámetros. 93 public object TraerValorOutput(string procedimientoAlmacenado, 94 params Object[] args) 95 { 96 // asignar el string sql al command 97 var com = Comando(procedimientoAlmacenado); 98 // cargar los parametros del SP 99 CargarParametros(com, args); 100 // ejecutar el command 101 com.ExecuteNonQuery(); 91 92

102 103

// declarar variable de retorno Object resp = null;

104

// 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 resp = par.Value; 111 return resp; 112} // end TraerValor 105 106

113 114//

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

115public 116{ 117 118 119 120 121 122

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

123

// 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) 130 resp = par.Value; 131 return resp; 132} // end TraerValor 124

125sql

133 134//

Obtiene un Valor de una funcion Escalar a partir de un Procedimiento

135Almacenado. 136public

object TraerValorEscalar(string procedimientoAlmacenado)

137{

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

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 métodos abstractos, para que las clases derivadas estén obligadas a implementarlas a su manera, en un modo especifico, ya que los objetos connection, command, dataadapter, son muy específicos y deben ser implementados por cada una.

1

#region "Acciones"

2

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); 10 protected abstract void CargarParametros(IDbCommand comando, 11 Object[] args); 3

12 13

// metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar() 15 { 16 if (Conexion.State != ConnectionState.Open) 17 Conexion.Open(); 18 return true; 19 }// end Autenticar 14

20 21

// metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar(string vUsuario, string vPassword) 23 { 24 MUsuario = vUsuario; 25 MPassword = vPassword; 26 MConexion = CrearConexion(CadenaConexion); 22

27 28

MConexion.Open(); return true; 30 }// end Autenticar 29 31 32 33

// cerrar conexion public void CerrarConexion() 35 { 36 if (Conexion.State != ConnectionState.Closed) 37 MConexion.Close(); 38 } 34

39

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

6/16

08/05/12

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

39 40

// end CerrarConexion

41 42 43

// Ejecuta un Procedimiento Almacenado en la base. public int Ejecutar(string procedimientoAlmacenado) 45 { return Comando(procedimientoAlmacenado).ExecuteNonQuery(); } // 46 end Ejecutar 44

47 48

// Ejecuta un query sql public int EjecutarSql(string comandoSql)

49

50{

return ComandoSql(comandoSql).ExecuteNonQuery(); } // end Ejecutar

51 52//Ejecuta 53public

un Procedimiento Almacenado en la base, utilizando los parámetros. int Ejecutar(string procedimientoAlmacenado, params Object[]

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 sección transaccional, no se utiliza normalmente en todos lados desde la aplicación, pero en procesos dependientes es necesario, así que si necesitamos usarlo, podemos crearlo de este modo:

1 2 3 4

#region "Transacciones"

protected IDbTransaction MTransaccion; protected bool EnTransaccion;

5

//Comienza una Transacción en la base en uso. public void IniciarTransaccion() 7 { 8 try 9 { 10 MTransaccion = Conexion.BeginTransaction(); 11 EnTransaccion = true; 12 }// end try 13 finally 14 { EnTransaccion = false; } 15 }// end IniciarTransaccion 6

16 17 18

//Confirma la transacción activa. public void TerminarTransaccion() 20 { 21 try 22 { MTransaccion.Commit(); } 23 finally 24 { 25 MTransaccion = null; 26 EnTransaccion = false; 27 }// end finally 28 }// end TerminarTransaccion 19

29

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

7/16

08/05/12

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

//Cancela la transacción activa.

32public

void AbortarTransaccion()

33{

try { MTransaccion.Rollback(); } 36 finally 37 { 38 MTransaccion = null; 39 EnTransaccion = false; 40 }// end finally 41}// end AbortarTransaccion 34 35

42 43#endregion 44

El código completo lo pueden ver aqui:

1 2

usingSystem;

using System.Data;

3

namespace AccesoDatos { 5 public abstract class GDatos 6 { 7 #region "Declaración de Variables" 4

8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

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

41 42 43 44 45 46

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

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

8/16

08/05/12

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

set { MPassword = value; } } // end Password

46 47 48

// Cadena de conexión completa a la base. public abstract string CadenaConexion { get; set; }

49 50 51 52

#endregion

53 54

#region "Privadas"

55 56

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

57 58 59 60 61 62 63 64 65

// si no esta abierta aun la conexion, lo abre if (MConexion.State != ConnectionState.Open) MConexion.Open();

66 67 68 69

// 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 75 } // end Conexion 70 71

76

#endregion

77 78

#region "Lecturas"

79 80

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

81 82 83 84 85 86 87 88 89

//Obtiene un DataSet a partir de un Procedimiento Almacenado y sus parámetros. public DataSet TraerDataSet(string procedimientoAlmacenado, params Object[] args) { var mDataSet = new DataSet(); CrearDataAdapter(procedimientoAlmacenado, args).Fill(mDataSet); return mDataSet;

90 91 92 93 94 95 96 97 98 99

} // end TraerDataset

100 101 102 103 104 105 106 107

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

108

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

9/16

08/05/12

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

{ return

111

112TraerDataSet(procedimientoAlmacenado).Tables[0].Copy();

} // end

113TraerDataTable 114 115

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

116

117parámetros.

public DataTable TraerDataTable(string procedimientoAlmacenado, Object[] args) 120 { return TraerDataSet(procedimientoAlmacenado, 121args).Tables[0].Copy(); } // end TraerDataTable 118

119params

122

//Obtiene un DataTable a partir de un Query SQL public DataTable TraerDataTableSql(string comandoSql) 125 { return TraerDataSetSql(comandoSql).Tables[0].Copy(); } // end 126TraerDataTableSql 123 124

127

// Obtiene un DataReader a partir de un Procedimiento Almacenado. public IDataReader TraerDataReader(string 130procedimientoAlmacenado) 131 { 132 var com = Comando(procedimientoAlmacenado); 133 return com.ExecuteReader(); 134 } // end TraerDataReader 128 129

135 136

// Obtiene un DataReader a partir de un Procedimiento Almacenado y parámetros. 139 public IDataReader TraerDataReader(string 140procedimientoAlmacenado, params object[] args) 141 { 142 var com = Comando(procedimientoAlmacenado); 143 CargarParametros(com, args); 144 return com.ExecuteReader(); 145 } // end TraerDataReader 137

138sus

146

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

147 148 149 150 151 152 153 154 155Solo 156 157se 158 159 160 161 162 163 164 165

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

166

// recorrer los parametros del SP foreach (IDbDataParameter par in com.Parameters) 169 // si tiene parametros de tipo IO/Output retornar ese valor 170 if (par.Direction == ParameterDirection.InputOutput || 171par.Direction == ParameterDirection.Output) 172 resp = par.Value; 173 return resp; 174 } // end TraerValor 167 168

175

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) 176 177

// Obtiene un Valor a partir de un Procedimiento Almacenado, y sus

178parámetros. 179

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;

180params 181 182 183 184 185 186 187 188 189 190

// 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 191 192

199 200 201 202 203 204 205 206 207 208

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

209 210

// recorrer los parametros del Query (uso tipico envio de varias sql en el mismo command) foreach (IDbDataParameter par in com.Parameters)

211sentencias 212

// si tiene parametros de tipo IO/Output retornar ese valor if (par.Direction == ParameterDirection.InputOutput || 215par.Direction == ParameterDirection.Output) 216 resp = par.Value; 217 return resp; 218 } // end TraerValor 213 214

219 220 221

// Obtiene un Valor de una funcion Escalar a partir de un Procedimiento

222Almacenado. 223 224 225 Bienvenido a 226 227

public object TraerValorEscalar(string procedimientoAlmacenado) { var com = Comando(procedimientoAlmacenado); SvMembers, Has click aqui para registrarte!! return com.ExecuteScalar(); } // end TraerValorEscalar

228

/// Obtiene un Valor de una funcion Escalar a partir de un Almacenado, con Params de Entrada 231 public Object TraerValorEscalar(string procedimientoAlmacenado, 232params object[] args) 233 { 234 var com = Comando(procedimientoAlmacenado); 235 CargarParametros(com, args); 236 return com.ExecuteScalar(); 237 } // end TraerValorEscalar 229

230Procedimiento

238 239 240

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

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

11/16

08/05/12

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

240 241 242 243 244

public object TraerValorEscalarSql(string comandoSql) { var com = ComandoSql(comandoSql); return com.ExecuteScalar(); } // end TraerValorEscalarSql

245 246

#endregion

247 248

#region "Acciones"

249

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 protected abstract IDataAdapter CrearDataAdapterSql(string 257comandoSql); 258 protected abstract void CargarParametros(IDbCommand comando, 259Object[] args); 250 251

260 261 262 263 264 265 266 267

// metodo sobrecargado para autenticarse contra el motor de BBDD public bool Autenticar() { if (Conexion.State != ConnectionState.Open) Conexion.Open(); return true; }// end Autenticar

268 269

// metodo sobrecargado para autenticarse contra el motor de BBDD

270

public bool Autenticar(string vUsuario, string vPassword) { MUsuario = vUsuario; MPassword = vPassword; MConexion = CrearConexion(CadenaConexion);

271 272 273 274 275 276 277 278

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

279 280 281 282 283 284 285 286

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

287 288

// end CerrarConexion

289 290

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

//Ejecuta un Procedimiento Almacenado en la base, utilizando los

302parámetros. 303

public int Ejecutar(string procedimientoAlmacenado, params args) {

304Object[] 305

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

12/16

08/05/12

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

305

{

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 return resp; 317 } // end Ejecutar 306 307

318 319 320

#endregion

321 322

#region "Transacciones"

323 324 325

protected IDbTransaction MTransaccion; protected bool EnTransaccion;

326 327 328 329 330 331 332 333 334

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

//Confirma la transacción activa. public void TerminarTransaccion() { try { MTransaccion.Commit()[ En línea

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 también disfrutaron

Gasta más de $

4000

Ideas muy

136,000.​ 00 en operaciones para parecer un personaje de animé

animaciones Flash (botones, intros, menús, etc.​ , código fuente .​ F LA incluid

originales para tu perfil de facebook

[?]

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!!.. En línea 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 programación Hazlo a través del uso de macros en Excel. Ven, matricúlate ya en E Microsoft® Office 365 Sus Programas de Office Disponibles Dónde y Cuándo quieras.

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

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

Como programar en n-Capas con C# (Parte 1) 701Pieza oro Ver Inventario Enviar oro a grisli Karma: +1/-0

uno de los pasos m as im portante s de la program acion e n C Sharp o C #.. Gracias por 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 En línea

Negro Silver 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 línea

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

Phreaker Administrator Member Supremo

Su sistema Operativo es Windows XP y Utiliza Firefox! Es de sabios preguntar y de tontos el callar

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 línea Mensajes: 1836 99927772Pieza oro Ver Inventario Enviar oro a Phreaker Karma: +20/-0 Mis Objetos

SvMembers

La estupides humana no tiene limites...

Páginas: [1]

Ir Arriba

I M P RI M I R

« anterior próximo »

Tags SvM: SvMembers | Unidos Somos Red! » Soporte / Informática / Tecnología » Programación » Otros » C omo programar en n-C apas con C # (Parte 1)

Ir a:

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

===> Otros

ir

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 © 2006–2009, 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 Página 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