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

 

Comments

# re: Como trabajar con Procedimientos Almacenados

Monday, October 27, 2008 8:44 PM by Rodrigo Monge

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.

# re: Como trabajar con Procedimientos Almacenados

Tuesday, October 28, 2008 10:15 AM by jvargas

Me alegro muchisimo que te haya servido.

Cualquier cosa me cuentas, gracias por tus comentarios.

Saludos desde Chile!

Jhonny Vargas P.

# re: Como trabajar con Procedimientos Almacenados

Wednesday, November 05, 2008 1:21 PM by wikiheavy

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!

# re: Como trabajar con Procedimientos Almacenados

Wednesday, November 05, 2008 1:49 PM by jvargas

Debes usar un DataSet... en donde cada SELECT del SP te queda en un Datatable.

# re: Como trabajar con Procedimientos Almacenados

Thursday, November 06, 2008 7:07 AM by wikiheavy

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.

# re: Como trabajar con Procedimientos Almacenados

Sunday, November 09, 2008 12:03 PM by Orlando

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

# re: Como trabajar con Procedimientos Almacenados

Wednesday, December 03, 2008 7:24 PM by Silvio

Hola, tu ejemplo esta muy bien pero ese response a que se refiere?

# re: Como trabajar con Procedimientos Almacenados

Wednesday, December 03, 2008 7:33 PM by jvargas

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.

# re: Como trabajar con Procedimientos Almacenados

Thursday, January 22, 2009 9:01 PM by christian

funciona con una base de daos Informix

Leave a Comment

(required) 
(required) 
(optional)
(required)