none
paso de parametros de vuelta RRS feed

  • Pregunta

  • saludos

    estoy tratando de hacer el proceso de lectura de una Bd y asignacion a los textoxbox a traves de procedure,

    se me ocurrio hacer esto :

    Lectura(DNI.Text); que esta en un archivo de clase, definido de la siguiente manera:

     public string Lectura(string cedula)
            {
                string APat, AMat, Nom, Emp, Dire, Ciu;
                string busca3 = "select * from pacientes where dni='" + cedula + "'";
                cmd = new SqlCommand(busca3, cn);
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read() == true)
                {
                    APat = dr["ApPaterno"].ToString();
                    AMat = dr["ApMaterno"].ToString();
                    Nom  = dr["Nombres"].ToString();
                    Emp  = dr["Empresa"].ToString();
                    Dire = dr["Direccion"].ToString();
                    Ciu  = dr["Cuidad"].ToString();
                    cn.Close();
                }

                return APat;
                return AMat;
                return Nom;
                return Emp;
                return Dire;
                return Ciu;
              }

    mi pregunta consiste, en como devolver los parametros para que se muestrem en los textboxs correspondientes, y si se puede o no hacer de esta manera, sino, acepto sugerencias y ayudas.

    saludos

    lunes, 9 de enero de 2017 22:11

Respuestas

  • No, así no se puede hacer. Al llegar al "return APat", se abandona la subrutina y nunca se llega a ejecutar ninguno de los return de debajo.

    Podrías usar parámetros de tipo out si es que realmente quieres devolver varios valores desde el método. Pero normalmente no se suele considerar esto una forma elegante de hacerlo. En su lugar, se define una clase o estructura que sirva para devolver todos los datos necesarios, y se hace que el método devuelva un único objeto de este tipo cargado con todos los valores. Después, en el sitio desde el que se hace la llamada, se va asignando a cada textbox cada uno de los valores contenidos dentro de ese objeto.

    lunes, 9 de enero de 2017 22:41
  • Muuchas Gracias.....

    martes, 10 de enero de 2017 20:34

Todas las respuestas

  • No, así no se puede hacer. Al llegar al "return APat", se abandona la subrutina y nunca se llega a ejecutar ninguno de los return de debajo.

    Podrías usar parámetros de tipo out si es que realmente quieres devolver varios valores desde el método. Pero normalmente no se suele considerar esto una forma elegante de hacerlo. En su lugar, se define una clase o estructura que sirva para devolver todos los datos necesarios, y se hace que el método devuelva un único objeto de este tipo cargado con todos los valores. Después, en el sitio desde el que se hace la llamada, se va asignando a cada textbox cada uno de los valores contenidos dentro de ese objeto.

    lunes, 9 de enero de 2017 22:41
  • Saludos ,

    Me  podrias enviar o mostrar algun ejemplo???

    martes, 10 de enero de 2017 18:22
  • Me  podrias enviar o mostrar algun ejemplo???

    Te pongo el ejemplo "sencillo" (el de los parámetros tipo out, no el de la clase):

             public void Lectura(string cedula, out string APat, out string AMat, etc etc)
             {
                 string busca3 = "select * from pacientes where dni='" + cedula + "'";
                 cmd = new SqlCommand(busca3, cn);
                 cn.Open();
                 SqlDataReader dr = cmd.ExecuteReader();
                 if (dr.Read() == true)
                 {
                     APat = dr["ApPaterno"].ToString();
                     AMat = dr["ApMaterno"].ToString();
                     etc etc
                 }
                 dr.Dispose();
                 cn.Dispose();
               }

    martes, 10 de enero de 2017 18:36
  • Gracias,

    lo modifique

     public void lectura(string cedula, out string ApPa, out string ApMa, out string Nom, out string ciu, out string dire, out string emp)
            {
                string busca3 = "select * from pacientes where dni='" + cedula + "'";
                cmd = new SqlCommand(busca3, cn);
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read() == true)
                {
                    ApPa = dr["ApPaterno"].ToString();
                    ApMa = dr["ApMaterno"].ToString();
                    Nom = dr["Nombres"].ToString();
                    ciu = dr["Cuidad"].ToString();
                    dire = dr["Direccion"].ToString();
                    emp = dr["Empresa"].ToString();
                 }
                dr.Dispose();
                cn.Dispose();
            }

    Pero me envia el siguiente error:

    es necesario Asignar el parametro ApPa out, antes que el control abandone el metodo actual.

    martes, 10 de enero de 2017 19:32
  • es necesario Asignar el parametro ApPa out, antes que el control abandone el metodo actual.

    Eso es por culpa del "if", ya que si no se cumple la condición (es decir, si no devuelve nada el datareader) entonces las variables que devolvemos como out no tendrían ningún valor asignado.

    Se puede resolver poniendo un "else" que les asigne algún valor (como por ejemplo cadenas vacías), o bien inicializándolas con un valor por defecto (aunque solo sea null) antes de entrar en el "if".

    martes, 10 de enero de 2017 20:07
  • Muuchas Gracias.....

    martes, 10 de enero de 2017 20:34