No estoy seguro si alguien ya te respondió algo sobre este tema, yo no ví nada 
pero tengo algunos problemas de correo. 

Mirando el código rápidamente no veo el origen del problema. En apariencia cada 
una de las clases estaría trabajando con un DataSet diferente. Lo que sí veo es 
que hacés un uso excesivo de variables a nivel de la clase (todas las 
prefijadas con this.xxx). En *ninguno* de los métodos que mostrás se hace uso 
de variables locales sino que todas son variables miembro. Al no ver el código 
de cada clase en forma completa no puedo decirlo con seguridad pero no parece 
justificado en la mayor parte de los casos. 

Por ejemplo, en la clase que devuelve el DataSet, Firebird.EjecutarQueryDS(),  
este es declarado como un miembro de la clase cuando no parece haber motivo 
para no declararlo como una variable local. Idem para el constructor de la 
clase Vinculo, donde todas las variables que son usadas para leer la 
configuración son declaradas a nivel de la clase.

Generalmente es saludable restringir la visibilidad que tiene una declaración 
al alcance mínimo indispensable, de tal forma de no exponer innecesariamente su 
uso. Por eso si una clase es usada solamente dentro de un assembly se la 
declara como internal, o un método que solo fue creado para ser usado dentro de 
la clase se lo declara como private. Lo mismo ocurre con las variables. Si la 
variable se usa solamente dentro de un método entonces se la declara como 
local. Esto te protege contra usos que no fueron previstos.

Menciono esto ya que el problema es justamente que una parte del programa 
parece ser afectada por otra cuando en teoría no se encuentran relacionadas.  

Saludos,

Fernando Tubio


----- Original Message ----- 
  From: Gustavo 
  To: [EMAIL PROTECTED] 
  Sent: Monday, April 09, 2007 8:36 PM
  Subject: [puntonet] Perdida de DataSet


  Hola, hace poco consulte en la lista por este mismo tema, he intentaron 
ayudarme.
  Hice varias pruebas y lei algunos articulos, pero sigo sin poder solucionarlo 
ni entender el problema, detallo mas codigo, a ver si alguien me puede ayudar, 
esta un poco resumido, pero esta la idea y falla completa.

  En la muestra hay 4 Clases:
  Clientes: para manejar la estructura de clientes, solo se usa en el ejemplo 
el metodo LlenarComboBox()
  Movimientos: para manejar la estructura de Movimientos, solo se usa en el 
ejemplo el metodo Llenar()
  Firebird: Clase para la manipulacion de la DB, solo alli se crean nuevas 
instancias del DataSet.
  Vinculo: Clase Solo apunta a un archivo u otro, se armo separada.

  Necesito, poder conservar ambos datasets independientes y poder trabajarlos 
simultanemante. Porque si tanto en la clase movimientos como clientes, se crea 
un nuevo objeto de la clase Vinculo, y este a su vez crea nueva instancia de la 
clase Firebird para cada uno de ellos, los datasets no son instancias 
diferentes?
  Gracias
  Resumen Codigo de las clases:

  Empiezo un formulario (solo tiene un combobox)
  public partial class Form1 : Form
      {
          public Clientes clientes;
          public DataSet dsClientes;
          public Movimientos movimientos;
          public DataSet dsMovimientos;

          public Form1()...
          
          void Form1Load(object sender, EventArgs e)
          {
              this.clientes = new Clientes();
              this.dsClientes = this.clientes.LlenarComboBox();
              this.cliente.DisplayMember = "NOMBRE";
              this.cliente.ValueMember = "ID";
              this.cliente.DataSource = this.dsClientes.Tables[0].DefaultView;  
      
              this.movimientos = new Movimientos();
          }
          
          void ClienteSelectedIndexChanged(object sender, EventArgs e)
          {
              /// Al llamar a este metodo se corrompe el combobox this.cliente, 
llenandolo de registros con System.Data.DataRow)
              this.dsMovimientos = 
this.movimientos.TraeMovDelCliente(Convert.ToInt32(this.arti.SelectedValue));
          }
      }
  /////////////////////////////////////////////////////////////
  public class Clientes
      {
          public Vinculo datos;
          public Clientes()
          {
              this.datos = new Vinculo("datos");
          }
          
          public DataSet LlenarComboBox()
          {
              this.datos.db.cargaSentencia("SELECT ID,NOMBRE from CLIENTES 
WHERE ESTADO<>1 ORDER BY NOMBRE");
              return this.datos.db.EjecutarQueryDS();
          }
      }
  //////////////////////////////////////////////////////////
      public class Movimientos
      {
         ...
          public Vinculo datos;
          
          public Movimientos()
          {
              this.datos = new Vinculo("datos");
               ....
          }
          
          public DataSet Llenar(int idCliente)
          {
              this.sql = "SELECT * from MOVIMIENTOS WHERE ESTADO<>1 AND 
ID_CLIENTE=" + idCliente + " ORDER BY ID";
              this.datos.db.cargaSentencia(this.sql);
              if (this.debugLevel > 2)
              {
                  this.log.Crear(this.sql,"SQL-LLENA-MOVIMIENTOS");
              }
              return this.datos.db.EjecutarQueryDS();
          }
  //////////////////////////////////////////////////////////////    
  public class Firebird
      {    
          ...        
          public DataSet ds;
          
          public Firebird (string baseDatos, string usuario, string clave, byte 
dialecto, string servidor)
          {
              ...
          }
          
          public DataSet EjecutarQueryDS()
          {
              this.ds = new DataSet();
              try
              {
                  this.abrir();
                  this.adaptador.SelectCommand = this.comando;
                  this.adaptador.Fill(this.ds);
                  this.cerrar();
              }
              catch (Exception ex)
              {
                  this.error = ex.ToString();
                  //ret = 1;
              }
              return this.ds;
          }
      }
      
  ///////////////////////////////////////////////////////////
  public class Vinculo
      {
          public Firebird db;
   
          public Vinculo(string puntero)
          {
              this.bdConfiguracion = new Configuracion("Sistema");
              this.usuario = 
this.bdConfiguracion.LeeConfiguracion("BASE","usuario","USUARIO");  
              this.clave = 
this.bdConfiguracion.LeeConfiguracion("BASE","clave","xxxxxxxxx");
              this.dialecto = 
Convert.ToByte(this.bdConfiguracion.LeeConfiguracion("BASE","dialecto","3"));
              this.servidor = 
this.bdConfiguracion.LeeConfiguracion("BASE","servidor","192.168.1.7");
              
              switch (puntero)
              {
                      case "datos": this.camino = 
this.bdConfiguracion.LeeConfiguracion("BASE","caminoDatos","/datos/bde/base_datos.gdb");
                          break;
                      case "cfg": this.camino = 
this.bdConfiguracion.LeeConfiguracion("BASE","caminoCfg","/datos/bde/base_cfg.gdb");
                          break;
                      default: this.camino = 
this.bdConfiguracion.LeeConfiguracion("BASE","caminoDatos","/datos/bde/base_datos.gdb");
                          break;
              }    
              this.db = new Firebird(this.camino, this.usuario, this.clave, 
this.dialecto, this.servidor);
          }
      }


Responder a