--- Begin Message ---
Fernando, Imaginas bien, El codigo del "DbHelper" original era similar a
este que describis.
Luego por este inconveniente lo reforme algo como esto, pero segui con
problemas:
Me podrias orientar en alguna forma mas optima o correcta de implemetar
algo similar?
class DbHelper
{
public static readonly DbHelper Instance = new DbHelper( );
private DbHelper() { }
public cargarSentencia( )
{
}
public ejecutar( )
{
}
public RetornaDataSet( )
{
DataSet _ds = new DataSet( );
return _ds;
}
}
Muchas Gracias
Gustavo
Fernando Tubio escribió:
> 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: <[email protected]>
> 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:* [email protected] <mailto:[email protected]>
>>> *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: < [email protected] <mailto:[email protected]>>
>>> 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: <[email protected] <mailto:[email protected]>>
>>> >> 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: <[email protected] <mailto:[email protected]>>
>>> >>>> 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
>>> >>>>>
>>> >>>>
>>> >>>>
>>> >>>
>>> >>>
>>> >>
>>> >>
>>> >
>>> >
>>>
>>>
>>>
>>
>>
>
>
--- End Message ---