C sharp - de programacion orientada a eventos a programacion orientada a objetos

   
Vista:

de programacion orientada a eventos a programacion orientada a objetos

Publicado por nadia (6 intervenciones) el 18/04/2011 23:19:55
Hola que tal tengo un problema y ruego me ayuden por favor, necesito hacer un altas bajas y cambios en C# pero sin usar dataset esto quiere decir que necesito hacer una clase para cada procedimiento en la base de datos y otra clase para la conexion?? osea una clase para update, otra para insert into otra para delete, gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

de programacion orientada a eventos a programacion orientada a objetos

Publicado por Sebastian Cruz (51 intervenciones) el 19/04/2011 18:57:26
Buenos dias Nadia si entendi bien lo que estas preguntando de como hacer clases que manejen el tema de las operaciones de guardado y recuperacion de datos (la famosa persistencia). Si es asi lo que puedes hacer es la de crear las clases que contengan toda la logica de tu aplicacion y reaccionen de acuerdo a ellas accediendo a la bd cuando sea necesario. Como esto es un tema muy largo de explicar te sugeriria que busques informacion sobre herramientas ORM las cuales permiten realizar algo como lo que estas planteando, por ejemplo un conjunto de herramientas muy conocida en la programacion para estos es Hibernate el cual esta disponible para Java y .Net (en este caso se llama NHibernate) aunque en eso vas a tener que hacer las cosas bastante a mano pero tiene como ventaja que cuando lo domines te vas a abstraer muchisimo de las operaciones de bd para dedicarle mas tiempo a la logica de negocio de la aplicacion.
Por otro lado tambien existe herramientas mas automaticas, creo q una se llama orm.net y con solo indicarle la bd y el lenguaje destino te creaba todo un proyecto con los objetos necesarios para interactuar con la bd aunque en esto lo mas recomendable era de tener una base bien normalizada para ahorrarse dolores de cabeza, pero tiene como contra que no es tan configurable como nhibernate..

Si no era esa la duda, seria bueno que aclares mas especificamente que es lo que deseas realizar para ver si te podemos dar una mano. Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

de programacion orientada a eventos a programacion orientada a objetos

Publicado por nadia (6 intervenciones) el 19/04/2011 23:46:23
Hola buenas tardes primeramente muchas gracias por la ayuda, mira tengo que hacer algo muy sencillo que es un altas bajas y cambios de una sola tabla en una bd de sql server, actualmente mediante una cadena de conexion ya puedo interactuar con la bd agrego registros, los modifico o elimino, pero tengo un form independiente para altas otra para bajas, etc entonces lo que me gustaria hacer es un solo form y desde ese form llamar una clase que contenga metodos con instrucciones insert, update, delete, el problema es que nunca habia usado c# no se si me explique mejor.
Ahorita tambien estoy batallando para guardar y rescatar una imagen de la bd

Nuevamente gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

de programacion orientada a eventos a programacion orientada a objetos

Publicado por Sebastian Cruz (51 intervenciones) el 22/04/2011 06:23:43
Como tu bien señalas eso lo podrias hacer en una clase que se encarge del manejo de la bd, para ello en tu clase deberias incluir las distintas referencias que te permitan realizar las distintas operaciones que vas a realizar: base de datos, operaciones de entrada salida, etc. Luego tendrias que declarar algunas variables en tu clase que se encargen de manejar la informacion y demas cosas de la base de datos como objetos de conexion, datasets, etc. Y despues tendrias que crear dentro de la clase los distintos metodos para que tus otras clase o formularios interactuen con ella, mas o menos a groso modo podria ser algo asi

//referencias a librerias
....
using Microsoft.Data;
using Microsoft.Data.SqlClient,
.....

public class UsuarioBD
{
//Objetos necesarios para la conexion
....
private SqlConnection conexion;
private SqlCommand comando;
private DataSet ds=null;
private SqlDataAdapter adapter;
....


public void AgregarDatos(parametro 1, parametro2,....)
{

conexion=new SqlConnection("tu cadena de conexion");
try //Intentamos abrir la conexion y realizar la operacion de agregar datos
{
conexion.Open();
string sql="Tu Consulta SQL" // Aqui armas tu consulta con los datos que le pasas al metodo
comando=new SqlCommand(sql,conexion);
comando.executeNonQuery(); //Esta instruccion ejecuta tu consulta sin traer resultados y es ideal para ejecutar inserts,update o deletes
}
catch(Exception ex)
{
//Aqui va el codigo que se tiene que ejecutar en caso de que no se conecte a la BD o suceda algun fallo grave en el metodo
}
finally //Esto cierra la conexion una vez q termine de hacer las operaciones sin importar si hubo un fallo o no
{
conexion.Close();
}

}

public void ActualizarDatos(parametro 1, parametro2,....)
{
//Aqui iria un codigo similar al anterior solo que es para el caso del update
}

public void EliminarDatos(.....)
{
//Lo mismo que en el anterior solo que para eliminar datos
}

public DataSet RecuperarDatos(parametro 1, parametro2,....)
{
//Aqui seria casi igual a los casos anteriores pero en lugar de usar el comand usariamos el dataadapter con lo que la parte del codigo quedaria

conexion=new SqlConnection("tu cadena de conexion");
try //Intentamos abrir la conexion y realizar la operacion de agregar datos
{
conexion.Open();
string sql="Tu Consulta SQL" // Aqui armas tu consulta con los datos que le pasas al metodo
adapter=new SqlAdapter(sql,conexion);
ds=new DataSet();
adapter.FIll(ds);
}
catch(Exception ex)
{
//Aqui va el codigo que se tiene que ejecutar en caso de que no se conecte a la BD o suceda algun fallo grave en el metodo
}
finally //Esto cierra la conexion una vez q termine de hacer las operaciones sin importar si hubo un fallo o no
{
conexion.Close();
}

return ds;


}

}


