none
Duda con Clase RRS feed

  • Pregunta

  • Tengo la siguiente consulta:

    Pensemos en que tengo una aplicacion que lista todos los usuarios de una empresa, para esto tengo una clase Usuario, con sus atributos nombres, edad,sexo...etc

    Bueno mi duda esta aca:
    - Cada uno de sus atributos debe estar acompañado de una propiedad para poder leer y escribir sobre ese dato?
    - Cuando hago un select a la base de datos que me traiga los datos de un(os) usuario(s) esta consulta debe estar plasamada como un metodo en la clase;}
     public loadData()
    {
    select * from user
    }
    o debe estar en mi aplicación.
           
    lunes, 7 de julio de 2008 15:39

Respuestas

  • Eso es, el método anterior devolvia un solo objeto de tipo cliente puesto que el identificador del cliente en la base de datos será único, pero puedes hacer una cosulta que sepas que puede devolver más de un registro pues cambias el if por un while, por ejemplo un metodo que te devuelve una lista con los clientes de un determinado sexo seria asi:

     

    Code Snippet

    public List<Cliente> GetCliente(string sexo)

    {

    string sql;

    List<Cliente> clientes = new List<Cliente>();

    Cliente c = null;

     

    sql = @"SELECT id, nombre, fechaNacimiento, sexo...

    FROM tuTablaDeUsuarios

    WHERE sexo = @sexo";

     

    SqlCommand comando = new SqlCommand();

    comando.Connection = tuConexionDeLaBBDD;

    comando.CommandText = sql;

    comando.Parameters.Add("@sexo").Value = sexo;

     

    using (conexion)

    {

    SqlDataReader dr;

    conexion.Open();

    dr = comando.ExecuteReader();

    while (dr != null && dr.HasRows)

    {

    dr.Read();

    c = new Cliente();

    c.Id = (int)dr["id"];

    c.Nombre = dr["nombre"].ToString();

    c.Sexo = dr["sexo"].ToString();

    c.FechaPublicacion = (DateTime)dr["fechaNacimiento"];

    clientes.Add(c);

    }

    }

    return clientes;

    }

     

     

     

    Para saber el numero de registros que se ven afectados por la consulta puedes utilizar  comando.ExecuteNonQuery()
    martes, 8 de julio de 2008 15:18
  • Agregale el evento ItemSelectionChanged al listview para poder acceder al item seleccionado, primero comprobamos si el item del listview esta seleccionado puesto que este evento se produce dos veces en el caso de que haya seleccionado previamente un item. La primera vez para el item que se deselecciona y la segunda para el item que se selecciona, por eso comprobamos que el item esta seleccionado para trabajar con el item correcto

     

     

    Code Snippet

    private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)

    {

    if (e.IsSelected)

    {

    Cliente c = (Cliente)e.Item.Tag();

    //resto de codigo....

    }

    }

     

     

    viernes, 18 de julio de 2008 18:07

Todas las respuestas

  • Hoa Aplication,

     

    Puedes estructurar la clase como creas que es mejor (metodos o propiedades). En mi caso, si lo que quiero es hacer accesible un valor o atributo de una clase que puede ser de lectura y escritura (o aunque sea de solo lectura pero es fácil verlo como una propiedad) lo defino como una propiedad que ademas es mas simple y claro que escribir dos métodos GetAlgo() y SetAlgo(). Por otro lado si el valor que vas a devolver depende de, por ejemplo, una variable que tu le vas a pasar al objeto pues utiliza un método GetAlgo(miVariable...). Espero que con este ejemplo te quede algo mas claro.

     

    En cuanto a la consulta dentro de un método o fuera de este. Pues te recomendaría utilizar una arquitectura en N-capas (haz uso de nuestro amigo google y seguro que encuentras bastante información o incluso puedes buscar aquí en los foros de msdn puesto que se ha hablado en otros post sobre aplicaciones en N-capas) y separar en capas el acceso a datos, la lógica de negocio y la interfaz de usuario para así tener todo el código de una forma más estructurada y legible que posteriormente te ayudará a mantener el código de una forma más eficiente.

     

    A continuación te pongo un método como ejemplo de como podrías realizar una consulta a la base de datos y devolver directamente un objeto de tipo Cliente:

     

    Code Snippet

    public Cliente GetCliente(int idCliente)

    {

    string sql;

    Cliente cliente= null;

     

    sql = @"SELECT id, nombre, fechaNacimiento, sexo...

    FROM tuTablaDeUsuarios

    WHERE id = @idCliente";

     

    SqlCommand comando = new SqlCommand();

    comando.Connection = tuConexionDeLaBBDD;

    comando.CommandText = sql;

    comando.Parameters.Add("@idCliente", SqlDbType.Int).Value = idCliente;

     

    using (conexion)

    {

    SqlDataReader dr;

    conexion.Open();

    dr = comando.ExecuteReader();

    if (dr != null && dr.HasRows)

    {

    dr.Read();

    cliente = new Cliente();

    cliente.Id = (int)dr["id"];

    cliente.Nombre = dr["nombre"].ToString();

    cliente.Sexo = dr["sexo"].ToString();

    cliente.FechaPublicacion = (DateTime)dr["fechaNacimiento"];

    }

    }

     

    return cliente;

    }

     

     

    Un saludo,

    Jonás

    lunes, 7 de julio de 2008 20:45
  •  JonasTG Escribió:

    Hoa Aplication,

     

    En cuanto a la consulta dentro de un método o fuera de este. Pues te recomendaría utilizar una arquitectura en N-capas (haz uso de nuestro amigo google y seguro que encuentras bastante información o incluso puedes buscar aquí en los foros de msdn puesto que se ha hablado en otros post sobre aplicaciones en N-capas) y separar en capas el acceso a datos, la lógica de negocio y la interfaz de usuario para así tener todo el código de una forma más estructurada y legible que posteriormente te ayudará a mantener el código de una forma más eficiente.

     

    A continuación te pongo un método como ejemplo de como podrías realizar una consulta a la base de datos y devolver directamente un objeto de tipo Cliente:

     



    Pero el codigo de consulta a la base de datos, igual debiera ir dentro de clases, o no?

    Segun el ejemplo como lo hago si tengo varios clientes los cuales quiero mostrar en un listview,
    debiera crear una instancia por cada cliente.
    lunes, 7 de julio de 2008 22:21
  •  AplicationNet Escribió:
     JonasTG Escribió:

    Hoa Aplication,

     

    En cuanto a la consulta dentro de un método o fuera de este. Pues te recomendaría utilizar una arquitectura en N-capas (haz uso de nuestro amigo google y seguro que encuentras bastante información o incluso puedes buscar aquí en los foros de msdn puesto que se ha hablado en otros post sobre aplicaciones en N-capas) y separar en capas el acceso a datos, la lógica de negocio y la interfaz de usuario para así tener todo el código de una forma más estructurada y legible que posteriormente te ayudará a mantener el código de una forma más eficiente.

     

    A continuación te pongo un método como ejemplo de como podrías realizar una consulta a la base de datos y devolver directamente un objeto de tipo Cliente:

     



    Pero el codigo de consulta a la base de datos, igual debiera ir dentro de clases, o no?

    Segun el ejemplo como lo hago si tengo varios clientes los cuales quiero mostrar en un listview,
    debiera crear una instancia por cada cliente.

     

    Si, el codigo de ejemplo iria dentro de una clase puesto que es un método. Lo puedes tener dentro de una clase que acceda se encargue de traer información de la base de datos o como si lo quieres meter en la clase cliente y llamar al metodo como tu habias puesto antes LoadData().

     

    A ver si te vale algo así:

     

    Code Snippet

    //miListaCliente es una coleccion con los clientes que quieres mostrar

    foreach (Cliente cliente in miListaClientes)

    {

    ListViewItem item = new ListViewItem(cliente.Nombre);

    //aqui metes el cliente por si necesitas acceder al cliente que representa un determinado item del listview

    item.Tag = cliente;

    listView1.Items.Add(item);

    } 

     

     

     

    lunes, 7 de julio de 2008 23:16
  •  JonasTG Escribió:


    Code Snippet

    //miListaCliente es una coleccion con los clientes que quieres mostrar

    foreach (Cliente cliente in miListaClientes)

    {

    ListViewItem item = new ListViewItem(cliente.Nombre);

    //aqui metes el cliente por si necesitas acceder al cliente que representa un determinado item del listview

    item.Tag = cliente;

    listView1.Items.Add(item);

    } 

     

     

     



    Claro a eso me referia , pero era la otra parte en la que yo, genero multiples instancias
    es decir cliente = new cliente(), por cada uno de ellos.
    esto debiera ir en ciclo while al recorrer el DataReader, o no? ademas como puedo saber en cual instancia estoy o cuantas instancias hay de ese objeto.
    martes, 8 de julio de 2008 12:41
  • Eso es, el método anterior devolvia un solo objeto de tipo cliente puesto que el identificador del cliente en la base de datos será único, pero puedes hacer una cosulta que sepas que puede devolver más de un registro pues cambias el if por un while, por ejemplo un metodo que te devuelve una lista con los clientes de un determinado sexo seria asi:

     

    Code Snippet

    public List<Cliente> GetCliente(string sexo)

    {

    string sql;

    List<Cliente> clientes = new List<Cliente>();

    Cliente c = null;

     

    sql = @"SELECT id, nombre, fechaNacimiento, sexo...

    FROM tuTablaDeUsuarios

    WHERE sexo = @sexo";

     

    SqlCommand comando = new SqlCommand();

    comando.Connection = tuConexionDeLaBBDD;

    comando.CommandText = sql;

    comando.Parameters.Add("@sexo").Value = sexo;

     

    using (conexion)

    {

    SqlDataReader dr;

    conexion.Open();

    dr = comando.ExecuteReader();

    while (dr != null && dr.HasRows)

    {

    dr.Read();

    c = new Cliente();

    c.Id = (int)dr["id"];

    c.Nombre = dr["nombre"].ToString();

    c.Sexo = dr["sexo"].ToString();

    c.FechaPublicacion = (DateTime)dr["fechaNacimiento"];

    clientes.Add(c);

    }

    }

    return clientes;

    }

     

     

     

    Para saber el numero de registros que se ven afectados por la consulta puedes utilizar  comando.ExecuteNonQuery()
    martes, 8 de julio de 2008 15:18
  •  JonasTG Escribió:


    item.Tag = cliente;

     



    Todo bien, solo me falta poder recuperar el objeto del tag al hacer doble clic sobre el listview.
    viernes, 18 de julio de 2008 16:35
  • Agregale el evento ItemSelectionChanged al listview para poder acceder al item seleccionado, primero comprobamos si el item del listview esta seleccionado puesto que este evento se produce dos veces en el caso de que haya seleccionado previamente un item. La primera vez para el item que se deselecciona y la segunda para el item que se selecciona, por eso comprobamos que el item esta seleccionado para trabajar con el item correcto

     

     

    Code Snippet

    private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)

    {

    if (e.IsSelected)

    {

    Cliente c = (Cliente)e.Item.Tag();

    //resto de codigo....

    }

    }

     

     

    viernes, 18 de julio de 2008 18:07
  •  JonasTG Escribió:

    Agregale el evento ItemSelectionChanged al listview para poder acceder al item seleccionado, primero comprobamos si el item del listview esta seleccionado puesto que este evento se produce dos veces en el caso de que haya seleccionado previamente un item. La primera vez para el item que se deselecciona y la segunda para el item que se selecciona, por eso comprobamos que el item esta seleccionado para trabajar con el item correcto

     

     

    Code Snippet
    Cliente c = (Cliente)e.Item.Tag();

    //resto de codigo....



    Hay algo que no me cuadra, yo anteriormente carge un List de clientes, bueno el asunto es, se supone que cuando se selecciona un item del listview yo debo ir a mi lista de cliente y encontrar el cliente seleccionado, del listview.
    Probe con el metodo find, pero no me resulto, porque solo sirve para busquedas con filtros.

    Ahora yo se que tambien pued trabajar directamente con
    Cliente c = (Cliente)e.Item.Tag();

    Pero entonces cual seria la finalidad del List de Clientes
    lunes, 21 de julio de 2008 13:15