none
como cargar en un label un dato de mi tabla sql server RRS feed

  • Pregunta

  • Hola amigos 

    aqui molestando de nuevo

    veran deseo cargar un dato de mi tabla de sql server a un label al momento que doy click a un boton y que cargue cuando un string (el cual ya esta creado) cumpla la condición que se igual a un Id de la tabla

    Nota: estoy trabajando con tres capas 

    esto es lo que tengo

    capa lógica de negocios

    public List<DatosSocioPM> MostrarNombreCompletoPM(DatosSocioPM pSocioPM)
            {
                var ListaNombreSocioPM = from socioPM in ComunDB.Contexto.DatosSocioPMs.ToList()
                                         where socioPM.KeyTagCliente.Contains(socioPM.Nombre1Socio + ' ' + socioPM.Nombre2Socio + ' ' + socioPM.Apellido1Socio + ' ' + socioPM.Apellido2Socio)
                                         select socioPM;
    
                return ListaNombreSocioPM.ToList();
            }

    Capa interfaz de usuario

    ///Codigo para PM
                    if (lblSucursal.Text == "PM")
                    {
                        Key = ddlPais.SelectedValue + '-' + lblSucursal.Text + '-' + txtKeytag.Text;
    
                        _SociosPM.KeyTagCliente = Key;
    
                        if (Key == _SociosPM.KeyTagCliente)
                        {
                            imgSocio.ImageUrl = "../Imagenes/" + Key + ".jpg";
                            pnlFotoSocio.Visible = true;
                            btnIngresar.Visible = true;
                            lblNombre.Visible = true;
                            lblNombreSocio.Text = from socioPM in _SociosPMBL.MostrarNombreCompletoPM(_SociosPM)
                                                  select new
                                                  {
                                                      NombreCompletoPM = socioPM.Nombre1Socio + ' ' + socioPM.Nombre2Socio + ' ' + socioPM.Apellido1Socio + ' ' + socioPM.Apellido2Socio,
                                                  };
    
                            lblNombreSocio.DataBind();

    en la interfaz de usuario me da este error en el select y no se que sea

    no se que hacer ayuda porfavor

    viernes, 8 de agosto de 2014 21:11

Respuestas

  • El LINQ está bien escrito, en el sentido de que es sintácticamente correcto. Si no devuelve ningún resultado, lo que sucede es que no hay en la tabla ningún registro que cumpla la condición especificada. Fíjate en que la condición que le has puesto es bastante compleja, es decir, concatenas varios campos separándolos con espacios y luego pides que el KeyTagCliente contenga completo (y seguido) todo ese chorreón de caracteres. Si no hay ningún registro que cumpla esa condición, lógicamente el resultado vuelve vacío.

    Por cierto, fíjate que en tu rutina MostrarNombreCompleto pasas un parámetro llamado pSocioPM que luego no usas para nada (en todas partes usas socioPM, sin la "p"). Aunque esto es lícito, probablemente no sea lo que querías hacer.

    • Marcado como respuesta Francisco901 martes, 12 de agosto de 2014 19:53
    martes, 12 de agosto de 2014 6:35
  • Hola Alberto 

    ya solucione el problema gracias al comentario que me diste sobre las condiciones ya carga en el label solo cambie que en el parametro pSocioPM conteniera el keytag en vez de los nombres y los apellidos

    gracias por el apoyo 

    este es el cambio en el codigo

    where socioPM.KeyTagCliente.Contains(socioPM.KeyTagCliente)
    Gracias por tu apoyo muchas gracias

    • Editado Francisco901 martes, 12 de agosto de 2014 19:53
    • Marcado como respuesta Francisco901 martes, 12 de agosto de 2014 19:54
    martes, 12 de agosto de 2014 19:52

Todas las respuestas

  • Si lees cuidadosamente el mensaje de error entenderás qué es lo que te esta diciendo: se queja de que la parte derecha del "=" (tu sentencia "from" en LINQ) está devolviendo una lista de datos (IEnumerable) y la estás intentando meter en un string (la propiedad Text de la etiqueta). Eso no es lícito, en un string solo puedes meter un string, no una llista de strings. Incluso aunque tú sepas que tu Select sólo va a devolver un único dato, el compilador no lo sabe, y se sigue quejando de que no puedes meter una lista en un sting (ni siguiqera aunque la lista internamente sólo contenga un único string).

    La solución más inmediata consiste en añadir en la consulta linq un método que te escoja un único elemento de la lista (por ejemplo, .First), y asegurarte de que el tipo de dato devuelto es un String (no vale un tipo anónimo que dentro tenga un String). Por ejemplo:

    lblNombreSocio.Text = (from socioPM in _SociosPMBL.MostrarNombreCompletoPM(_SociosPM)
        select socioPM.Nombre1Socio + ' ' + socioPM.Nombre2Socio + ' ' + socioPM.Apellido1Socio + ' ' + socioPM.Apellido2Socio).First();

    domingo, 10 de agosto de 2014 11:08
  • Hola Alberto

    gracias por contestar pronto y perdon por mi demora al responder.

    veras ya probe con el codigo de ejemplo pero me da este error

    La secuencia no contiene elementos

    a que se refiere con ello

    lunes, 11 de agosto de 2014 16:49
  • Ese error significa que el .First(), que sirve para extraer el primer resultado de la Select, ha fallado porque la Select que has enviado no encontró ningún registro. Si quieres, puedes sustituirlo por FirstOrDefault(), que te devolverá null en caso de que la búsqueda no encuentre nada. Pero obviamente, en ese caso la etiqueta te quedará vacía.
    lunes, 11 de agosto de 2014 18:43
  • gracias alberto 

    ya lo hice y ya no da ese error lo unico que no me muestra nada cuando cargo el label este es codigo que coloque segun lo que me indicaste

    if (lblSucursal.Text == "PM")
                    {
                        KeyPM = ddlPais.SelectedValue + '-' + lblSucursal.Text + '-' + txtKeytag.Text;
    
                        _SociosPM.KeyTagCliente = KeyPM;
    
                        if (KeyPM == _SociosPM.KeyTagCliente)
                        {
                            imgSocio.ImageUrl = "../Imagenes/" + KeyPM + ".jpg";
                            pnlFotoSocio.Visible = true;
                            btnIngresar.Visible = true;
                            lblNombre.Visible = true;
                            lblNombreSocio.Text = (from socioPM in _SociosPMBL.MostrarNombreCompletoPM(_SociosPM)
                                                   where KeyPM == socioPM.KeyTagCliente
                                                   select socioPM.Nombre1Socio+ ' ' + socioPM.Nombre2Socio + ' ' + socioPM.Apellido1Socio + ' ' + socioPM.Apellido2Socio).FirstOrDefault();

    no se si no esta conectando con la base de datos o mi linq esta estructurado de forma erronea. este es el codigo del linq

    public List<DatosSocioPM> MostrarNombreCompletoPM(DatosSocioPM pSocioPM)
            {
                var ListaNombreSocioPM = from socioPM in ComunDB.Contexto.DatosSocioPMs.ToList()
                                         where socioPM.KeyTagCliente.Contains(socioPM.Nombre1Socio + ' ' + socioPM.Nombre2Socio + ' ' + socioPM.Apellido1Socio + ' ' + socioPM.Apellido2Socio)
                                         select socioPM;
    
                return ListaNombreSocioPM.ToList();
            }

    o no se si ahi cuando indico en el where que socioPM.KeyTagCliente.contains.... esta erronea la sintaxis. lo hice asi para indicar al linq que cuando el keytagcliente aparesca muestre el nombre del socio

    no se si esto sea licito

    lunes, 11 de agosto de 2014 19:41
  • El LINQ está bien escrito, en el sentido de que es sintácticamente correcto. Si no devuelve ningún resultado, lo que sucede es que no hay en la tabla ningún registro que cumpla la condición especificada. Fíjate en que la condición que le has puesto es bastante compleja, es decir, concatenas varios campos separándolos con espacios y luego pides que el KeyTagCliente contenga completo (y seguido) todo ese chorreón de caracteres. Si no hay ningún registro que cumpla esa condición, lógicamente el resultado vuelve vacío.

    Por cierto, fíjate que en tu rutina MostrarNombreCompleto pasas un parámetro llamado pSocioPM que luego no usas para nada (en todas partes usas socioPM, sin la "p"). Aunque esto es lícito, probablemente no sea lo que querías hacer.

    • Marcado como respuesta Francisco901 martes, 12 de agosto de 2014 19:53
    martes, 12 de agosto de 2014 6:35
  • Gracias por responder Alberto

    ya revisare la sintaxis con cuidado, y lo de la "p" ya lo cambie gracias por el comentario, algo que se me ocurre es que en vez de concatenar los nombres y los apellidos los convocare uno por uno y los uniré con operador "&&" aunque no se si me convocara los datos como valor null, lo probare y te aviso. hey gracias por dedicar tiempo para nosotros los novatos jejejejeje....

    martes, 12 de agosto de 2014 17:11
  • Hola Alberto 

    ya solucione el problema gracias al comentario que me diste sobre las condiciones ya carga en el label solo cambie que en el parametro pSocioPM conteniera el keytag en vez de los nombres y los apellidos

    gracias por el apoyo 

    este es el cambio en el codigo

    where socioPM.KeyTagCliente.Contains(socioPM.KeyTagCliente)
    Gracias por tu apoyo muchas gracias

    • Editado Francisco901 martes, 12 de agosto de 2014 19:53
    • Marcado como respuesta Francisco901 martes, 12 de agosto de 2014 19:54
    martes, 12 de agosto de 2014 19:52