No es evidente la estrategia que usás mirando solamente el código que enviaste ya que parecen existir varios niveles de indirección hasta la clase helper. En las siguiente líneas, ¿a que corresponde el primer nivel this.datos?

   this.datos.db.cargaSentencia()
   this.datos.db.ejecutar();
   this.datos.db.RetornaDataSet();

Pero voy a tratar de adivinar una forma en la que podrías estar devolviendo siempre el mismo DataSet, aunque si necesitás más ayuda es necesario que incluyas algo del código que estás usando.

No es la forma en que yo lo haría pero si tu implementación de DbHelper fuera similar a lo siguiente.

class DbHelper
{
   public static readonly DbHelper Instance = new DbHelper( );
   private DataSet _ds = new DataSet( );

   private DbHelper() { }

   public cargarSentencia( )
   {
   }

   public ejecutar( )
   {
   }

   public RetornaDataSet( )
   {
       return _ds;
   }
}

Y luego en las clases Vendedores y Movimientos se usa el helper de la siguiente forma.

class Vendedores
{
   public DbHelper db = DbHelper.Instance;
}

class Movimientos
{
   public DbHelper db = DbHelper.Instance;
}

Entonces ambas clases, Vendedores y Movimientos, estarían usando la misma instancia de un DataSet.

IMPORTANTE: estoy intentando responder a la pregunta de Gustavo de como "diferentes objetos podria devolver el mismo dataset", y no necesariamente la forma en que debería implementarse algo así.

Saludos,

Fernando Tubio


----- Original Message ----- From: "Gustavo" <[EMAIL PROTECTED]>
To: <puntonet@mug.org.ar>
Sent: Tuesday, April 03, 2007 11:45 AM
Subject: [puntonet] Re: [puntonet] Re: [puntonet] Re: Re: [puntonet] Re: [puntonet] Comportamiento extraño de DataSet o ComboBox


Eso no lo entiendo muy bien, porque para mi, siguen siendo en todo momento dos instancias diferentes.... Es decir no entiendo en que momento podria devolver el mismo dataset, sin son diferntes objetos.

