• Domingo 17 de Noviembre de 2024, 17:39

Autor Tema:  Duda general sobre planteamiento de proyecto  (Leído 3438 veces)

SGS

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Duda general sobre planteamiento de proyecto
« en: Sábado 13 de Marzo de 2010, 22:00 »
0
Que tal amig@s,
Tengo una duda, llevo más de 10 años desarrollando aplicaciones online a través de PHP mediante OOP y patrones MVC. Ahora, he decidido empezar con aplicaciones de escritorio (aunque dudo que vayan a durar mucho, dado que creo que se pasará al SaaS en breve).

El caso es que tengo mis dudas sobre cual es el planteamiento correcto de desarrollo con visual studio a través de c#. Me explico.

a. Yo siempre he estado acostumbrado a crearme la clase de acceso y gestión de base de datos. Esto debería implementarlo así con visual studio, o tendría que seguir los wizard para crear los diferentes formularios.

Yo me he creado una clase que me devuelve un dataset con el sql que le envíe,pero igual estoy perdiendo el tiempo y es mejor tirar por la vía de los wizard.

b. Tengo un poco de lio entre los datareader, datasets y datatableadapter. Como sería el planteamiento correcto.

He cogido muchos manuales de c# y he realizado algun curso de krasis, pero no he encontrado nada sobre algo tan trivial como, cómo plantear correctamente una aplicación desde 0.
______________________________________________________________
Estoy aprendiendo, así que no os siente mal lo que pregunte

eltruhanero

  • Miembro activo
  • **
  • Mensajes: 85
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #1 en: Lunes 15 de Marzo de 2010, 17:12 »
0
Bueno no me considero el mas apropiado para responder tu pregunta, pero viendo que nadie responde trato de contribuir con mi pequeño aporte y ademas de esta forma incitar otras respuestas...
Bueno es obvio que habrán variaciones segun el tipo,tamaño, forma de desarrollar la aplicación que estes programando...pero suponiendo una aplicación de escritorio tipica...


a. Yo siempre he estado acostumbrado a crearme la clase de acceso y gestión de base de datos. Esto debería implementarlo así con visual studio, o tendría que seguir los wizard para crear los diferentes formularios.

Mira te cuento un poco como tenemos organizada nosotros una aplicacion en desarrollo:
La aplicación administra distintos tipo de especies flora y fauna para un pais de europa(no quiero dar muchos detalles) es una aplicacion light  de escritorio y ademas una aplicacion fat como extencion para ArcMap(y obviamente ambas comparten un nucleo). Esta aplicacion tiene una capa llamada "DataAccess" en la cual consentramos todo acceso, configuracion a lo que base de datos refiera. Tenemos DataSets tipados y DataTableAdapters tipados que se alojan alli. Fabricas para actualizadores de bases de datos, creadores de DataReaders específicos tambien codificados allí.
Es mas facil "juntar capaz" que "separarlas", por lo que yo cuando empiezo a pensar un diseño siempre prefiero separar de mas y luego ir acoplando a medida que avanza el diseño.
Ademas tenemos configuraciones estaticas como parametros de la conexion de la base de datos también agregados alli.


Yo me he creado una clase que me devuelve un dataset con el sql que le envíe,pero igual estoy perdiendo el tiempo y es mejor tirar por la vía de los wizard.

Me imagino que estas creando todos los dataset tipados con sus restricciones a mano... Si no tenes ninguna restriccion, ni necesitas manipular manualmente conexiones... te aconsejo crees los datasets con el wizard de visual studio...te ahorras algunas horas de codificar algo "relativamente trivial" y excluis codigo en la etapa de testeo.
Si luego precisas personificar la forma en que los dataset son creados a partir de una base de datos...podrias tomarte un finde y crearte una clase que te genere ese codigo segun tu diseño y necesidad...  :P  :blink:

Tengo una duda...diseñastes una clase que le pasas tipo "SELECT * FROM una_tabla" y esa clase te devuelve un DataSet con todos los datos de esa tabla ???


b. Tengo un poco de lio entre los datareader, datasets y datatableadapter. Como sería el planteamiento correcto.

Extraido de MSDN
DataReader: Lee una secuencia sólo hacia delante de filas de un origen de datos.
Mas: http://msdn.microsoft.com/es-es/library ... eader.aspx

DataSet: DataSet, que es una caché de memoria interna de datos(...). DataSet está compuesto por una colección de objetos DataTable que se pueden relacionar entre ellos mediante objetos DataRelation. También se puede imponer la integridad de los datos de DataSet mediante los objetos UniqueConstraint y ForeignKeyConstraint.
Mas: http://msdn.microsoft.com/es-es/library ... 80%29.aspx

