none
Ejecutar store procedure de Sql desde C# RRS feed

  • Pregunta

  • Buenas tengo una pregunta, tengo un programa en c# que tiene un form con un grid que va a ser llenado con datos de un Store Procedure, me gustaria saber como hacer para ejecutar ese Store Procedure desde el un metodo  que esta en una clase externa del form y ese metodo llamarlo desde un evento click de un boton que se encuentra en el form!!!

    sábado, 13 de octubre de 2012 18:40

Respuestas

  • hola

    lo haces igual que lo harias con una query simple escrita por ti en un string, solo que le defines la linea

    cmd.CommandType = CommandType.StoredProcedure;

    para indciar al command que es un procedure

    using(SqlConnection cn = new SqlConnection("connection string"))
    {
        cn.Open();
             
        SqlCommand cmd= new SqlCommand("NombreStoreProcedure", cn);
        cmd.CommandType = CommandType.StoredProcedure;
    	
        cmd.Parameters.AddWithValue("@param", Convert.ToInt32(Textbox1.Text));
    
        SqlDataReader dr = cmd.ExecuteReader();
    
        if(dr.Read())
        {
           //aqui cargas la lista
        }
    }

    el ejemplo completo esta aqui

    [WinForms] Edición Empleados

    solo le pones la invocacion al procedure

    salidos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 14 de octubre de 2012 21:01
  • Asumiendo una clase llamada DB que representa el acceso a la base de datos, y asumiendo otra clase llamada Entidad que es el tipo de objeto consumido por la grilla, yo haría algo como:

    public class Entidad
    {
        //Listar las propiedades de la entidad aquí.
        public int ID { get; set; }
        public ....
    }
    
    //En el mismo proyecto o en un proyecto de biblioteca DLL:
    public static class DB
    {
        private static SqlConnection NewDBConnection()
        {
            SqlConnection conn = SqlConnection("<cadena de conexión aquí>");
            conn.Open();
            return conn;
        }
        public static List<Entidad> GetAll()
        {
            using (SqlConnection conn = NewDBConnection())
            {
                using (SqlCommand cmd = new SqlCommand("spNombreDelSPAquí", conn))
                {
                    //Agregar cualquier parámetro requerido, si es el caso:
                    cmd.Parameters.Add(...);
                    using (SqlDataReader r = cmd.ExecuteReader())
                    {
                        List<Entidad> entidades = new List<Entidad>();
                        while (r.Read())
                        {
                            entidades.Add( new Entidad()
                            {
                                //Asignar los valores de las propiedades:
                                ID = (int)r["ID"]
                                , ...
                            }
                        }
                        return entidades;
                    }
                }
            }
        }
    }

    Ahora simplemente llena la grilla con el método estático GetAll() de la clase DB.  ¿Está más claro?


    Jose R. MCP
    Code Samples

    sábado, 13 de octubre de 2012 20:17
    Moderador

Todas las respuestas

  • No sé qué es lo que se le complica:  Si la sintaxis de llamar un método ajeno al formulario o el código en sí de cómo consultar el SP.  Asumiré el primero.

    Es bien sencillo.  Usted lo hace todo el tiempo con clases de .Net.  Thread.Sleep() es una llamada al método estático Sleep() de la clase externa System.Threading.Thread; miLista.Clear() donde miLista es una variable de tipo List<> es una llamada al método no estático de la clase externa System.Collections.Generic.List<T>, etc.

    Si usted tiene una clase llamada algo así como DBEngine y en ella un método público estático llamado algo como DatosGrilla, entonces desde el formulario usted llama a este método como DBEngine.DatosGrilla().  Si DatosGrilla() devuelve un resultado, como por ejemplo una lista de alguna clase particular, entonces List<alguna clase particular> losDatos = DBEngine.DatosGrilla();.


    Jose R. MCP
    Code Samples

    sábado, 13 de octubre de 2012 19:12
    Moderador
  • No entiendo la necesidad de llenar un datagridview desde un store procedure?, si lo puedes hacer deste tu aplicacion de varias formas la mas facil es via diseno, donde lo que haces seleccionando tu gridview

    1- Seleccionar la fechita que te aparece en el grid

    2- En elejir origen de datos desplega el combo que aparece

    3- Agregar origen de datos al proyecto

    4- siguiente

    5- elejes tu tabla e incluso puedes elejir el store procedure que ya tienes en tu base de datos

    Suerte!!


    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Proponer como respuesta"

    sábado, 13 de octubre de 2012 19:25
  • Lo siento J. Joaquín, pero eso es un muy mal consejo.  Esas facilidades son para el programador aficionado.  El programador profesional no suele hacer esas cosas.  Es mi opinión profesional que el acceso a datos se programa en una capa distinta a la capa gráfica.  Las facilidades como los SqlDataSource de ASP.net, los DataSet tipados, etc. son meras conveniencias para el programador inexperto.  Son puntos de venta de Visual Studio, básicamente.

    Por ejemplo, mi más reciente proyecto es una aplicación Web que consume datos de una DLL que es la capa de negocio.  La capa de negocio a su vez depende de una serie de contratos definidos en otra DLL que es la capa de definición de acceso a datos.  Esta capa únicamente define los contratos (interfases y algunas clases genéricas) que un proveedor de datos deberá de implementar.  Finalmente tengo otro DLL que es el proveedor de datos (la capa de datos) que es la que conecta a SQL Server y generaliza los datos según los contratos de la capa de definición de acceso a datos.  El resultado final:  Un proyecto que tiene la capacidad de cambiar la capa de datos completamente sin tocar una sola línea de código de la capa de negocio o la interfase web.  De hecho las fuentes de datos se configuran en web.config (o app.config si es una aplicación Windows Forms o WPF).

    Así que en resumen:  Sí, es fácil ligar un proyecto a una base de datos, pero profesionalmente hablando eso es dulce para el programador aficionado únicamente.


    Jose R. MCP
    Code Samples

    sábado, 13 de octubre de 2012 19:33
    Moderador
  • Lo que necesito es el acceso a datos!!! la cadena de conexion y la ejecucion de los sp

    el problema que tengo es que ya tengo un sp que que es un select de una tabla que con eso lleno el grid, otro sp que es un insert el cual desde c# se va ejecutar para agregar datos a la BD, y otro SP que es un delete, que desde C# se va ejecutar cuando presione el boton de eliminar lo que noc es como ponerlos a ejecutar desde el c# o como es el acceso a datos entiendes?

    sábado, 13 de octubre de 2012 20:00
  • Asumiendo una clase llamada DB que representa el acceso a la base de datos, y asumiendo otra clase llamada Entidad que es el tipo de objeto consumido por la grilla, yo haría algo como:

    public class Entidad
    {
        //Listar las propiedades de la entidad aquí.
        public int ID { get; set; }
        public ....
    }
    
    //En el mismo proyecto o en un proyecto de biblioteca DLL:
    public static class DB
    {
        private static SqlConnection NewDBConnection()
        {
            SqlConnection conn = SqlConnection("<cadena de conexión aquí>");
            conn.Open();
            return conn;
        }
        public static List<Entidad> GetAll()
        {
            using (SqlConnection conn = NewDBConnection())
            {
                using (SqlCommand cmd = new SqlCommand("spNombreDelSPAquí", conn))
                {
                    //Agregar cualquier parámetro requerido, si es el caso:
                    cmd.Parameters.Add(...);
                    using (SqlDataReader r = cmd.ExecuteReader())
                    {
                        List<Entidad> entidades = new List<Entidad>();
                        while (r.Read())
                        {
                            entidades.Add( new Entidad()
                            {
                                //Asignar los valores de las propiedades:
                                ID = (int)r["ID"]
                                , ...
                            }
                        }
                        return entidades;
                    }
                }
            }
        }
    }

    Ahora simplemente llena la grilla con el método estático GetAll() de la clase DB.  ¿Está más claro?


    Jose R. MCP
    Code Samples

    sábado, 13 de octubre de 2012 20:17
    Moderador
  • hola

    lo haces igual que lo harias con una query simple escrita por ti en un string, solo que le defines la linea

    cmd.CommandType = CommandType.StoredProcedure;

    para indciar al command que es un procedure

    using(SqlConnection cn = new SqlConnection("connection string"))
    {
        cn.Open();
             
        SqlCommand cmd= new SqlCommand("NombreStoreProcedure", cn);
        cmd.CommandType = CommandType.StoredProcedure;
    	
        cmd.Parameters.AddWithValue("@param", Convert.ToInt32(Textbox1.Text));
    
        SqlDataReader dr = cmd.ExecuteReader();
    
        if(dr.Read())
        {
           //aqui cargas la lista
        }
    }

    el ejemplo completo esta aqui

    [WinForms] Edición Empleados

    solo le pones la invocacion al procedure

    salidos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 14 de octubre de 2012 21:01