y luego en tu formulario lo unico q tendrias que hacer es crear una nueva instancia de tu clase y llamar al metodo correspondiente en donde lo necesites, por ejemplo

public void AgregarDatos()
{

private UsuarioBD usuario=new UsuarioBD();
usuario.AgregarDatos(dato1,dato2,...);

}

Todo esto es practicamente la escencia de los ORM q te habia platicado antes, ya q la idea de esta tecnica es la de hacer que unas clases especiales manejen exclusivamente toda la logica de la BD mientras q otras solo llamen a la informacion de estas ultimas cuando las necesiten y asi no se tenga que mesclar cosas de BD en la capa de interfaz y logica de la aplicacion con la capa de acceso a datos.
Bueno espero que te haya servido este ejemplo, y existos con tu proyecto. Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

de programacion orientada a eventos a programacion orientada a objetos

Publicado por nadia (6 intervenciones) el 25/04/2011 16:28:03
Muchas gracias de nuevo por la ayuda =) acavo de leer la informacion y la probare, solo que tengo un pequeño problema, me piden que no use dataSets =( y como que me confundo un poco en las definiciones no se que significa no usarlos o cuales son las ventajas abusando de tu amabilidad no se si me puedes despejar esta duda. Muchas gracias de nuevo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

de programacion orientada a eventos a programacion orientada a objetos

Publicado por Sebastian Cruz (51 intervenciones) el 26/04/2011 00:22:58
Hola Nadia como estas, el codigo que te propuse tambien se puede modificar para no usar dataset en lo absoluto aunque en una consulta lo mas logico es que la misma te traiga mas de un resultado, por lo tanto vas a necesitar algo en donde almacenar los datos de la misma y eso se podria implementar con arrays de objetos. Por ejemplo si tienes que traer los datos de una persona (nombre, apellido) podrias crear una clase que te permita guardar esos datos por ejemplo

public class Persona
{
//variables de la persona
string nombre;
string apellido;

//Propiedades para acceder a las variables
public string Nombre
{
get{return nombre;}
set{nombre=value;}
}
public string Apellido
{
get{return apellido;}
set{apellido=value;}
}
}

Luego al momento de realizar la consulta de datos el codigo tendria que quedar algo asi

public List<Persona> ObtenerDatosPersonas(parametro1,parametro2,....)
{

List<Persona> listaPersonas=new ListPersona<Persona>(); //Creo un array de Personas
....

try
{
conexion.Open();
comando=new SqlCommand(sql,conexion);//Tu consulta y la referencia a la conexion
SqlDataReader r=comando.ExcecuteReader(); //Creo un objeto que lea los resultados
r.Open(); //Abro el objeto

//Mientras haya registros por leer avanzo en el lector
while(r.Read())
{
//Creo un objeto Persona y completo sus datos con los resultados del objeto de lectura
Persona p=new Persona();
p.Nombre=r["nombre"].ToString(); aqui se puede referenciar a la columna del resultado por su numero de orden o bien por el nombre que posea en la consulta
p.Apellido=r["apellido"].ToString();

//Agrego a mi resultado en el vector de personas
listaPersonas.Add(p);
}
r.Close(); //Cierro el objeto de lectura
}
catch(Exception ex)
{
//Codigo en caso de error
}
finally //Cierro la conexion al final de la operacion sin importar el resultado
{
conexion.Close();
}

return listaPersonas; //retorno los resultados
}

Y ahora solo habria q utilizar el metodo por ejemplo

public void ObtenerDatos()
{

private UsuarioBD usuario=new UsuarioBD(); // Creo la clase donde esta el metodo como antes
List<Persona> misPersonas= usuario.ObtenerDatosPersonas(dato1,dato2,...); //Llamo al nuevo metodo que me va a traer un array de personas y se lo asigno a una variable del tipo array que llame misPersonas

//Muestro el nombre y apellido de cada una de las personas que obtuve al llamar al metodo
foreach(Persona p in misPersonas)
{
messagebox.Show("Nombre: " + p.Nombre + ", Apellido" + p.Apellido);
}

}

Ahora bien para responder a tu pregunta de si es bueno usar o no datasets la respuestas es depende, en el caso de que un programa sea muy pequeño y no tenga mucha esperanza de vida la verdad no importa mesclar las cosas, pero en el caso de programas mas grandes lo recomendable es dividir el mismo en por lo menos tres capas, en donde una capa seria un conjunto de clases y objetos que tienen funcionalidades comunes y bien definidas. Esta tecnica aunque tediosa en un principio te permite modificar con bastante facilidad un software sin necesidad de tener que volver a hacer todo de nuevo ya que por ejemplo en la primera capa podrias hacer todo lo relacionado con las interfaces graficas que va a ver el usuario, en la segunda capa pones todas las clases y objetos que van a tener la logica del negocio ya sea procedimientos para calcular precios, politicas de la empresa etc, mientras que la tercera capa seria exclusivamente para manejar la base de datos con dataset o cosas similares. Por ejemplo si hoy haces una aplicacion usando por decir una bd SqlServer y diviste todo en tres capas te va a ser mas facil mantener tu programa a futuro por ejemplo en el caso de que el dia de mañana un cliente quiera usar la misma pero con Oracle por decir algo, ya que en este caso solo tendrias que modificar la tercera capa para que se ajuste al nuevo motor de bd mientras que las otras dos permanecerian intactas y sin muchas modificaciones que digamos. Aunque obviamente nadie impide que puedas hacer un software que tenga mesclada la interfaz con la logica del negocio y la base de datos, pero a la larga esto se vuelve muy dificil de mantener y es mas propensa a errores que hacerlo todo por separado, en fin este tema es muy extenso como para hablarlo pero si te interesa el mismo podes tratas de conseguir bibliografia de los 3 chanchitos ups :P quize decir de los tres principales gurus de la orientacion a objetos que son Jacobson,Rumbaugh y Booch en la cual se basa muchas cosas del desarrollo de soft actual.

Bueno espero poder haber podido ayudar en algo y tambien espero no haberte aburrido mas de la cuenta, saludos y exitos =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

de programacion orientada a eventos a programacion orientada a objetos

Publicado por Nadia (6 intervenciones) el 26/04/2011 00:51:10
Hola te agradezco enormemente tu tiempo para atender mis dudas.
Ya abusando de tu amabilidad quiero hacerte otra pregunta, por ejemplo donde tengo mis metodos de insert, update ahi indicas que le pase parametros pero que tal si tengo 2 tablas y esas tablas tienen numero de campos diferente por ejemplo tab1=campo1,campo2,campo3. tab2=campo1,campo2,campo3,campo4,campo5.

En este caso no puedo usar el mismo metodo porq recibiria 3 o 5 parametros, entonces seria un metodo por cada tabla en la misma clase o una clase para cada tabla o como se puede usar el mismo metodo, gracias!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

de programacion orientada a eventos a programacion orientada a objetos

Publicado por Sebastian Cruz (51 intervenciones) el 26/04/2011 05:41:49
Como estas Nadia, sabes es la primera vez en este foro donde soy tan consultado ja ja ja, bueno como bien decis podrias hacer un metodo por cada tabla que necesites o bien una clase por cada tabla que necesites consultar, lo mas optimo en estos casos es hacer una clase por cada entidad como para no mesclar papas con zanahorias ja ja ja.. Aunque lo que te recomiendo mas que nada es lo que te comente previamente de crear una clase por cada tabla con la que tengas que operar ya que aunque es tedioso a la larga te va a facilitar mucho las cosas, debido a que no vas a tener que estar preocupandote por adapatar una sola formula para que funcione en todos los casos posibles ya que muchas veces te puede cambiar totalmente la logica de recoleccion de datos de una tabla a otra de la noche a la mañana y si tenes todo separado va a ser mas facil realizar ese cambio sin afectar a las demas. Aunque la otra opcion que mencionas de crear un metodo para cada tabla tambien seria valido ya que separas la logica de una tabla respecto de otra y no creo q tengas problemas con eso, solo que si tenes muchos metodos para las distintas tablas el codigo se podria volver muy voluminoso y complejo como para trabajar comodamente, pero eso es mas una decision particular de cada uno y del nivel de complejidad que tenga cada operacion en particular.

Bueno espero haber respondido tu duda, y nuevamente suerte con tu proyecto. Saludos =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

de programacion orientada a eventos a programacion orientada a objetos

Publicado por Nadia (6 intervenciones) el 06/05/2011 01:17:32
Hola denuevo agradeciendo tu tiempo, todo loq ue me hiciste favor de explicar me ha servido muchisimo, muchas gracias!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

de programacion orientada a eventos a programacion orientada a objetos

Publicado por Sebastian Cruz (51 intervenciones) el 06/05/2011 05:18:41
No hay problema Nadia, fue un placer ayudarte y la verdad fue divertido el asunto ja ja. Te mando un gran saludo, exitos =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar