none
Cargar en una lista los datos de una tabla y mostrarlos en un DataGridvew RRS feed

  • Pregunta

  • Hola a todos, necesito que me hagan un gran favor estoy intentando hacer lo siguiente con EF 

    cargar una lista Productos con datos de una tabla productos en sql server.

    pero no entiendo como implementar el mismo les dejo un codigo hecho con T-Sql pero me gustaria hacerlo con EF.

    Es muy comun que cuando estamos realizando algun programa escolar o un proyecto, necesitamos utilizar estructuras de datos y visualizarlas. Pues bien, les dire como cargar informacion desde una base de datos a una lista manipulable 100% y despues visualizarla en un DataGridView, todo escrito en C# y SQL Server 2005.
    
    Debemos tener creada la Base de Datos con la tabla que queremos cargar en nuestro List, posteriormente debemos crear una Clase que contenga los mismos campos de la tabla como atributos:
    Ejemplo:
    
    Crearemos una clase llamada Empleados.cs
    
    
    public class Empleados
        {
            private string _no_empleado;
            private string _paterno;
            private string _materno;
            private string _nombre;
    
            public string NoEmpleado
            {
                get { return _no_empleado; }
                set { _no_empleado = value; }
            }
            public string Paterno
            {
                get { return _paterno; }
                set { _paterno = value; }                                    
            }
            public string Materno
            {
                get { return _materno; }
                set { _materno = value; }
            }
            public string Nombre
            {
                get { return _nombre; }
                set { _nombre = value; }
            }
            public SearchFunction(string NoEmp, string paterno, string materno, string nombre)
            {
                this.NoEmpleado = NoEmp;
                this.Paterno = paterno;
                this.Materno = materno;
                this.Nombre = nombre;
            }             
        }
    
    Ya teniendo declarada la clase, para crear una lista de Empleados, debemos declarar un List de tipo Empleados para cargarlos desde la BD:
    
    List<Empleados> objEmpleados = new List<Empleados>();
    SqlConnection miConexion = new SqlConnection("Server=(local)\\SQLEXPRESS;database=MiDataBase;integrated security=yes");
    
    string query = "SELECT Id, Paterno, Materno, Nombre FROM Empleados";
                try
                {
                    using (SqlCommand cmd = new SqlCommand(query,miConexion))
                    {
                        SqlDataReader dr;
                        cmd.Connection = miConexion;
                        cmd.Connection.Open();
                        dr = cmd.ExecuteReader();
                        if (dr.HasRows == true)
                            while (dr.Read())
                                objEmpleados.Add(new SearchFunction(dr[0].ToString(), dr[1].ToString(), dr[2].ToString(), dr[3].ToString()));
                        cmd.Connection.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

    por favor necesito ayuda

    Gracias

    Roberto

    jueves, 19 de marzo de 2020 20:04

Respuestas

  • Hola

    para utilizar entity Framework requieres tener un

       DbContext para realizar tu coneccion a base de datos y quedaria asi mas o menos

    e instalas EntityFrmework de NuGet

    public class Context : DbContext
        {
            public PlutoContext()
                : base("Server=(local)\\SQLEXPRESS;database=MiDataBase;integrated security=yes")
            {
            }
    
            public DbSet<Empleados> Empleados { get; set; }
            
    
        }

    y para cargar la lista seria lgo asi mas o menos

    List<Empleados> empleados = new List<Empleados>();
    using(Context db = new Context())
    {
       empleados = db.Empleados.ToList();
    }

    y para guardar seria

    public void guardar(Empleados empleado)
    {
        using(Context db = new Context())
        {
               db.Empleados.Add(empleado);
               db.SaveChanges(); 
        }
    }


    viernes, 20 de marzo de 2020 14:52

Todas las respuestas

  • hola

    No entiendo porque planteas esta pregunta si hay sabes como hacerlo

    Crear una lista a partir de una Clase y pasar a un ListView C#

    en tu anterior pregunta ya lo aplicaste

    saludos



    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 19 de marzo de 2020 20:26
  • Estimado gracias.

    Tal vez estoy confundido con esto, pero lo que quiero es cargar una lista con datos de una tabla, como se dice poblar la lista.  y luego para probar que están los datos quiero mostrarlos en un datagrid view

    porque ya hice esto 

    List<Producto> productos = new List<Producto>();

    y luego lo agrego a mi datagridview

                dataGridView2.DataSource = productos;

    pero no me muestra nada solo los encabezados.es por eso que pienso que no hay datos de la tabla en la lista.

    por eso es que pregunto como es que poblo la lista con los datos.

    por favor

    gracias

    Roberto

    jueves, 19 de marzo de 2020 20:49
  • hola

    >>pero no me muestra nada solo los encabezados.es por eso que pienso que no hay datos de la tabla en la lista.

    Pero la lista esta vacia, como esperas ver algo sino creas ningun item agregandolo con el Add()

    igual no entiendo que relacion tiene estos con la pregunta de sql y entity framework, como que se esta mezclando todo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 19 de marzo de 2020 20:53
  • Estimado es precisamente esto lo que no se como hacer

    Pero la lista esta vacía, como esperas ver algo sino creas ningún item agregándolo con el Add()

    algún ejemplo por favor es lo que quiero hacer.

    gracias

    Roberto

    jueves, 19 de marzo de 2020 21:02
  • hola

    Leiste algo de como se usan las listas?

    List<T> Clase

    creo que es el primer paso que deberias dar, aprender a usar List<>

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 19 de marzo de 2020 21:19
  • Sí. he leído.

    el proceso de agregar datos a la lista desde, texbox usando el add. lo se utilizar, y luego con un foreach guardarlos en una tabla lo entiendo perfectamente.

    ahora el proceso inverso. traer y cargar la lista con datos de la tabla es que se me complica.


    Gracias Leandro.

    Roberto

    jueves, 19 de marzo de 2020 21:36
  • hola

    >>ahora el proceso inverso. traer y cargar la lista con datos de la tabla es que se me complica.

    es similar a los textbox, solo que en lugar de controles usas el reader que ejecuto el select a la db

    algo como esto

    public List<Class1> Obtener(int param1)  
    {  
        string connstring = "connection string";    
        using (SqlConnection cn = new SqlConnection(connstring))  
        {    
            cn.Open();    
      
            string sql = "SELECT campo1, campo2, campo3 FROM Tabla WHERE campo=@param1";    
            SqlCommand cmd = new SqlCommand(query, cn);    
            cmd.Parameters.AddwithValue("@param1", param1);    
    
            SqlDataReader reader = cmd.ExecuteReader();    
    
            List<Class1> lista = new List<Class1>();  
            while(reader.Read())    
            {    
                Class1 item = new Class1();  
    
                item.prop1 = Convert.ToString(reader["campo1"]);    
                item.prop2 = Convert.ToString(reader["campo2"]);    
                item.prop3 = Convert.ToString(reader["campo3"]);    
    
                lista.Add(item);  
    
            }    
        }  
    }  

    por supuesto Class1 seria la clase que tu hayas definido

    saludso


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 19 de marzo de 2020 23:23
  • Hola Leandro

    En el método anterior que posteaste te faltó retornar el objeto List<>.

    Saludos

    Pablo

    EDITO: y cerrar la conexión también.
    jueves, 19 de marzo de 2020 23:35
  • Buenas noches Leandro. muchas gracias.

    este es el requerimiento que tengo de una persona que me orienta y ayuda a hacer una aplicacion.

    El índice (miembro de la clase Producto) lo obtenes cuando cargas los productos, por ejemplo: Supone que con EF cargas los atributos, pero sólo los de la tabla, en un List<tblProducto> lista. Luego haces esto:

    int a;
    List<Producto> productos = new List<Producto>();
    for (a = 0; a < lista.Count; a++) 
    {
        productos.Add(lista[a].Id, lista[a].Codigo, lista[a].CategoriaId, lista[a].Descripcion, lista[a].PrecioVenta, lista[a].PrecioCosto, lista[a].Stock, a);
    }

    es por eso mi pregunta y por eso es que quiero hacerlo así.

    Ud. que me puede decir al respecto.

    le agradezco y mil disculpas.

    Roberto

    viernes, 20 de marzo de 2020 0:45
  • Hola Roberto

    Lo único que te está faltando allí es que, vos, con EF (que yo lo desconozco totalmente), cargues un List<?> desde la tabla Producto, que me imagino que te armará un List<> de objetos que contengan todos los atributos de la tabla Producto; otra cosa que ahora recuerdo, es que, además de la FK a Categorias, vi otras 2 FK que entiendo que no deberían existir, salvo que sea algo misterioso que desconozco igual que EF. Fijate, además, que CategoriaId (o como llames a la FK a la tabla Categoria) debe ser un int, no otra cosa (que no se como lo definiste). En esta sección, si vos decidís seguir usando EF, más que hasta aquí no te puedo ayudar. Otra cosa muy diferente sería si usaras el bendito lenguaje Transact-SQL y SqlCommand, que además te ahorraría mucha longitud de código.

    EDITO: lo que tendrías que cargar con EF es lo que yo llamé 'lista' en el código que pasaste en tu respuesta anterior.

    Saludos

    Pablo


    viernes, 20 de marzo de 2020 1:04
  • Deleted
    viernes, 20 de marzo de 2020 11:21
  • hola

    >>es por eso mi pregunta y por eso es que quiero hacerlo así.

    porque no usas un foreach, es mas si te aniams lo puedes hacer con linq

    int a = 1;
    List<Producto> productos = new List<Producto>();

    foreach (var item in lista)
    {
        productos.Add(new Producto(item.Id, item.Codigo, item.CategoriaId, item.Descripcion, item.PrecioVenta, item.PrecioCosto, item.Stock, a));
        a++;
    }

    recuerda debes instanciar la class para poder ponerla dentro de la lista

    Con linq queda en una sola linea

    var productos = lista.Select((item, index)=> new Producto(item.Id, item.Codigo, item.CategoriaId, item.Descripcion, item.PrecioVenta, item.PrecioCosto, item.Stock, index));
    

    Enumerable.Select Method

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 20 de marzo de 2020 13:21
  • Estimado, buen día. 

    dos preguntas si esta parte lo hago con T-SQL afectaría a mi aplicación?

    la segunda pregunta como lo resolvería esta parte con T-SQL donde veo algun ejemplo por favor.

    porque la verdad, no debo rendirme de hacer esta aplicación por esta parte, me gustaría terminar lo que comencé así me tome mas tiempo.

    Yo decidí hacer esto con EF. porque de mucho leer había muchas personas que coinciden en que es lo mejor de momento que Microsoft ha sacado y ahora en Entity Framework Core.

    ahora otra, regresando al formulario que ya tenemos yo ya tengo el Id en el button y la consulta que me trae ese producto de la bd, cual es el inconveniente de hacerlo así, aunque la verdad me tiene muy intrigado lo de cargarlos en una Lista. pero que pena que mis conocimientos son limitados.

    Muchas gracias.

    Roberto

    viernes, 20 de marzo de 2020 13:47
  • hola

    >>la segunda pregunta como lo resolvería esta parte con T-SQL donde veo algun ejemplo por favor.

    No entiendo como seguir estas preguntas que realizas, centrate por favor en algo concreto para poder responder

    Empezaste con t-sql mezclandolo con entity framework, despues pasaste a listas, ahora quieres volver a t-sql, en que quedamos ?

    Plantea una pregunta concreta, busca la mejor repsuesta cierrala y luego plantea otra diferente si vas a cambiar de tema, pero manten una sola con un unico tema a la vez, sino es imposible de seguir y se mezcla todo

    >>la consulta que me trae ese producto de la bd, cual es el inconveniente de hacerlo así

    ninguno, son diferentes formas de acceder a los datos

    validaste mi 4 respuesta en donde puse un ejemplo de como deberia ser el codigo para consultar usando ado.net y cargar una List<> ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 20 de marzo de 2020 14:04
  • Estimado Leandro buen día.

    muchas gracias tambien la verdad muy agradecido con todos uds. no crean leo mas de una vez las respuestas para entender bien y así proceder.

    int a = 1;
    List<Producto> productos = new List<Producto>();
    
    foreach (var item in lista) 
    {
        productos.Add(new Producto(item.Id, item.Codigo, item.CategoriaId, item.Descripcion, item.PrecioVenta, item.PrecioCosto, item.Stock, a));
        a++;
    }

    Lo que entiendo de este codigo lo explico, creo una lista del tipo Producto Ok listo pero en el foreach

    in lista, yo creo que ahi deben estar los campos de mi tabla, que es justamente la lista que no logro poblar con los datos de la tabla.

    osea mi problema ahora en este momento es traer la tabla y cargarla en una lista. y luego de eso ya podría agregarla a productos.add.

    es lo que entiendo.

    Gracias 

    Roberto

    viernes, 20 de marzo de 2020 14:05
  • hola

    >>yo creo que ahi deben estar los campos de mi tabla, que es justamente la lista que no logro poblar

    Revisaste el ejemplo que puse en una respuesta anterior ?

    cuando consultas a la db no va ningun for o foreach, se usa el while porque recorrer un reader

    revisa las respuestas que proporcione anteriormente para encontrar donde use

    //codigo SqlDataReader reader = cmd.ExecuteReader(); List<Class1> lista = new List<Class1>(); while(reader.Read()) { Class1 item = new Class1(); item.prop1 = Convert.ToString(reader["campo1"]); item.prop2 = Convert.ToString(reader["campo2"]); item.prop3 = Convert.ToString(reader["campo3"]); lista.Add(item); }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 20 de marzo de 2020 14:27
  • Hola

    para utilizar entity Framework requieres tener un

       DbContext para realizar tu coneccion a base de datos y quedaria asi mas o menos

    e instalas EntityFrmework de NuGet

    public class Context : DbContext
        {
            public PlutoContext()
                : base("Server=(local)\\SQLEXPRESS;database=MiDataBase;integrated security=yes")
            {
            }
    
            public DbSet<Empleados> Empleados { get; set; }
            
    
        }

    y para cargar la lista seria lgo asi mas o menos

    List<Empleados> empleados = new List<Empleados>();
    using(Context db = new Context())
    {
       empleados = db.Empleados.ToList();
    }

    y para guardar seria

    public void guardar(Empleados empleado)
    {
        using(Context db = new Context())
        {
               db.Empleados.Add(empleado);
               db.SaveChanges(); 
        }
    }


    viernes, 20 de marzo de 2020 14:52
  • Muchas gracias

    Roberto

    sábado, 21 de marzo de 2020 1:08
  • hola

    Pero entonces querias usar entity framework? entonces para que los demas planteos?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 21 de marzo de 2020 2:01
  • Estimado Leandro. siempre agradecido yo en mi pregunta inicial escribí esto.

    pero no entiendo como implementar el mismo les dejo un código hecho con T-Sql pero me gustaría hacerlo con EF.

    Lo demás era un ejemplo, 

    Pero gracias estimado. 

    Roberto

    sábado, 21 de marzo de 2020 19:23