none
Problemas con DataSets RRS feed

  • Pregunta

  • Buenas, mas que problemas dudas y planteamientos para compartir:

    Tengo un DataSet tipado para albaranes, con sus tablas de CabeceraAlbaranes, Detalles y un par de tablas más.

    Por otro lado tengo un DataSet de facturas, pero resulta que los detalles de mi factura son los Albaranes (una factura en mi aplicación es un mero conjunto de albaranes).

    Bien, en mi aplicación he optado por tener DataSets separados para facturas y albaranes, pero ambos DataSets tienen algo que debería ser común: el DataTable  CabeceraAlbaranes, sin embargo cada DataSet define su propio DataTable CabeceraAlbaranes (porque con Typed DataSets no se puede hacer de otra forma), complicando el mantenimiento de la aplicación, por dos motivos principalmente:

    • Si cambia el esquema de la tabla CabeceraAlbaranes de la base de datos, tengo que actualizar la definición de dos DataTables, uno en el DataSet de Albaranes y otro en el DataSet de Facturas.
    • En mi aplicación, necesito lanzar, desde la ventana de Facturas, un Listado de albaranes, que obtengo usando un formulario que hace uso del DataSet de albaranes. Desde este listado marco los albaranes que deseo incluir en la factura y vuelvo al formulario de facturas. El problema es que en la ventana de albaranes tenemos seleccionados objetos del tipo DataSetAlbaranes.AlbaranesRow y en el formulario de Facturas tenemos DataSetFacturas.FacturasRow, que son parecidos, sí, pero tipos distintos al fin y al cabo.
    • En principio me gustaría evitar la alternativa de crear un megaDataSet que incluya todo lo necesario para facturas más todo lo necesario para albaranes.
    Y se me ocurre lo siguiente, a ver que os parece:

    1. Crear un megaDataSet con todas los DataTables (entidades) que usará nuestra aplicación, este DataSet nunca será instanciado, es solo un repositorio de clases DataTable.
    2. Definir nuestros DataSets como clases derivadas de DataSet, incluyendo en nuestro DataSet los DataTables que necesitemos, que ya tenemos creados en nuestro megaDataSet de entidades.
    3. Establecer en nuestro DataSet las relaciones entre las tablas que le hayamos agregado, así como, posiblemente, alguna columna calculada.
    Estos DataSet así creados pueden aparecer directamente como origen de datos si usamos la opción agregar origen de datos y se comportarán de la misma forma que un DataSet tipado (esto tengo que probarlo a fondo, pero no le veo problemas en principio).

    Ventajas:

    • Si cambia una tabla que uso en varios DataSets, me vale con cambiar la definición de la tabla en mi megaDataSets de DataTables.
    • Intercambiar información entre DataSets se vuelve más sencillo en el caso de que varios DataSets usen un mismo tipo de DataTable, como en el caso de mis dataset de facturas y albaranes.
    Inconvenientes:
    • Definición manual de relaciones (es trivial).
    • Definición manual de expresiones: no es un problema, dado que rellenar la propiedad expression desde el diseñador de DataSet no es muy cómodo que digamos.
    ¿Cómo lo véis? ¿Que ventajas e inconvenientes le veis a este planteamiento?

    Gracias!

    lunes, 25 de octubre de 2010 17:37

Respuestas

Todas las respuestas

  • :-)
    Hola,

    ¿Que versión de Visual Studio usas?

    El único motivo para usar Datasets tipados es si estás obligado a usar VS2005.

    Si usas VS2008 -> LINQ to SQL

    Si usas VS2010 -> Entity Framework

    Cualquier cosa antes que Datasets tipados :-P


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    lunes, 25 de octubre de 2010 21:34
    Moderador
  • Buenas, no es que esté obligado a usar VS2005, pero tengo un proyecto que debo entregar dentro de un plazo ya he decidido hacerlo usando DataSets, principalmente porque estoy familiarizado con esa tecnología y ahora no puedo permitirme aprender LINQ to SQL o Entity Framework, eso es algo que está en mi agenda, sobretodo cuando abunde la bibliografía decente sobre el tema. Así pues, mi duda no es sobre si debo o no usar DataSets tipados, está claro que eso tiene sus ventajas y parecer ser, a tenor de lo leído por aquí, bastantes inconvenientes, pero de momento, es mi opción.

    Así pues mi duda es, si los planteamientos que hago sobre el uso de DataSets tipados tienen, en vuestra opinión, más ventajas o inconvenientes.

     

    Saludos.

    martes, 26 de octubre de 2010 10:27
  • hola

    si la idea es suar dataset tipados por ahi estos links ayuden

     

    Building a DAL using Strongly Typed TableAdapters and DataTables in VS 2005 and ASP.NET 2.0

    Tutorial 1: Creating a Data Access Layer

    veras que explican como extender la funcionalidad del TableAdapter, para definir consultas nuevas

    sino una alterntiva es hacer un mix entre dataset tipaso y aplciacion en capas

    [N-Tier] – Desarrollo en capas - Ejemplo Facturacion- parte 2

    veras que si bien en el ejemplo use dataset tipados para definir las entidades, toda la persistencia la desarrollo especificamente en la capa concreta de datos, solo se usan los dataset como medio de transporte entre las capas

    por ahi esta ultima alterntiva podria ser util en tu caso

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 26 de octubre de 2010 12:06
  • Buenas Leandro, del ejemplo que me propones me quedo con la simplicidad del plantemiento... es un buen ejemplo, pero yo quiero seguir usando DataSets para enlazar formularios a datos y para facilitar en control de cambios en las entidades. Mi planteamiento se refiere más bien a lo siguiente:

    Tennemos, digamos que 20 DataSets: facturas, albaranes, pedidos... Y en al menos 10 de ellos necesito el mismo DataTable de clientes. Me parece una solución horrible y de dificil mantenimiento, tener el DataTable de clientes duplicado en cada uno de los DataSets que hacen uso del mismo. Entre otras cosas porque en un momento determinado querré crear un cliente desde la ventana de facturas y traerme el ClientesDataRow desde ClientesDataSet a la tabla Clientes del FacturasDataSet.... y claro, por mas que se parezcan, las clases ClientesDataSet.ClientesDataRow y FacturasDataSet.ClientesDataRow, son distintas. Por esto y otros muchos motivos, los DataSets son un verdadero dolor de cabeza.

    Por eso, me planteaba la posibilidad de tener un DataSet giganton con todos los DataTables necesarios y luego crear manualmente DataSets que hicieran uso de los DataTables tipados generados por Visual Studio. Probando, me he dado cuenta que esto tiene un inconveniente: al arrastrar una tabla desde un origen de datos creado con esta técnica, se crea en el formulario, no una instancia del DataSet que hemos creado, sino una instancia del DataSet en el que se define la tabla que hemos agregado a nuestro DataSet personalizado. Creo que esto es un mal menor, simplemente tenemos que dejar de usar la ventana de origenes de datos, pero podemos arrastar al formulario el dataSet desde el cuadro de herramientas y, una vez añadido, realizar el enlace a datos de forma "semiautomática". Me refiero a: crear bindingsSources en el formulario, engancharlos al nuestro DataSet y explorar los miembros del DataSet para elegir el DataMember. Luego, desde el cuadro de propiedades de cada control, realizar el enlace con el correspondiente BindingSource, al fin y al cabo, así hay que hacerlo muchas veces, si necesitamos personalizar algún aspecto del enlace.

    Sigo probando a ver si llego a algo o desisto.

     

    Saludos.

    martes, 26 de octubre de 2010 16:36