none
Llamar a SP select y colocarlo en un objeto RRS feed

  • Pregunta

  • Buenas, estoy teniendo un inconveniente con un metodo que es bastante comun pero la verdad que me hice un lio barbaro y no se como resolverlo. La cuestion es la siguiente, tengo el siguiente procedimiento almacenado

    Leer_Actividad

    @Codigo int

    as

    select Nombre, Profesor, Precio

    from Actividad

    where @Codigo = Codigo

    Bueno esto en teoria me devuelve una fila de mi tabla, ahora en el visual

    Este es mi metodo incompleto de la capa datos

     public Actividad Read(object id)
            {
                SqlDataReader reader;

                Actividad ac = new Actividad();
                comando.Connection = Conectar.Open();
                comando.CommandText = "Leer_Actividad";
                comando.Parameters.AddWithValue("Codigo", id);
                comando.CommandType = CommandType.StoredProcedure;
                reader = comando.ExecuteReader()

    Ahora aca esta el problema, no se como seguir. La idea es poner la fila extraida en un Datagrid de la capa de presentacion, no se si el error esta en tratar de meterlo en un objeto y deberia usar un datatable o algo por el estilo. Si hay puediese darme una mano se lo agradeceria infinitamente. Saludos!!!!

    viernes, 25 de octubre de 2019 13:20

Todas las respuestas

  • Hola, mira acá un ejemplo de cómo llamar a un SP. Retornas un DataTable con el resultado de la ejecución del procedimiento almacenado.

    public DataTable SPRalenti10Dias(string rut, string desde, string hasta)
            {
                SqlCommand sel = conectar.Comando();
                sel.CommandText = "SP_RALENTI10_PIVOT";
                sel.CommandType = CommandType.StoredProcedure;
                sel.CommandTimeout = 30000;
                sel.Parameters.AddWithValue("@PAR_RUT", rut);
                sel.Parameters.AddWithValue("@PAR_DESDE ", desde);
                sel.Parameters.AddWithValue("@PAR_HASTA", hasta);
                SqlDataAdapter adaptador = new SqlDataAdapter(sel);
                DataTable tabla = new DataTable();
                adaptador.Fill(tabla);
                return tabla;
            }

    y para asignar el resultado del SP a un dataGridView, por ejemplo, sería así.

    DataTable consulta = new Consultas().SPRalenti10Dias(rut, desde, hasta);
    if (consulta.Rows.Count > 0)
    {
    DataGridView.DataSource = consulta;
    }
    Saludos.


    viernes, 25 de octubre de 2019 13:29
  •  no se si el error esta en tratar de meterlo en un objeto y deberia usar un datatable

    No, no es un error. Puedes perfectamente usar un objeto si así lo deseas. En una respuesta anterior ya te han mostrado cómo usar un datatable. Aquí te muestro lo mismo con un objeto:

    public Actividad Read(object id)
    {
        Actividad ac = null;
        comando.Connection = Conectar.Open();
        comando.CommandText = "Leer_Actividad";
        comando.Parameters.AddWithValue("Codigo", id);
        comando.CommandType = CommandType.StoredProcedure;
        using (SqlDataReader reader = comando.ExecuteReader())
        {
            if (reader.Read())
            {
                ac = new Actividad();
                ac.Nombre = reader.GetString("Nombre");
                ac.Profesor = reader.GetString("Profesor");
                ac.Precio = reader.GetDecimal("Precio");
            }
        }
        // ¡¡¡No olvides cerrar la conexion!!! (dependerá de cómo hayas implementado "Conectar")
        return ac;
    }

    Tendrás que cambiar los nombres de campos para que coincidan con los tuyos (he supuesto que la clase Actividad tiene propiedades que se llaman igual que los campos devueltos por el SP), y comprobar los tipos de datos (he supuesto que Precio es Decimal, pero cámbialo conforme con lo que devuelva tu SP).

    Tal como está escrita la rutina, devuelve null si el registro no se encuentra. Recuerda poner un "if" en el sitio donde llames a esta rutina para contemplar ese caso.


    viernes, 25 de octubre de 2019 13:57
    Moderador