none
Lista devuelve vacio RRS feed

  • Pregunta

  • Tengo una clase en la capa datos que con un procedimiento almacenado hago un select con una unión de 2 tablas, hago un reader para llenar una lista que tengo en otra clase

    public void LlenarReporte(string nombre)
            {
                using (var conexionN = new SqlConnection(conexionBD.ConexionBasesD(nombre)))
                {
                    conexionN.Open();
                    using (var comando = new SqlCommand())
                    {
                        comando.Connection = conexionN;
                        comando.CommandText = "sp_MostrarComprobanteFactura";
                        comando.Parameters.AddWithValue("@idfactura", IdFactura);
                        comando.CommandType = CommandType.StoredProcedure;
    
                        SqlDataReader reader = comando.ExecuteReader();                    
    
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                 listas = new List<ListaFactura>();
                                listas.Add(new ListaFactura(reader.GetInt32(0),
                                    reader.GetString(1),
                                    reader.GetString(2),
                                    reader.GetString(3),
                                    reader.GetString(4),
                                    reader.GetString(5),
                                    reader.GetDateTime(6),
                                    reader.GetString(7),
                                    reader.GetString(8),
                                    reader.GetInt32(9)                      
                                    ));
                            }
                        }
                    }
                }
            }

    La lista la tengo de esta manera

     public class ListaFactura
        {
            private int idFactura;
            private string nombreCliente;
            private string numDoc_Cliente;
            private string serieFactura;
            private string secuencialFactura;
            private string metodoPago;
            private DateTime fechaFactura;
            private string referProd;
            private string nombreProd;
            private int cantidad;
    
            public int IdFactura
            {
                get { return idFactura; }
                set { idFactura = value; }
            }
            public string NombreCliente
            {
                get { return nombreCliente; }
                set { nombreCliente = value; }
            }
            public string NumDoc_Cliente
            {
                get { return numDoc_Cliente; }
                set { numDoc_Cliente = value; }
            }
            public string SerieFactura
            {
                get { return serieFactura; }
                set { serieFactura = value; }
            }
            public string SecuencialFactura
            {
                get { return secuencialFactura; }
                set { secuencialFactura = value; }
            }
            public string MetodoPago
            {
                get { return metodoPago; }
                set { metodoPago = value; }
            }
            public DateTime FechaFactura
            {
                get { return fechaFactura; }
                set { fechaFactura = value; }
            }
            public string ReferProd
            {
                get { return referProd; }
                set { referProd = value; }
            }
            public string NombreProd
            {
                get { return nombreProd; }
                set { nombreProd = value; }
            }
            public int Cantidad
            {
                get { return cantidad; }
                set { cantidad = value; }
            }
            public decimal PrecioUnitario
            {
                get { return precioUnitario; }
                set { precioUnitario = value; }
            }
            public decimal DescuentoProducto
            {
                get { return descuentoProducto; }
                set { descuentoProducto = value; }
            }      
    
            public ListaFactura(int idfactura,string nombreC,string documento,string serie,string secuencial, string pago,DateTime fecha,string refer,string descripcion,int cantidadp)
            {
                idFactura = idfactura;
                nombreCliente = nombreC;
                numDoc_Cliente = documento;
                serieFactura = serie;
                secuencialFactura = secuencial;
                metodoPago = pago;
                fechaFactura = fecha;
                referProd = refer;
                nombreProd = descripcion;
                cantidad = cantidadp;
            }
          
        }
    Pero al intentar llamarla desde otra clase que se encuentra en mi capa presentación para llenar otra lista y hacer un foreach, no me entra este porque sale
    foreach (ListaFactura list in lista_Listarfactura) => Count == 0
    No me sale ningún error, y se que la consulta me trae dos filas, que puede estar pasando?

    • Editado NathalyChR miércoles, 1 de julio de 2020 3:48
    miércoles, 1 de julio de 2020 3:46

