Como trabajar con Procedimientos Almacenados

Hace tiempo no escribía nada, hoy revisando los foros me encontré que siempre existe ese gran problema de manejar procedimientos almacenados desde .NET… humm en realidad no es un gran problema, es muy simple y es por esto mismo que hice estos códigos de ejemplo, para que vean como pueden hacerlo. Espero les sirva a quienes recién se inician.


1.       Ejecutando un Simple Procedimiento Almacenado


Para esto antes que nada debemos tener un SP (Stored Procedure) creado


CREATE PROCEDURE spEjecutar


AS


BEGIN


 


       /* Mi Codigo */


 


END   


GO


Para llamar o ejecutar este SP en .NET solo necesitamos el siguiente código:


Dim objCommand As New SqlClient.SqlCommand(“spEjecutar”), _


    Conexion As String = “server=’SERVIDOR’; user id=’usuario’; password=’miclave’; database=’MiBaseDatos’”


 


objCommand.CommandType = CommandType.StoredProcedure


objCommand.Connection = New SqlClient.SqlConnection(Conexion)


objCommand.Connection.Open()


objCommand.ExecuteNonQuery()


objCommand.Connection.Close()


 


Ups… pero esté ejemplo es muy simple…  veamos uno con parámetros y con devolución de datos.



2.       Ejecutando un SP con parámetros que devuelva un conjunto de datos


Aquí tenemos dos opciones, dejar este conjunto de datos en un objeto SqlDataReader o un SqlDataAdapter, la diferencia principalmente es que SqlDataReader es que solo se puede leer hacia adelante y está conectada con la base de datos, en cambio SqlDataAdapter sirve para intercambiar datos entre la Base de Datos y un conjunto de datos (DataSet o DataTable)


Antes que nada creemos un Procedimiento Almacenado que reciba un parámetro y devuelva un conjunto de datos.


CREATE PROCEDURE spEjecutar


       @Codigo VARCHAR(10)


AS


BEGIN


 


       SELECT Codigo, Nombre


       FROM Tabla


       WHERE Codigo = @Codigo


 


END   


GO


 


Para llamar este SP desde .NET a un SqlDataReader


Dim objCommand As New SqlClient.SqlCommand(“spEjecutar”), _


    Conexion As String = “server=’SERVIDOR’; user id=’usuario’; password=’miclave’; database=’MiBaseDatos’”


 


objCommand.CommandType = CommandType.StoredProcedure


 


objCommand.Parameters.Add(“@Codigo”, SqlDbType.VarChar, 10)


objCommand.Parameters(“@Codigo”).Value = “Mi Código”


 


objCommand.Connection = New SqlClient.SqlConnection(Conexion)


objCommand.Connection.Open()


 


Dim objReader As SqlDataReader = objCommand.ExecuteReader()


 


While objReader.Read()


      Response.Write(objReader.Item(“Codigo”).ToString() & “-” & _


                    objReader.Item(“Nombre”).ToString() & “<br>”)


End While


 


objReader.Close()


objCommand.Connection.Close()



Para llamar este SP desde .NET a un SqlDataAdapter a un DataSet



Dim objCommand As New SqlClient.SqlCommand(“spEjecutar”), _


    Conexion As String = “server=’SERVIDOR’; user id=’usuario’; password=’miclave’; database=’MiBaseDatos’”


 


objCommand.CommandType = CommandType.StoredProcedure


 


objCommand.Parameters.Add(“@Codigo”, SqlDbType.VarChar, 10)


objCommand.Parameters(“@Codigo”).Value = “Mi Código”


 


objCommand.Connection = New SqlClient.SqlConnection(Conexion)


objCommand.Connection.Open()


 


Dim objAdapter As New SqlDataAdapter(objCommand), _


    objDataSet As New DataSet


 


objAdapter.Fill(objDataSet, “Tabla”)


 


objCommand.Connection.Close()


 


Dim objRow As DataRow