DataAdapter: Represents a set of data commands and a database connection that are used to fill the DataSet and update the data source. The DataAdapter serves as a bridge between a DataSet and a data source for retrieving and saving data. The DataAdapter provides this bridge by mapping Fill, which changes the data in the DataSet to match the data in the data source, and Update, which changes the data in the data source to match the data in the DataSet.
Mas: http://msdn.microsoft.com/es-es/library ... 71%29.aspx

En resumen: dataset representa un conjunto de tablas en memoria que se mapean a tablas de la base de datos (pudiendo agregar las restricciones y tipos involucados). Un dataadapter es un vinculo entre la tabla en memoria con la respectiva tabla en la base de datos (pudiendo extraer datos con Fill / Load y actualizarlos con Update). Fill rellena una tabla q le pasas como parametro y Load crea y retorna una nueva tabla. Un DataReader se asemeja a un Cursor de Sql extrallendo datos secuencialmente.
Con el dataadapter se suben todos los datos a memoria de una, por lo que tiene como costo memoria ram pero como ventaja la velocidad, en cambio un datareader puede ser mas lento pero no necesariamente subis todos los datos a memoria, podes irlos leyendo y procesando sin ocupar memoria en mantenerlos.

Bueno espero haya quedado un poco claro... A quien le parezca bienvenidos los comentarios....
Si queres escribime a mi correo contandome un poco como es la aplicacion para así poder opinar con mejores argumentos acerca del diseño.
Saludos, Daniel.

SGS

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #2 en: Lunes 15 de Marzo de 2010, 21:38 »
0
Daniel, gracias por responder...la verdad es que estroy empezando con esto, así que aún me pilla un poco grande todo esto que comentas.
Efectivamente, lo que había creado es una clase que le paso un sql y devuelve un dataset.
La base de datos que estoy usando es SQL CE.

Mi duda en esto no es tanto programar, dado que c# tiene muchas cosas semejantes a php, sino mi duda viene en la creación de una estructura correcta. Es decir, en un dataset he de tener toda la relación completa de todas las tablas de la bbdd? por ejemplo....mi duda tambien es la estructura de proyecto dentro de visual studio, ¿como generar lo datasets tipados? etc.

Estoy probando a desarrollar a través de los wizards, y me estoy topando con problemas en los maestros detalles, dado que en el grid de detalle en sql ce no me guarda el id del maestro, así que la aplicación da error.

Nuevamente mil gracias, y si tendrías un ejemplo de la estructura con la que implementas me ayudaría mucho. si no es mucho pedir, claro está.

SGS

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #3 en: Lunes 15 de Marzo de 2010, 23:03 »
0
¿que código he de poner para crear directamente esa vinculación de maestro detalle?

gracias de antemano.

eltruhanero

  • Miembro activo
  • **
  • Mensajes: 85
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #4 en: Martes 16 de Marzo de 2010, 00:43 »
0
Hola disculpa mi ignorancia pero no me doy cuenta a que te refieres con: "en el grid de detalle en sql ce no me guarda el id del maestro".
Id maestro te referis al id auto-generado de la tabla?

Citar
Es decir, en un dataset he de tener toda la relación completa de todas las tablas de la bbdd?
  • Todo datos que levantes desde la base de datos y quieras mantener en memoria ocupa espacio...y en algun par de meses/años de produccion de la aplicacion puede que las tablas tengan 40000/50000 registros y levantar eso puede degradar demaciado tanto la aplicacion como la maquina misma. Te cuento esto por experiencia porque ahora estamos rediseñando una aplicacion que debido a que levantaban todos los datos al principio hoy en dia la aplicacion es inmanejable debido al peso de la base de datos.
  • Ademas si la base de datos es accesible desde otras computadoras en red, los datos que levantes a un DataSets no son "datos vivos", puesto que otras maquinas conectadas en red con la base de datos no ven los cambios que hagas sobre datos que mantenes en memoria, pudiendo esto generar inconsistencias en los datos(y mientras mas datos mantengas en memoria, mas inconsistencias podes llegar a tener...)

