none
Consulta sobre uso de List<T> RRS feed

  • Pregunta

  • Estimados, necesito ayuda con esto. Soy nuevo en C#. Estoy leyendo una tabla de una base MySQL y colocando los datos en un List<T>, esto es porque debo recorrer cada uno de sus registros y hacer una tare especifica con cada uno de ellos y la cantidad de datos puede variar mes a mes.

    He creado una clase llamada Factura donde tengo un método que llena dicho List<T> y devuelve dicha lista

    Luego en otro método lo accedo y mediante un foreach intento leer los datos. 

    El tema es que al ingresar al foreach no veo los atributos del List en cuestion.

    Al ejecutar el programa veo que los datos se cargan y estan bien pero no puedo acceder a los mismos.

    Si alguien puede ayudarme lo voy a gradecer.

    Adjunto código

    ESTA ES LA CLASE Facturas

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MySql.Data;
    using MySql.Data.MySqlClient;
    using Datos;


    namespace Entidades
    {
        public class Factura
        {
            private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            int CodigoComercio { get; set; }
            int NumeroCredito { get; set; }
            int Documento { get; set; }
            string Nombre { get; set; }

            public void Facturas(int codigoComercio, int numeroCredito, int documento, string nombre)
            {
                this.CodigoComercio = codigoComercio;
                this.NumeroCredito = numeroCredito;
                this.Documento = documento;
                this.Nombre = nombre;
            }

            public List<Factura> ObtenerFactura()
            {
                int i = 0;
                List<Factura> lista = new List<Factura>();
                string query = "SELECT id_comercio, nro_credito, nro_documento, ape_nom ";
                query = query + "FROM bcra_factura ";

                datosConexion conn = new datosConexion();
                conn.DBConnect();

                if(conn.OpenConnectionCf() == true)
                {
                    MySqlCommand mycommand = new MySqlCommand(query, conn.connectionCF);
                    MySqlDataReader myreader;
                    myreader = mycommand.ExecuteReader();

                    if(myreader.HasRows)
                    {
                        while (myreader.Read())
                        {
                            lista.Add(new Factura() { CodigoComercio = myreader.GetInt32(0), NumeroCredito = myreader.GetInt32(1), Documento = myreader.GetInt32(2), Nombre = myreader.GetString(3) });

                            //Console.WriteLine("DATO: " + lista[i].CodigoComercio + " " + lista[i].NumeroCredito + " " + lista[i].Documento + " " + lista[i].Nombre);
                            //i++;
                        }
                    }
                    else
                    {
                        log.Info("NO SE PUDO EXTRAE DATOS DE LA TABLA bcra_factura DE LA BASE infobcra");   
                    }
                }


                return lista;
            }

        }


    }

    DESDE AQUI QUIERO ACCEDER A LOS DATOS

                                                   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MySql.Data.MySqlClient;
    using Datos;
    using Entidades;

    namespace ReglasNegocio
    {
        public class ConsultaFacturas
        {
           // public List<Factura> lista;

            public void fac()
            {


                int i = 1;
                Factura fc = new Factura();
                List<Factura> listaFacturas = new List<Factura>(fc.ObtenerFactura());

                //lista = fc.ObtenerFactura();

                foreach(Factura f in listaFacturas)
                {

                    Console.WriteLine("f.");
                    i++;
                }

            }

        }
    }

    Gracias

    jueves, 26 de marzo de 2020 0:09

