none
Cómo devolver datos desde un dato entero y devolverlo a cajas de textos en 3 capas RRS feed

  • Pregunta

  • Tengo un problema o más bien no se cómo hacer que en un formulario pido un número entero en una caja de texto y los resultados devolverlos a otras cajas de textos. Estoy trabajando en 3 capas; la de negocio, datos y presentación. Trabajo con SQLServer y con procedimientos almacenados.

    Lo hago bien con un datatable para datagridview y todo bien, pero yo no quiero así. Tengo algo así en la capa de presentación:

    NegocioProductos mostrar=new NegocioProductos();

    mostrar.MostrarDatos(Convert.ToInt32(TextBoxID.Text));

    ///CÓMO HAGO AQUÍ PARA DEVOLVER LOS RESULTADOS????

    En el procedimiento almacenado: Select * from Tabla where @id=Tabla.Id

    Claro que en la capa de datos hago todos los procedimientos necesarios para cargar el StoreProcedure con ExcecuteReader()

    martes, 13 de marzo de 2018 23:00

Respuestas

  • Me parece genial que no use DataTable y que use clases y colecciones.  Es lo mejor.

    Pregunto:  ¿En qué capa está declarada la clase NegocioProductos?  Porque si es en la clase de negocio, me pregunto yo por qué habría de tener un método llamado MostrarXXXX.  La capa de negocioes no tiene por qué tener código de presentación.  Para eso es la capa de presentación:  Para código de presentación.

    Como no conozco los detalles de su trabajo, diré lo siguiente:

    //Imagino que después de digitar el número, el usuario presiona un botón.
    //Imagino también que la capa de presentación es Windows Forms.
    private void elBoton_Click(object sender, EventArgs e)
    {
        int id;
        if (!Int32.TryParse(ElTxt.Text, out id))
        {
            MessageBox.Show("Lo digitado no es un número entero.");
            return;
        }
        //Obtengo un objeto repositorio que usaré para obtener el dato que busco.
        CapaDeDatos.ClaseRepositorio repositorio = new CapaDeDatos.ClaseRepositorio(...);
        NegocioProductos np = repositorio.ObtenerNegocioProductoPorId(id);
        if (np != null)
        {
            //Resultado encontrado.  Llenemos las cajas de texto.
            ...
        }
        else
        {
            //Resultado no encontrado.  Limpiemos las cajas de texto,
            //y tal vez inclusive decirle al usuario que no encontramos nada.
            ...
        }
    }

    Básicamente así se usaría algo en 3 capas.  A veces el repositorio estará en la capa de negocio, a veces en la capa de datos.  Depende de la habilidad y capacidad de abstracción de cada programador, al igual que los requerimientos del proyecto.


    Jose R. MCP
    Code Samples


    martes, 13 de marzo de 2018 23:15
    Moderador