El DataSet miralo como un cache de datos consistentes (tene en cuenta que podes agregar restricciones a los datos) de la base de datos.
Levantar datos demora, y mantenerlos en memoria ocupa espacio. Tenes que lograr el equilibro entre velocidad-espacio. Podrías permitirte encarar el diseño teniendo en cuenta de que la aplicacion hoy mantenga los datos en memoria (suponiendo que la aplicacion no genera muchos datos muy rapido, para incrementar la velocidad de acceso a la bd), para luego rediseñar ( en caso de que sea necesario ) y mantener en memoria la menor cantidad de datos posibles (enlenteciendo la aplicacion con los accesso a la bd pero logrando que consuma menor memoria).

Citar
por ejemplo....mi duda tambien es la estructura de proyecto dentro de visual studio, ¿como generar lo datasets tipados? etc.

Los datasets tipados te los genera automaticamente un wizard de visual studio, tenes que proporcionarle la conexion a la base de datos y las tablas que queres si no recuerdo mal...

Citar
Nuevamente mil gracias, y si tendrías un ejemplo de la estructura con la que implementas me ayudaría mucho. si no es mucho pedir, claro está.

Si pudieras brindarme una idea de los requerimientos que tenes trato de pensar un diseño y hacerte llegar un "boceto" de como lo encararía...pero ojo, como te puse en el primer post "no me considero el mas apropiado para responder tu pregunta, pero viendo que nadie responde trato de contribuir con mi pequeño aporte".

Estoy suponiendo tu aplicación hace un uso intensivo de la base de datos, aunque quizas tu aplicación mantiene datos staticos en la base de datos y se limita a procesarlos. Por eso, me resulta medio dificil decirte "mira este diseño te va a quedar al pelo" pues ni siquiera se que tecnologias .net usas.

Sin embargo en casi toda aplicación podes reconocer dos/tres capas: capa de acceso a base de datos(DAL-DataAccessLayer), capa de negocio/ procesamiento de datos (BL - BusinessLayer) y capa de interfaz(GUIL - GraficUserInterfaceLayer).
DAL: todo lo que tenga que ver con el acceso a datos(DataSet, TableAdapter,...) y las herramientas necesarias para accederlas desde otra capa(Factory, Facade, . . . ).
BL: bueno el nombre lo dice, para presentar los datos en la interfaz precisas procesarlos / analizarlos y demas... Aca agregas toda la logica necesaria para hacer eso...y ademas las "herramientas" necesarias para accederlas desde otra capa.
GUIL: las clases necesarias para mostrar los datos procesados al usuario(windows forms y demas).

Podes ademas optar por tener otra capa para almacenar las configuraciones que tu aplicacion requiera...

Bueno espero haber respondido al menos en parte tus dudas...y que ademas no sean demaciado trivial mis respuestas.
Cualquier cosa postea nuevamente o haceme llegar parte de tus requierimientos para poder opinar con mejores argumentos  :)
Saludos, Daniel.

SGS

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #5 en: Martes 16 de Marzo de 2010, 16:50 »
0
Lo que necesito es algo sencillo.

un formulario maestro detalle que funcione.

Imagina familias y subfamilias. Tener una opción de dar de alta familias y luego un grid debajo para dar de alta las subfamilias de esa familia.

Estoy probando con SQL CE.

gracias de antemano.

SGS

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #6 en: Miércoles 17 de Marzo de 2010, 21:58 »
0
En otro foro me han comentado esto:

Citar
Yo no uso dataset ni datatable porque consume recursos, yo lo que utilizo son los objetos coleccion (list<>, collection<>), los cuales guardan la info resultante en memoria y luego los puedo usar. Estos no consumen recursos y me parecen mas manejables que el dataset y datatable

¿qué opinais?

eltruhanero

  • Miembro activo
  • **
  • Mensajes: 85
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #7 en: Jueves 18 de Marzo de 2010, 01:14 »
0
Hola...google y lei el comentario completo que comentar y en sí tiene razon. Te queda una aplicación con menos lineas de codigo y que en ejecución consume menos memoria. Pero todo el codigo necesario para cargar esas listas tenes que codificarlo ( a menos que te pongas en campaña de programar una library generica que puedas usar en distintos proyectos) y testearlo( cosa que no es necesario con el codigo generado con el wizard). Ademas de que con los dataset  podes hacer un chequeo de tipos antes de bajar a la base de datos, puesto que el wizard te puede generar data sets tipados segun las tablas de la bbdd.
Todo tiene sus ventajas y desventajas...

Con los ojos cerrados elijo usar DataSet...si tengo restricciones/requerimientos a tener en cuenta empiezo a pensar alternativas...