For Each objRow In objDataSet.Tables(“Tabla”).Rows


    Response.Write(objRow.Item(“Codigo”).ToString() & “-” & _


                  objRow.Item(“Nombre”).ToString() & “<br>”)


Next


 


Para llamar este SP desde .NET a un SqlDataAdapter a un DataTable


Dim objCommand As New SqlClient.SqlCommand(“spEjecutar”), _


    Conexion As String = “server=’SERVIDOR’; user id=’usuario’; password=’miclave’; database=’MiBaseDatos’”


 


objCommand.CommandType = CommandType.StoredProcedure


 


objCommand.Parameters.Add(“@Codigo”, SqlDbType.VarChar, 10)


objCommand.Parameters(“@Codigo”).Value = “Mi Código”


 


objCommand.Connection = New SqlClient.SqlConnection(Conexion)


objCommand.Connection.Open()


 


Dim objAdapter As New SqlDataAdapter(objCommand), _


    objDataTable As New DataTable


 


objAdapter.Fill(objDataTable)


 


objCommand.Connection.Close()


 


Dim objRow As DataRow


For Each objRow In objDataTable.Rows


    Response.Write(objRow.Item(“Codigo”).ToString() & “-” & _


                  objRow.Item(“Nombre”).ToString() & “<br>”)


Next


 



3.       Ejecutando un SP con parámetros que devuelva un parámetro de Salida.


Para este caso tenemos el siguiente Procedimiento Almacenado con 2 parámetros uno de entrada y otro de salida.


CREATE PROCEDURE spEjecutar


       @Codigo VARCHAR(10),


       @Nombre VARCHAR(100) OUT


AS


BEGIN


 


       SELECT @Nombre = Nombre


       FROM Tabla


       WHERE Codigo = @Codigo


      


END   


GO


 


Para llamar este SP y obtener el resultado en el parámetro de salida desde .NET se debe realizar lo siguiente:


Dim objCommand As New SqlClient.SqlCommand(“spEjecutar”), _


    Conexion As String = “server=’SERVIDOR’; user id=’usuario’; password=’miclave’; database=’MiBaseDatos’”


 


objCommand.CommandType = CommandType.StoredProcedure


 


objCommand.Parameters.Add(“@Codigo”, SqlDbType.VarChar, 10)


objCommand.Parameters(“@Codigo”).Value = “Mi Código”


 


objCommand.Parameters.Add(“@Nombre”, SqlDbType.VarChar, 100)


objCommand.Parameters(“@Nombre”).Direction = ParameterDirection.Output


 


objCommand.Connection = New SqlClient.SqlConnection(Conexion)


objCommand.Connection.Open()


objCommand.ExecuteScalar()


 


Response.Write(“El Nombre es: “ & objCommand.Parameters(“@Nombre”).Value)


objCommand.Connection.Close()


 


 


Espero les sea de utilidad, no es tan complejo… pero estoy seguro que será de ayuda para los novatos o no tan novatos.


Saludos,
Jhonny Vargas
Santiago de Chile


 