Todas las respuestas

  • Me parece genial que no use DataTable y que use clases y colecciones.  Es lo mejor.

    Pregunto:  ¿En qué capa está declarada la clase NegocioProductos?  Porque si es en la clase de negocio, me pregunto yo por qué habría de tener un método llamado MostrarXXXX.  La capa de negocioes no tiene por qué tener código de presentación.  Para eso es la capa de presentación:  Para código de presentación.

    Como no conozco los detalles de su trabajo, diré lo siguiente:

    //Imagino que después de digitar el número, el usuario presiona un botón.
    //Imagino también que la capa de presentación es Windows Forms.
    private void elBoton_Click(object sender, EventArgs e)
    {
        int id;
        if (!Int32.TryParse(ElTxt.Text, out id))
        {
            MessageBox.Show("Lo digitado no es un número entero.");
            return;
        }
        //Obtengo un objeto repositorio que usaré para obtener el dato que busco.
        CapaDeDatos.ClaseRepositorio repositorio = new CapaDeDatos.ClaseRepositorio(...);
        NegocioProductos np = repositorio.ObtenerNegocioProductoPorId(id);
        if (np != null)
        {
            //Resultado encontrado.  Llenemos las cajas de texto.
            ...
        }
        else
        {
            //Resultado no encontrado.  Limpiemos las cajas de texto,
            //y tal vez inclusive decirle al usuario que no encontramos nada.
            ...
        }
    }

    Básicamente así se usaría algo en 3 capas.  A veces el repositorio estará en la capa de negocio, a veces en la capa de datos.  Depende de la habilidad y capacidad de abstracción de cada programador, al igual que los requerimientos del proyecto.


    Jose R. MCP
    Code Samples


    martes, 13 de marzo de 2018 23:15
    Moderador
  • Con independencia de las capas que tenga tu proyecto, el método 'MostrarDatos' debería retornar una instancia de la clase Producto (o algún nombre similar) con los datos que esperas, por lo que bastaría asignar, a cada cuadro de texto, las propiedades según correspondan, por ejemplo:

    Producto p = MostrarDatos(params);
    
    textBox1.Text = p.Codigo;
    textBox2.Text = p.Nombre;


    martes, 13 de marzo de 2018 23:25
  • En la capa de negociación tengo algo así:

            public string MostrarDetalles(int Numero)
            {
                dtAbono Num = new dtAbono();
                return Num.Mostrar_Detalles(Numero);

            }

    En la capa de datos algo así:

            public string MostrarDetalles(int Num)
            {
                DbProviderFactory Factory = DbProviderFactories.GetFactory(Conexion._proveedor);
                DbCommand comando = datosgenericos.crearcomando();
                comando.CommandText = "MostrarDetalles";
                comando.CommandType = CommandType.StoredProcedure;

                DbParameter Numer = Factory.CreateParameter();
                Numer.ParameterName = "@Numero";
                Numer.Value = Num;
                comando.Parameters.Add(Numer);

                try
                {

                    return datosgenericos.valor_string(comando);


                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    donde valor_string: 

    public static string valor_string(DbCommand command)
            {
                string valor = "";
                try
                {
                    command.Connection.Open();
                    valor = command.ExecuteScalar().ToString();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    command.Connection.Close();
                }
                return valor;
            }

    miércoles, 14 de marzo de 2018 0:03
  • En la capa de negociación tengo algo así:

            public string MostrarDetalles(int Numero)
            {
                dtAbono Num = new dtAbono();
                return Num.Mostrar_Detalles(Numero);

            }

    En la capa de datos algo así:

            public string MostrarDetalles(int Num)
            {
                DbProviderFactory Factory = DbProviderFactories.GetFactory(Conexion._proveedor);
                DbCommand comando = datosgenericos.crearcomando();
                comando.CommandText = "MostrarDetalles";
                comando.CommandType = CommandType.StoredProcedure;

                DbParameter Numer = Factory.CreateParameter();
                Numer.ParameterName = "@Numero";
                Numer.Value = Num;
                comando.Parameters.Add(Numer);

                try
                {

                    return datosgenericos.valor_string(comando);


                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    donde valor_string: 

    public static string valor_string(DbCommand command)
            {
                string valor = "";
                try
                {
                    command.Connection.Open();
                    valor = command.ExecuteScalar().ToString();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    command.Connection.Close();
                }
                return valor;
            }

    miércoles, 14 de marzo de 2018 0:04
  • En la capa de negociación tengo algo así:

            public string MostrarDetalles(int Numero)
            {
                dtAbono Num = new dtAbono();
                return Num.Mostrar_Detalles(Numero);

            }

    En la capa de datos algo así:

            public string MostrarDetalles(int Num)
            {
                DbProviderFactory Factory = DbProviderFactories.GetFactory(Conexion._proveedor);
                DbCommand comando = datosgenericos.crearcomando();
                comando.CommandText = "MostrarDetalles";
                comando.CommandType = CommandType.StoredProcedure;

                DbParameter Numer = Factory.CreateParameter();
                Numer.ParameterName = "@Numero";
                Numer.Value = Num;
                comando.Parameters.Add(Numer);

                try
                {

                    return datosgenericos.valor_string(comando);


                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    donde valor_string: 

    public static string valor_string(DbCommand command)
            {
                string valor = "";
                try
                {
                    command.Connection.Open();
                    valor = command.ExecuteScalar().ToString();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    command.Connection.Close();
                }
                return valor;
            }

    EN LA CAPA DE DATOS, TENGO ALGO HASTA AHÍ:

    Negocio detalle = new Negocio ();
                int NumeroEntero = Convert.ToInt32(txtNumero.Text);

                Tabla1 C = new Tabla1();
                Tabla2 C2 = new Tabla2();

                C.Nombres = txtNombres.Text;
                C.Apellidos = txtApellidos.Text;
                C.Cedula = txtCedula.Text;
                C.Direccion_Casa = txtCasa.Text;
                C.Direccion_Casa = txtTrabajo.Text;
                C.Telefono = Convert.ToInt32(txtTelefono.Text);
                C2.Numero = Convert.ToInt32(txtNumero.Text);

                detalle.MostrarDetalles(NumeroEntero );


    miércoles, 14 de marzo de 2018 0:37
  • El método 'MostrarDetalles()' retorna un tipo string, un valor escalar, ¿qué es lo que deseas retornar a tres cajas de texto?.

    Hubiese imaginado que ocupas la clase SqlDataReader porque al inicio mencionas el uso del método ExecuteReader(), pero en el código adjunto no veo nada de ello, sólo veo el método ExecuteScalar(), que sólo retorna un valor escalar y no todas las columnas de la consulta de selección, tal como al parecer es lo que esperas que suceda.

    Te sugiero leer una serie de artículos escritos por Leandro T. [N-Tier] – Desarrollo en capas - Ejemplo Facturación – Parte 1

     

    miércoles, 14 de marzo de 2018 5:26
  • El ejemplo que me muestras es para devolver datos a un datagridview con un id, pero yo no necesito a una datagridview, sino directamente a las cajas de textos...

    Busco con un ID y luego los demás valores a las cajas de textos....

    viernes, 16 de marzo de 2018 21:15
  • NADIE PUDO???!!!

    Ni modo, tuve que hacerlo con datatable a otro formulario y devolver los datos a las cajas de texto. No era eso lo que quería, pero creo que fue lo mejor.

    GRACIAS A TODOS... SALUDOS FRATERNOS

    sábado, 17 de marzo de 2018 4:17
  • Ok, vamos a ordenarnos para responder su pregunta.

    Dice que quiere proveer un dato y obtener varios.  Estos "varios", ¿son en la forma de múltiples filas, o en la forma de múltiples columnas?  Muéstreme el SQL de la consulta.


    Jose R. MCP
    Code Samples

    sábado, 17 de marzo de 2018 15:47
    Moderador