Fernando Tubio escribió:
Hola Diego,
Seguro, pero ese no era mi punto. Partiendo del hecho que el código tiene problemas entonces es necesario encontrar la causa. En mi mi primer mensaje cuando mencioné que "algo huele mal en el código", lo dije porque si se crea una DataSet para luego sobreescribirlo sin haberlo utilizado, entonces es necesario evaluar si realmente se está operando con la instancia correcta. Como el origen del DataSet es una clase helper compartida por las dos clases involucradas en el problema entonces no me sorprendería que el helper estuviera devolviendo siempre la misma instancia. Saludos,
 Fernando Tubio
 ----- Original Message -----

    *From:* Diego Jancic <mailto:[EMAIL PROTECTED]>
    *To:* puntonet@mug.org.ar <mailto:puntonet@mug.org.ar>
    *Sent:* Tuesday, April 03, 2007 10:46 AM
    *Subject:* [puntonet] Re: Re: [puntonet] Re: [puntonet] Re:
    [puntonet] Comportamiento extraño de DataSet o ComboBox

    Hola Fernando!,
    Ahi puede haber una perdida en performance, pero el bug no esta
    ahi... si se sobreescribe una referencia de un objeto que no se
    uso nunca no pasa nada!
     Salu2!

     On 4/3/07, *Fernando Tubio* <[EMAIL PROTECTED]
    <mailto:[EMAIL PROTECTED]>> wrote:

        Este código tiene el mismo problema que el que enviaste
        anteriormente.

        public DataSet LlenaComboBox()
        {
                   DataSet dsSalida = new DataSet();  <== SE CREA UN
        DATASET
                   this.datos.db.cargaSentencia("SELECT ID,NOMBRE from
                       VENDEDORES WHERE ESTADO<>1 ORDER BY NOMBRE");
                   this.datos.db.ejecutar();
                   dsSalida = this.datos.db.RetornaDataSet(); <== PERO
        SE DEVUELVE
                                                     UNA INSTANCIA
        DIFERENTE!!!!
                   return dsSalida;
        }


        Saludos,

        Fernando Tubio


        ----- Original Message -----
        From: "Gustavo" <[EMAIL PROTECTED]
        <mailto:[EMAIL PROTECTED]>>
        To: < puntonet@mug.org.ar <mailto:puntonet@mug.org.ar>>
        Sent: Tuesday, April 03, 2007 10:17 AM
        Subject: [puntonet] Re: [puntonet] Re: [puntonet]
        Comportamiento extraño de
        DataSet o ComboBox


        > La verdad que ya lo cmabie de forma bastantes veces, pero en
        este momento,
        > esta de manera que el dataset que se retorna es local al
        metodo, asi:
        >
        > public DataSet LlenaComboBox()
        >        {
        >            DataSet dsSalida = new DataSet();
        >            this.datos.db.cargaSentencia ("SELECT ID,NOMBRE
        from VENDEDORES
        > WHERE ESTADO<>1 ORDER BY NOMBRE");
        >            this.datos.db.ejecutar();
        >            dsSalida = this.datos.db.RetornaDataSet();
        >            return dsSalida;
        >        }
        >
        > Tambien por este mimso tema, modifique
        this.datos.db.RetornaDataSet();
        > hize un metodo que retorna el dataset de la misma manera,
        antes era un
        > dataset publico y y lo asignaba directamente, pero para
        aislarlo mas,
        > llegue a eso.
        >
        > Fernando Tubio escribió:
>> ¿Como obtienen sus respectivos DataSets las clases Vendedores y
        >> Movimientos?
        >> Lo hacen sobre una variable local y creando una nueva
        instancia por cada
        >> llamado a Llenar( ). Por ejemplo,
        >>
        >> public DataSet Llenar( )
        >> {
        >>    ...
        >>    DataSet ds = new DataSet();
        >>    ...
        >>    // sigue código para llenar el DataSet
        >> }
        >>
        >> O quizás lo hacen a través de otro método que devuelve el
        DataSet(). Por
        >> ejemplo,
        >>
        >> public DataSet Llenar( )
        >> {
        >>    ...
        >>    DataSet ds = Helper.GetDataSet();
        >>    ...
        >>    // sigue código para llenar el DataSet
        >> }
        >>
        >> En este segundo caso entonces dependerá de como fue
        implementado el
        >> método
        >> GetDataSet( ), pero ambas clases podrían compartir una
        misma instancia
        >> del
        >> DataSet, si por ejemplo la implementación fuera la siguiente.
        >>
        >> static class Helper
        >> {
        >>    public static DataSet _ds = new DataSet();
        >>
        >>    public static GetDataSet( )
        >>    {
        >>        return _ds;
        >>    }
        >> }
        >>
        >> Estos son solo ejemplos. Probablemente esto no tenga nada
        que ver con tu
        >> código pero a esto me refiero con que podrían estar
        compartiendo la misma
        >> instancia de DataSet.
        >>
        >> Saludos,
        >>
        >> Fernando Tubio
        >>
        >> ----- Original Message ----- From: "Gustavo" <
        [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>
        >> To: <puntonet@mug.org.ar <mailto:puntonet@mug.org.ar>>
        >> Sent: Tuesday, April 03, 2007 9:24 AM
        >> Subject: [puntonet] Re: [puntonet] Re: [puntonet]
        Comportamiento extraño
        >> de
        >> DataSet o ComboBox
        >>
        >>
        >>> Que tal Fernando, la idea era usar el dataset que devuelve
        llenar para
        >>> cargar el combo.
        >>> No creo que tengan relacion, pero como seria que la clase
        vendedores y
        >>> movimientos compartan una misma instancia de DataSet?
        >>> Muchas Gracias
        >>>
        >>> Fernando Tubio escribió:
        >>>> Algo huele mal en el código que enviaste. Primero se crea
        un DataSet,
        >>>>
        >>>>> this.dsVendedores = new DataSet();
        >>>>
        >>>> e inmediatamente se lo sobreescribe con un llamado al
        método Llenar()
        >>>>
        >>>>> this.dsVendedores = this.vendedores.Llenar();
        >>>>
        >>>> Idem para la otra clase.
        >>>>
        >>>>> this.dsMovimientos = new DataSet();
        >>>>> this.dsMovimientos =
        >>>>>

this.movimientos.Llenar(Convert.ToInt32(this.vendedor.SelectedValue));
        >>>>
        >>>> El resultado es que el DataSet usado como data source del
        ComboBox es
        >>>> el
        >>>> devuelto por la clase Vendedores, y si bien esto en sí no
        tiene nada de
        >>>> malo, sospecho que no es lo que te proponías. Si tu
        intención es que el
        >>>> método Llenar() cargue el DataSet creado previamente
        entonces deberías
        >>>> modificar dicho método para tomar el DataSet como
        parámetro. Esto
        >>>> también
        >>>> sería más consistente, por lo menos en lo que respecta a
        nombres de
        >>>> método,
        >>>> con el patrón usado en los TableAdapters de NET 2.0,
        donde se pueden
        >>>> generar
        >>>> métodos que devuelven un objeto nuevo cuyo nombre por
        default comienza
        >>>> con
        >>>> Get...(), como también métodos que operan sobre un objeto
        recibido como
        >>>> parámetro y que por default comienzan con Fill...(), o en
        tu caso
        >>>> Llenar().
        >>>>
        >>>> Habría que ver el código de las clases Vendedores y
        Movimientos para
        >>>> decir
        >>>> donde está el problema, pero sospecho que deben compartir
        una misma
        >>>> instancia de DataSet.
        >>>>
        >>>> Saludos,
        >>>>
        >>>> Fernando Tubio
        >>>>
        >>>> ----- Original Message ----- From: "Gustavo" <
        [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>
        >>>> To: <puntonet@mug.org.ar <mailto:puntonet@mug.org.ar>>
        >>>> Sent: Friday, March 30, 2007 7:21 PM
        >>>> Subject: [puntonet] Comportamiento extraño de DataSet o
        ComboBox
        >>>>
        >>>>
        >>>>> Buenas Tardes, a ver si me pueden ayudar, si a alguien
        le sucedio algo
        >>>>> parecido, me sucede algo extraño:
        >>>>> Cree una serie de clases para la manipulacion de datos
        de las tablas
        >>>>> de
        >>>>> la
        >>>>> aplicacion.
        >>>>> Una de ellas la uso para traer de la base de datos los
        vendedores en
        >>>>> un
        >>>>> dataset que uso de transporte y luego llenar un ComboBox
        de la
        >>>>> siguiente
        >>>>> manera:
        >>>>>
        >>>>> this.vendedores = new Vendedores();
        >>>>> this.dsVendedores = new DataSet();
        >>>>> this.dsVendedores = this.vendedores.Llenar();
        >>>>> this.vendedor.DisplayMember = "NOMBRE";
        >>>>> this.vendedor.ValueMember = "ID";
        >>>>> this.vendedor.DataSource =
        this.dsVendedores.Tables[0].DefaultView;
        >>>>>
        >>>>> Hasta aca todo bien, se llena el combo correctamente
        teniendo el campo
        >>>>> ID
        >>>>> como value y el Nombre en Display.
        >>>>> Pero Cuando Creo otro objeto de otra clase similar pero
        para otra
        >>>>> entidad,
        >>>>> al llamar al metodo this.movimientos.Llenar me rompe el
        combobox de
        >>>>> vendedores, mantiene su cantidad de registros, pero dice
        >>>>> System.DataRow,
        >>>>> como si se perdieran sus datos.....
        >>>>>
>>>>> this.movimientos = new Movimientos(); this.dsMovimientos =
        >>>>> new
        >>>>> DataSet();
        >>>>> this.dsMovimientos =
        >>>>>

this.movimientos.Llenar(Convert.ToInt32(this.vendedor.SelectedValue));
        >>>>> <<<< Rompe
        >>>>>
        >>>>> No entiendo que es lo que sucede ya que son dos objetos
        diferentes.
        >>>>> los
        >>>>> datasets no tienen relacion alguna y no son referenciados.
        >>>>> A su vez, la clase Movimientos y Vendedores usan otra
        clase, que se
        >>>>> usa
        >>>>> de
        >>>>> coneccion a la base de datos, quizas venga por ahi, pero
        no encuentro
        >>>>> nada.
        >>>>> Espero que se entienda el problema, Me podran dar alguna
        ayuda?
        >>>>>
        >>>>> Saludos
        >>>>> Gustavo
        >>>>>
        >>>>
        >>>>
        >>>
        >>>
        >>
        >>
        >
        >







Responder a