Si usas la version 3.5 de .net podrias tambien usar LINQ to SQL con el cual te creas un "DataContext" con el que trabajas de manera similar a los DataSets.
No tengo muchos elementos para opinar acerca de LINQ to SQL puesto que solo lo e usado en un projecto, pero me parece es mas util para cuando precisas manipular(join, merge, etc) bastante los datos en tu aplicacion.

Citar
Que usas un datareader para rellanar los collection?
Me imagino que deberia de usar un dataReader...puesto que los TableAdapter solo rellenan DataTable, DataRow[] or DataSets.
Si precisas cargar muuuchos datos un TableAdapter es mas eficiente(rapido) que un DataReader, pero levanta todos los datos de una y consume memoria.

SGS

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #8 en: Jueves 18 de Marzo de 2010, 22:35 »
0
Y este código como lo veis?

quería cambiar el dataSet del método de obtener campos por un hashtable.

Código: C#
  1.  
  2. using System;
  3. using System.Data;
  4. using System.Data.Common;
  5. using System.Data.SqlServerCe;
  6. using System.Windows.Forms;
  7. using System.Collections;
  8.  
  9. namespace GeMa.Clases.bbdd
  10. {
  11.     class BBDD
  12.     {
  13.  
  14.         private static volatile BBDD _instance = null;
  15.  
  16.         //parámetros de conextión
  17.         public static SqlCeEngine objEg;
  18.         public static SqlCeConnection objCon;
  19.         //public static SqlCeDataReader reader;
  20.         public static DataSet dataSet;
  21.         public static SqlCeDataAdapter dataAdapter;
  22.  
  23.         //----------------------------------------------------------
  24.         // PATRON SINGLETON PARA LA CLASE BBDD
  25.         //----------------------------------------------------------
  26.         public static BBDD getInstance()
  27.         {
  28.             if (_instance == null)
  29.             {
  30.                 _instance = new BBDD();
  31.                
  32.             }
  33.             return _instance;
  34.         }
  35.  
  36.         //----------------------------------------------------------
  37.         // CONSTRUCTOR DE LA CLASE
  38.         //----------------------------------------------------------
  39.         protected BBDD() { }
  40.  
  41.         //----------------------------------------------------------
  42.         // CONEXIÓN CON LA BBDD
  43.         //----------------------------------------------------------
  44.         public static bool conectar()
  45.         {
  46.             bool conexion = true;
  47.            
  48.             //Indicamos el origen de datos
  49.             objEg = new SqlCeEngine("Data Source=|DataDirectory|\BBDD\GeMaDataBase.SDF");
  50.             objCon = new SqlCeConnection("Data Source=|DataDirectory|\BBDD\GeMaDataBase.SDF");
  51.  
  52.             try
  53.             {
  54.                 objCon.Open();
  55.             }
  56.             catch (SqlCeException ex)
  57.             {
  58.                 MessageBox.Show(ex.Message);
  59.                 conexion = false;
  60.             }
  61.  
  62.             return conexion;
  63.  
  64.         }
  65.         //----------------------------------------------------------
  66.         // CERRAR CONEXIÓN
  67.         //----------------------------------------------------------
  68.         public static void desconectar()
  69.         {
  70.             objCon.Close();
  71.         }
  72.         //----------------------------------------------------------
  73.         // OBTENER CAMPOS
  74.         //----------------------------------------------------------
  75.         public static void obtenerCamposTabla(string tabla, string[] aCampos, string Where)
  76.         {
  77.             //preparamos la query
  78.             string sqlQuery = "SELECT ";
  79.  
  80.             //obtenemos los campos
  81.             for (int i = 0; i < aCampos.Length; i++)
  82.             {
  83.                 string campo = aCampos[i];
  84.                 sqlQuery += campo + ",";
  85.             }
  86.  
  87.             //eliminamos la última coma
  88.             sqlQuery = sqlQuery.Remove(sqlQuery.Length - 1, 1);
  89.  
  90.             sqlQuery +=" FROM "+tabla+" WHERE 1=1 ";
  91.  
  92.             if (Where!="")
  93.             {
  94.                 sqlQuery += Where;
  95.             }
  96.  
  97.             dataAdapter = new SqlCeDataAdapter(sqlQuery, objCon);
  98.             dataSet = new DataSet();
  99.             dataAdapter.Fill(dataSet,tabla);
  100.         }
  101.         //----------------------------------------------------------
  102.         // GUARDAR CAMPOS EN TABLA
  103.         //----------------------------------------------------------
  104.         public static bool guardarCamposTabla(string tabla, Hashtable aCampos, string id)
  105.         {
  106.             bool procesado = false;
  107.  
  108.             string sqlQuery = "";
  109.  
  110.             //estamos ante un insert
  111.             if (id == "")
  112.             {
  113.  
  114.                 //preparamos la query
  115.                 sqlQuery = "INSERT INTO " + tabla + " (";
  116.  
  117.                 //obtenemos las columnas
  118.                 foreach (DictionaryEntry campo in aCampos)
  119.                 {
  120.                     sqlQuery += campo.Key + ",";
  121.                 }
  122.  
  123.                 //eliminamos la última coma
  124.                 sqlQuery = sqlQuery.Remove(sqlQuery.Length - 1, 1);
  125.  
  126.                 //cerramos las columnas
  127.                 sqlQuery += ") VALUES (";
  128.  
  129.                 //obtenemos los campos
  130.                 foreach (DictionaryEntry campo in aCampos)
  131.                 {
  132.                     sqlQuery += "'" + campo.Value + "',";
  133.                 }
  134.  
  135.                 //eliminamos la última coma
  136.                 sqlQuery = sqlQuery.Remove(sqlQuery.Length - 1, 1);
  137.  
  138.                 sqlQuery += ")";
  139.  
  140.                
  141.             }
  142.             else //es un update
  143.             {
  144.  
  145.             }
  146.  
  147.             //ejecutamos el query
  148.             try
  149.             {
  150.                 //conectamos con la base de datos
  151.                 BBDD.conectar();
  152.  
  153.                 SqlCeCommand cm = new SqlCeCommand();
  154.                 cm.Connection = objCon;
  155.                 cm.CommandType = CommandType.Text;
  156.                 cm.CommandText = sqlQuery;
  157.                 cm.ExecuteNonQuery();
  158.  
  159.                 procesado = true;
  160.  
  161.             }
  162.             catch (Exception ex)
  163.             {
  164.                 MessageBox.Show(ex.Message);
  165.             }
  166.             finally
  167.             {
  168.                 aCampos = null;
  169.  
  170.                 //desconectar de la base de datos
  171.                 BBDD.desconectar();
  172.             }
  173.  
  174.             return procesado;
  175.  
  176.         }
  177.     }
  178. }
  179.  
  180.  

