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);
}
}