27 thoughts on “Como trabajar con Procedimientos Almacenados”

  1. Desde Costa Rica. Muchas Gracias por la información necesitaba un ejemplo como este sobre Procedimientos Almacenados en relación a la Devolución de Datos.
    Gracias me sirvio mucho.

  2. Me alegro muchisimo que te haya servido.

    Cualquier cosa me cuentas, gracias por tus comentarios.

    Saludos desde Chile!
    Jhonny Vargas P.

  3. Buenísimo. Espero encontrar la forma de llamar un procedimiento que me devuelva dos recordset. En asp se usa el método nextrecordset pero en asp.net no tengo ni idea de cual es.

    Seguiré buscando. Muchas gracias Jhonny!

  4. He logrado hacerlo funcionar usando tu ejemplo y el método:

    objReader.NextResult()

    No se si será la mejor forma, pero funcionar funciona de maravilla. De todas formas voy a probar con un DataSet, tal y como indicas.

    Gracias Jhonny.

  5. hola,muy buena tu explicaion,yo recien me inicio en sql, y si quiero insertar, actualizar y elminar llamando a preocedimientos almacenados se puede?, pero ahi tambien seria con tablas temporales, muchas gracias

  6. El response se refiere que el ejemplo fue realizado para una aplicación web, en donde el Response.Write envía datos hacia el explorador web.

    Pero te sirve para cualquier ambiente, solo considera como leer la información correctamente. Para windows puedes usar un Msgbox perfectamente.

  7. capaz q nada q ver la pregunta pero bueno. tengo un cronometro en excel funcionando y todo lo que necesito es algun box que al poner un numero me registre el tiempo y me traiga los datos de otra planilla. no se si se entiende, se podra hacer? gracias

  8. Holan sabes nunca he visto una explicacion mas clara gracias espero que sigas ayudando a la comunidad de la website gracias amigo Jhonny Vargas

  9. Tengo un SP que devuelve un recordset y un parámetro de salida al mismo tiempo. al referenciar el parámetro de salida, no me muestra valor si no he cerrado el recordset primero, en cuyo caso no puedo referenciar los valores del recordset… ¿Como puedo referenciar al parámetro de salida antes de cerrar el recordset?

  10. tengo el siguiente codigo el problema que tengo es como hago para enviar al store procedure un el parametro @codigoCliente que es una variable ej;
    Producto.aspx.cs
    SqlConnection cnn = new SqlConnection(“Data Source=SEBASTIAN-PC;Initial Catalog=Datos;User Id=sa;Password=camilandia;”);
    string codigoCliente;

    protected void Page_Load(object sender, EventArgs e)
    {
    codigoCliente = Request.QueryString["idCliente"];
    if (!IsPostBack)
    {
    CargarProductos();
    }
    }

    private void CargarProductos()
    {
    SqlCommand cmd = new SqlCommand(“ConsultarProductos”);

    cmd.CommandText = “ConsultarProductos”;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Connection = cnn;

    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand=cmd;
    SqlParameter pa = new SqlParameter(“@codigoCliente”, SqlDbType.Int);
    pa.Direction = ParameterDirection.Input;
    cmd.Parameters.Add(pa);
    cmd.Parameters.Add(“@codigoCliente”, SqlDbType.Int);

    DataSet dsProductos = new DataSet();
    da.Fill(dsProductos, “Productos”);
    dgvDatos.DataSource = dsProductos;
    dgvDatos.DataMember = “Productos”;
    dgvDatos.DataBind();

    }

    Y EL STORE PROCEDURE ES:
    ALTER PROCEDURE [dbo].[ConsultarProductos]
    – Add the parameters for the stored procedure here
    @codigoCliente int = ’1′,
    @CodProducto int = null,
    @NomProducto nvarchar(100) = null,
    @CodCliente int = null

    AS
    BEGIN
    – SET NOCOUNT ON added to prevent extra result sets from
    – interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @sql as varchar(5000)
    — Insert statements for procedure here
    set @sql=’
    SELECT p.CodProducto,
    p.NomProducto,
    p.CodCliente
    from dbo.Producto p
    where p.CodCliente=@codigoCliente’
    PERO ME GENERA ERROR EN EL STORE PROCEDURE

  11. estimado, estos ejemplos son muy buenos, directo al grano na de wea. lo felicito, yo trabajo en vb6.0 y estoy migrando a net. siempre he buscado ejemplos pa cachar el mote de net. pero con estos me dejaste clarito. saco chela pa la noche.

    agradecido desde antofagasta.

  12. felicidades saco chela con la explicacion. ejemplos de este tiop he buswcado pero los gringos son muy cuadrados

  13. Viejo una duda, no puedo programar los procedimientos almacenados para que sean consumidos a travez de webservices , si tienes un ejemplo que no puedo asignarle la funcionalidad despues en la pagina en el aspx me sale error de soap de serializacion con el datatable, eso xfa, Saludos

  14. Buen dia, tengo una pregunta con respecto a la aplicacion con parametros de salida,estoy trabajando en c#, tengo este codigo :
    cadena.Open();
    SqlCommand cmd = new SqlCommand(“spEjecutar”, cadena);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add(“@nombre”, SqlDbType.NChar, 10);
    cmd.Parameters["@nombre"].Value = TextBox1.Text;

    cmd.Parameters.Add(“@id”, SqlDbType.Int);
    cmd.Parameters["@id"].Direction = ParameterDirection.Output;

    cmd.ExecuteNonQuery();

    // Response.Write(“El Nombre es: ” & objCommand.Parameters(“@Nombre”).Value)
    Response.Write(“El id es :” + cmd.Parameters["@id"].Value);
    cadena.Close();

    Lamentablemente no m devuelve el parametro de salida en este caso es el codigo:
    solo devuelve “el id es :”……

    De antemano muxas gracias

  15. Necesito crear un Procedimiento Almacenado que pueda ser creado y ejecutado desde un comando de un formulario en vb.net.
    (es decir, sin crearlo directamente en Analizador de Consultas de SQL Server 2000)

    He creado un proyecto en visual studio y he intentado crearlo desde el adaptador de datos pero me crea el select y el insert pero no me permite uptate y delete, además no ejecuta la claúsula DISABLE TRIGGER ALL.

    A continuación le trancribo lo que en lugar de crear directamente en SQL SERVER lo quiero crear programáticamente en un protecto de visual studio:

    ——————————–

    CREATE PROCEDURE dbo.detalle_recepcion_serv_producto AS

    BEGIN

    ALTER TABLE [dbo].[detalle_recepcion] DISABLE TRIGGER ALL

    SELECT Id_Recepcion, Id_Almacen, Ano_Recepcion, Producto_oServicio
    FROM detalle_recepcion

    WHERE (Id_Almacen = ’19056′) AND
    (Id_Recepcion = 31) AND
    (Ano_Recepcion = 2012)

    update [dbo].[detalle_recepcion]
    set Producto_oServicio = 1
    FROM detalle_recepcion
    WHERE (Id_Almacen = ’19056′) AND
    (Id_Recepcion = 31) AND
    (Ano_Recepcion = 2012)

    ALTER TABLE [dbo].[detalle_recepcion] ENABLE TRIGGER ALL

    end

    ——————————

    Gracias,

    Saludos,

    Rene

  16. Crear un Procedimiento Almacenado desde VBNET

    Necesito crear un Procedimiento Almacenado que pueda ser creado y ejecutado desde un comando de un

    formulario en vb.net.
    (es decir, sin crearlo directamente en Analizador de Consultas de SQL Server 2000)

    He creado un proyecto en visual studio y he intentado crearlo desde el adaptador de datos pero me crea el

    select y el insert pero no me permite uptate y delete, además no ejecuta la claúsula DISABLE TRIGGER ALL.

    A continuación le trancribo lo que en lugar de crear directamente en SQL SERVER lo quiero crear

    programáticamente en un protecto de visual studio:

    ——————————–

    CREATE PROCEDURE dbo.detalle_recepcion_serv_producto AS

    BEGIN

    ALTER TABLE [dbo].[detalle_recepcion] DISABLE TRIGGER ALL

    SELECT Id_Recepcion, Id_Almacen, Ano_Recepcion, Producto_oServicio
    FROM detalle_recepcion

    WHERE (Id_Almacen = ’19056′) AND
    (Id_Recepcion = 31) AND
    (Ano_Recepcion = 2012)

    update [dbo].[detalle_recepcion]
    set Producto_oServicio = 1
    FROM detalle_recepcion
    WHERE (Id_Almacen = ’19056′) AND
    (Id_Recepcion = 31) AND
    (Ano_Recepcion = 2012)

    ALTER TABLE [dbo].[detalle_recepcion] ENABLE TRIGGER ALL

    end

    ——————————

    Gracias,

    Saludos,

    Rene

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>