Respuestas

  • hola

    porque tienes que usar el foreach para contar la cantidad de items si la lista ya tiene el Count()

       int cantidad = lista_Listarfactura.Count();

    sin ningun foreach

    >>No me sale ningún error, y se que la consulta me trae dos filas,

    como lo sabes? pusiste un breakpoint en el codigo he inspeccionas la variable de la lista para ver su contenido

    No puedes poner el new de la lista dentro del while

    public List<ListaFactura> LlenarReporte(string nombre)
    {
            var listas = new List<ListaFactura>();
    	
    	using (var conexionN = new SqlConnection(conexionBD.ConexionBasesD(nombre)))
    	{
    		conexionN.Open();
    		using (var comando = new SqlCommand("sp_MostrarComprobanteFactura", conexionN))
    		{
    			comando.Parameters.AddWithValue("@idfactura", IdFactura);
    			comando.CommandType = CommandType.StoredProcedure;
    
    			SqlDataReader reader = comando.ExecuteReader();                    
    
    			while (reader.Read())
    			{
    				listas.Add(new ListaFactura(reader.GetInt32(0),
    					reader.GetString(1),
    					reader.GetString(2),
    					reader.GetString(3),
    					reader.GetString(4),
    					reader.GetString(5),
    					reader.GetDateTime(6),
    					reader.GetString(7),
    					reader.GetString(8),
    					reader.GetInt32(9)                      
    					));
    			}
    		
    		}
    	}
    	
    	return listas;
    }
    ademas retorna la lista como respuesta, no asignes variables globales

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta NathalyChR miércoles, 1 de julio de 2020 17:47
    miércoles, 1 de julio de 2020 5:49
  •  hago un reader para llenar una lista que tengo en otra clase

    Si la lista te queda vacía, típicamente esto sucede cuando tienes mal puesta la inicialización de la clase, o de la variable dentro de la clase, y estás haciendo un "new" de más que te borra la lista antes de usarla. Por ejemplo, rellenas una instancia pero luego haces un new que te crea otra instancia y, claro, al acceder a esa instancia el dato está vacío.

    Aunque no has mostrado cómo y cuándo estás instanciando y usando esa variable o la clase que la contiene, un ejemplo que demuestra que estás teniendo poco cuidado en la instanciación de tus variables puede verse dentro de la subrutina en la que cargas los datos desde el reader. Estás instanciando la lista dentro del bucle while, con lo cual se te borra la lista en cada iteración y en consecuencia solo devuelve el último registro y se pierden todos los demás. Si has cometido un fallo similar en algún otro sitio antes de leer la lista, ahi se te borrarán los datos y no recibirás ni siquiera ese único registro que se carga con el bucle. Nótese que el fallo no necesariamente tiene que estar en la instanciación de la variable listas, también podría estar en la instanciación de la clase que la contiene.

    • Marcado como respuesta NathalyChR miércoles, 1 de julio de 2020 17:47
    miércoles, 1 de julio de 2020 7:22
    Moderador

Todas las respuestas

  • hola

    porque tienes que usar el foreach para contar la cantidad de items si la lista ya tiene el Count()

       int cantidad = lista_Listarfactura.Count();

    sin ningun foreach

    >>No me sale ningún error, y se que la consulta me trae dos filas,

    como lo sabes? pusiste un breakpoint en el codigo he inspeccionas la variable de la lista para ver su contenido

    No puedes poner el new de la lista dentro del while

    public List<ListaFactura> LlenarReporte(string nombre)
    {
            var listas = new List<ListaFactura>();
    	
    	using (var conexionN = new SqlConnection(conexionBD.ConexionBasesD(nombre)))
    	{
    		conexionN.Open();
    		using (var comando = new SqlCommand("sp_MostrarComprobanteFactura", conexionN))
    		{
    			comando.Parameters.AddWithValue("@idfactura", IdFactura);
    			comando.CommandType = CommandType.StoredProcedure;
    
    			SqlDataReader reader = comando.ExecuteReader();                    
    
    			while (reader.Read())
    			{
    				listas.Add(new ListaFactura(reader.GetInt32(0),
    					reader.GetString(1),
    					reader.GetString(2),
    					reader.GetString(3),
    					reader.GetString(4),
    					reader.GetString(5),
    					reader.GetDateTime(6),
    					reader.GetString(7),
    					reader.GetString(8),
    					reader.GetInt32(9)                      
    					));
    			}
    		
    		}
    	}
    	
    	return listas;
    }
    ademas retorna la lista como respuesta, no asignes variables globales

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta NathalyChR miércoles, 1 de julio de 2020 17:47
    miércoles, 1 de julio de 2020 5:49
  •  hago un reader para llenar una lista que tengo en otra clase

    Si la lista te queda vacía, típicamente esto sucede cuando tienes mal puesta la inicialización de la clase, o de la variable dentro de la clase, y estás haciendo un "new" de más que te borra la lista antes de usarla. Por ejemplo, rellenas una instancia pero luego haces un new que te crea otra instancia y, claro, al acceder a esa instancia el dato está vacío.

    Aunque no has mostrado cómo y cuándo estás instanciando y usando esa variable o la clase que la contiene, un ejemplo que demuestra que estás teniendo poco cuidado en la instanciación de tus variables puede verse dentro de la subrutina en la que cargas los datos desde el reader. Estás instanciando la lista dentro del bucle while, con lo cual se te borra la lista en cada iteración y en consecuencia solo devuelve el último registro y se pierden todos los demás. Si has cometido un fallo similar en algún otro sitio antes de leer la lista, ahi se te borrarán los datos y no recibirás ni siquiera ese único registro que se carga con el bucle. Nótese que el fallo no necesariamente tiene que estar en la instanciación de la variable listas, también podría estar en la instanciación de la clase que la contiene.

    • Marcado como respuesta NathalyChR miércoles, 1 de julio de 2020 17:47
    miércoles, 1 de julio de 2020 7:22
    Moderador
  • Gracias a los dos ya pude resolver, trabajo en 3 capas y estaba devolviendo la lista, pero no se la asignaba a nada y  por la instancia que se repetia me la borraba :). Utilice el ejemplo de Leandro Tuttini y el comentario de Alberto Poblacion para verificar bien mi error

    • Editado NathalyChR miércoles, 1 de julio de 2020 17:51
    miércoles, 1 de julio de 2020 17:49
  • Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.

    jueves, 2 de julio de 2020 15:38
    Moderador