Todas las respuestas

  • Hola 

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, vamos a darte seguimiento e investigaremos para buscar la mejor respuesta para ti.

     

    Gracias por usar los foros de MSDN.

     

    Luis Diego Mora

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 26 de marzo de 2020 1:09
    Moderador
  • Analizá este ejemplo:

    namespace Facturacion
    {
      class Program
      {
        private static List<Factura> Facturas;
    
        static void Main(string[] args)
        {
          CargarFacturas();
          MostrarFacturas();
        }
    
        private static void CargarFacturas()
        {
          Facturas = new List<Factura>();
          DataTable tablaFact = ObtenerTablaDeFacturas();
          
            if (tablaFact.Rows.Count > 0)
            {
              foreach(DataRow r in tablaFact.Rows)
              {
                Facturas.Add(new Factura() { CodigoComercio = int.Parse(r[0].ToString()), 
                                             NumeroCredito = int.Parse(r[1].ToString()),
                                             Documento = int.Parse(r[2].ToString()),
                                             Nombre = r[0].ToString() });
    
              }
            }
            else
            {
              //log.Info("NO SE PUDO EXTRAE DATOS DE LA TABLA bcra_factura DE LA BASE infobcra");
            }
        }
    
        private static void MostrarFacturas()
        {
          foreach (Factura f in Facturas)
          {
            Console.WriteLine("NuevaFactura\n");
            Console.WriteLine("CodigoComercio: " + f.CodigoComercio.ToString());
            Console.WriteLine("NumeroCredito: " + f.NumeroCredito.ToString());
            Console.WriteLine("Documento: " + f.Documento.ToString());
            Console.WriteLine("Nombre: " + f.Nombre);
          }
        }
       
        private static DataTable ObtenerTablaDeFacturas()
        {
          String strCnn = "String de conexion al la base de datos";
          using (MySqlConnection cn = new MySqlConnection(strCnn))
          {
            cn.Open();
            string sql = "SELECT id_comercio, nro_credito, nro_documento, ape_nom FROM bcra_factura";
            DataTable dt = new DataTable();
            MySqlCommand cmd = new MySqlCommand(sql, cn);
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            da.Fill(dt);
            return dt;
          }
        }
    
      }
    
      
    
      public class Factura
      {
        public int CodigoComercio { get; set; }
        public int NumeroCredito { get; set; }
        public int Documento { get; set; }
        public string Nombre { get; set; }
    
        public void Facturas(int codigoComercio, int numeroCredito, int documento, string nombre)
        {
          this.CodigoComercio = codigoComercio;
          this.NumeroCredito = numeroCredito;
          this.Documento = documento;
          this.Nombre = nombre;
        }
    
      }
    
    }
    

    jueves, 26 de marzo de 2020 1:33
  • hola

    >>El tema es que al ingresar al foreach no veo los atributos del List en cuestion.

    El problema es que no defines las propiedades como public

    solo cambia

     public class Factura
        {
            private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    
            public int CodigoComercio { get; set; }
            public int NumeroCredito { get; set; }
            public int Documento { get; set; }
            public string Nombre { get; set; }
    
    
    //resto codigo

    de esta forma tendras acceso en el foreach

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 26 de marzo de 2020 3:15
  • No es apropiado poner una lista de facturas dentro de la clase Factura. Los objetos factura deberían representar lo que es una factura en la realidad. Las facturas, en la realidad, suelen tener una lista de los productos vendidos, pero no una lista de facturas. La lista de facturas puede ser una propiedad de la Sucursal, por ejemplo; o simplemente puedes generar esa lista el la clase o formulario que arranca tu programa, solo trendrás que asegurarte que sea accesible desde las clases y formularios que las necesite. 

    jueves, 26 de marzo de 2020 12:14
  • Muchas gracias, problema resuelto

    Consulta sobre List<T>

    jueves, 26 de marzo de 2020 19:14
  • hola

    >>No es apropiado poner una lista de facturas dentro de la clase Factura

    Imagino haces referencia al metodo ObtenerFactura(), en los patrones de persistencia actuales eso es correcto, pero existieron patrones algo mas viejos como ser:

    ActiveRecord

    en donde la entidad tiene las operaciones que se realizan contra la db

    Es un patron algo viejo y viene de la epoca del TablaAdapter y esas cosas del dataset

    Imagine queria implementar algo como eso por eso no lo marque

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 26 de marzo de 2020 19:46