eltruhanero

  • Miembro activo
  • **
  • Mensajes: 85
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #9 en: Viernes 19 de Marzo de 2010, 22:19 »
0
Honestamente e leido un par de veces tu pregunta/codigo y no te entiendo exactamente de que parte os gustaría mi opinion.

Queres levantar los datos en DataSet a tavez de un DataAdapter y despues  insertar esos datos en un HashTable (por un tema de performance en la forma en la que se usan esos datos x ejemplo) ?

Si pudieras aclara tu duda, gracias.
Daniel.

SGS

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #10 en: Viernes 19 de Marzo de 2010, 22:59 »
0
Simplemente estoy intentando hacer una clase para la gestión de acceso a datos. Esta clase me permitiría leer, escribir, modificar, etc obviando los datasets, etc. Simplemente es saber si os parece una forma correcta de desarrollar a través de una clase como esta en c#.

eltruhanero

  • Miembro activo
  • **
  • Mensajes: 85
    • Ver Perfil
Re: Duda general sobre planteamiento de proyecto
« Respuesta #11 en: Sábado 20 de Marzo de 2010, 05:24 »
0
A veces es preferible NO usar DataSet y a veces si, dependerá de cada aplicación.

Si tu aplicación interactua de forma muy pesada (insertando, eliminando, actualizando) con la base de datos, comunicarte a travez de un DataAdapter aumenta tu performance de comunicación. Mira: http://msdn.microsoft.com/es-es/library ... 80%29.aspx

Lo que vos estas haciendo es recodificar todo lo que el framework ya te provee. En una aplicación c# tipo no tenes limitaciones de memoria serias a tener en cuenta...primero que nada porque la maquina tiene que aguantar el framework. Tampoco veas los DataSet/DataTable como un cancer de programación, son muy buenas estructuras para los datos(la clase DataTable tiene 6000 lineas de codigo!), solo depende de que vos les des un buen uso y no un abuso.

Si aun así no queres usar DataTables ni DataSet podrías usar en vez de DataAdapter un DataReader y a medida que lees los datos irlos guardando en un Hashtable por clave de tabla o como te parezca.
Si tenes alguna limitacion particular de la aplicación me parece bien...sino "No reinventes la rueda!!" y mucho menos en cada aplicación que desarrolles..