Uso de Procedimientos Almacenados PDF

También podría gustarte

Está en la página 1de 23

Invocar procedimientos almacenados

con Microsoft ADO.NET

NDICE
Descripcin

Leccin: descripcin de los procedimientos almacenados

Leccin: invocar procedimientos almacenados

Invocar procedimientos almacenados con Microsoft ADO.NET

Descripcin

Descripcin de los procedimientos almacenados

Invocar procedimientos almacenados

*****************************

Introduccin

Acceder y manipular datos directamente en una base de datos desde un


formulario Web Form puede constituir un uso muy ineficaz de los recursos, y
puede crear riesgos de seguridad. Una forma de mejorar la eficacia y seguridad
del acceso a las bases de datos es crear procedimientos almacenados en el
servidor de la base de datos, e invocar estos procedimientos almacenados desde
nuestro formulario Web Form. Acceder a una base de datos a travs de un
procedimiento almacenado limita el cdigo del formulario Web Form y el
ancho de banda de la red que debemos utilizar cuando realizamos tareas
complicadas. Acceder a una base de datos mediante un procedimiento
almacenado tambin protege la base de datos al limitar el acceso directo a la
base de datos a procedimientos almacenados locales y de confianza.
En este mdulo, estudiaremos cmo realizar las tareas de acceso a datos desde
las aplicaciones Web utilizando Microsoft ADO.NET para acceder a
procedimientos almacenados.

Objetivos

En este mdulo, aprenderemos a:

Explicar qu es un procedimiento almacenado y los motivos para utilizarlos


en el acceso a una base de datos.

Invocar procedimientos almacenados.

Invocar procedimientos almacenados con Microsoft ADO.NET

Leccin: descripcin de los procedimientos almacenados

Qu es un procedimiento almacenado?

Por qu utilizar procedimientos almacenados?

Prctica: seleccionar el procedimiento almacenado


correcto

*****************************

Introduccin

Una alternativa al acceso directo a bases de datos desde nuestra aplicacin Web
es invocar un procedimiento almacenado que acceder a la base de datos por
nosotros. El uso de procedimientos almacenados tiene varias ventajas respecto
al acceso directo a bases de datos, incluyendo la eficacia, seguridad y la
proteccin de la base de datos.
En esta leccin, aprenderemos qu es un procedimiento almacenado y los
motivos para invocar procedimientos almacenados cuando se accede a una base
de datos.

Objetivos de la leccin

En esta leccin, aprenderemos a:

Describir qu es un procedimiento almacenado.

Explicar los motivos para utilizar procedimientos almacenados para acceder


y manipular bases de datos.

Invocar procedimientos almacenados con Microsoft ADO.NET

Qu es un procedimiento almacenado?

Procedimientos comunes de datos que pueden ser


invocados por mltiples aplicaciones Web

Acceso programtico a una base de datos


z

Devolver registros

Devolver un valor

Realizar accin
Formulario
Web Form

Procedimiento
Procedimiento
almacenado
almacenado

Cliente
Cliente

Base datos
Servidor
ServidorWeb
Web

SQL
SQLServer
Server

*****************************

Introduccin

Un procedimiento almacenado es un procedimiento escrito por un desarrollador


de aplicaciones para bases de datos y que est asociado a una base de datos
especfica. A continuacin, otras aplicaciones Web pueden invocar estos
procedimientos almacenados para acceder y manipular datos de la base de
datos.

Acceso programtico a
una base de datos

Los procedimientos almacenados permiten el acceso a una base de datos


mediante la invocacin de un procedimiento existente en lugar de tener que
escribir nuestras propias instrucciones SQL. Los procedimientos almacenados
estn formados por secuencias de instrucciones Transact-SQL, y funcionan de
modo similar a los procedimientos de una aplicacin Web en cuanto a que las
instrucciones se invocan por su nombre, y pueden tener tanto parmetros de
entrada como de salida.
Los tres tipos de procedimientos almacenados son:

Procedimientos almacenados que devuelven registros


Los procedimientos almacenados que devuelven registros se utilizan para
encontrar registros especficos, clasificar y filtrar esos registros, y devolver
el resultado de las operaciones de bsqueda, clasificacin y filtrado a un
objeto DataSet o un control enlazado a lista. Estos procedimientos
almacenados se basan en instrucciones Select de SQL.
Un ejemplo de un procedimiento almacenado que devuelve registros es una
peticin de la cantidad, fecha y receptor de los tres ltimos movimientos
procesados en una cuenta bancaria. Estos datos podran cargarse en un
objeto DataSet para su posterior procesamiento, o mostrarse directamente al
usuario en un control ListBox.

Invocar procedimientos almacenados con Microsoft ADO.NET

Procedimientos almacenados que retornan un valor, tambin denominados


procedimientos almacenados escalares
Los procedimientos almacenados que retornan un valor se utilizan para
ejecutar un comando o funcin de la base de datos que devuelve un nico
valor. Debido a que slo se devuelve un valor, los procedimientos
almacenados que retornan un valor a menudo se utilizan en el cdigo y, a
continuacin, el resultado se muestra a los usuarios.
Un ejemplo de procedimiento almacenado que retorna un valor es devolver
el valor total de los tres ltimos movimientos que se han procesado en una
cuenta bancaria.

Los procedimientos almacenados de accin


Los procedimientos almacenados de accin se utilizan para realizar algunas
funciones en la base de datos, pero no devuelven un registro o un valor.
Estas funciones de la base de datos pueden incluir actualizar, editar o
modificar los datos.
Un ejemplo de un procedimiento almacenado de accin es una peticin para
actualizar una sola direccin de correo en la base de datos de clientes de una
compaa.

Invocar procedimientos almacenados con Microsoft ADO.NET

Por qu utilizar procedimientos almacenados?

Programacin modular

Distribucin del trabajo

Seguridad de la base de datos

Ejecucin ms rpida

Reduce el trfico de red

Proporciona flexibilidad

*****************************

Introduccin

Es ms fcil, ms eficaz y ms seguro utilizar un procedimiento almacenado


que escribir el cdigo requerido para conectarnos directamente a una base de
datos y ejecutar nuestras propias instrucciones Transact-SQL. Invocar un
procedimiento almacenado no requiere que entendamos cmo est diseada la
base de datos, y slo se accede a la base de datos mediante un procedimiento ya
probado.

Programacin modular

Los procedimientos almacenados son ejemplos clsicos de programacin


modular. Creamos el procedimiento una vez, lo probamos una vez, lo
almacenamos en el servidor de la base de datos, y lo invocamos varias veces
desde mltiples aplicaciones. Las actualizaciones o cambios a la base de datos
permanecen ocultas para todas las aplicaciones que acceden mediante el
procedimiento almacenado.

Distribucin del trabajo

Un desarrollador especialista en la programacin de bases de datos puede crear


los procedimientos almacenados, mientras que otros desarrolladores pueden
crear paralelamente las aplicaciones Web que utilizarn el procedimiento
almacenado. Esta distribucin del trabajo permite que cada desarrollador se
concentre en su propia especialidad, y cumpla con sus propios plazos.

Incremento de la
seguridad de la base de
datos

El uso de procedimientos almacenados proporciona una mayor seguridad para


una base de datos al limitar el acceso directo. nicamente acceden directamente
a la base de datos los procedimientos almacenados probados que han sido
desarrollados por el propietario de la base de datos. Debido a que las dems
aplicaciones Web y otros desarrolladores no acceden directamente a la base de
datos, el riesgo de dao accidental de la estructura o el contenido de la base de
datos es mnimo.
Utilizar instrucciones SQL o Transact-SQL directamente en el cdigo
Microsoft ASP.NET tambin supone un riesgo para la seguridad ya que las
instrucciones pueden dar informacin a un hacker sobre la base de datos y su
estructura. Adems, con el acceso directo a una base de datos, tambin tenemos
el problema de seguridad al intentar determinar qu clase de permisos
deberamos dar a la cuenta de usuario Web sobre las tablas individuales.

Invocar procedimientos almacenados con Microsoft ADO.NET

Ejecucin ms rpida

Si un procedimiento requiere una gran cantidad de cdigo Transact-SQL o si se


invoca repetidamente, el uso de procedimientos almacenados puede dar lugar a
una mayor rapidez de ejecucin que acceder directamente a la base de datos con
cdigo Transact-SQL. Los procedimientos almacenados son parseados y
optimizados cuando se crean, y puede utilizarse una versin en memoria del
procedimiento tras su primera ejecucin.
El acceso directo mediante instrucciones Transact-SQL requiere que las
instrucciones sean enviadas desde el cliente cada vez que se ejecutan. Las
instrucciones son compiladas y optimizadas cada vez que son ejecutadas por el
servidor de la base de datos.

Reduccin del trfico de


red

En ocasiones, una operacin que requiere cientos de lneas de cdigo TransactSQL puede realizarse mediante una nica instruccin que invoque un
procedimiento almacenado. Enviar una llamada a travs de la red, en lugar de
cientos de lneas de cdigo, reduce el trfico de red.

Proporciona flexibilidad

Si el acceso a la base de datos se realiza a travs de procedimientos


almacenados, el desarrollador de la base de datos puede cambiar la estructura
de la base de datos sin romper las aplicaciones Web que los utilizan. Esta
proteccin permite la continua mejora de la base de datos sin poner en riesgo el
resto del sistema.

Invocar procedimientos almacenados con Microsoft ADO.NET

Prctica: seleccionar el procedimiento almacenado correcto

Los estudiantes:
z

Decidirn, en determinados escenarios,


qu tipo de procedimiento almacenado
debe utilizarse

Tiempo: 5 Minutos

*****************************

Leer los siguientes escenarios y decidir qu tipo de procedimientos


almacenados debera utilizarse:

Devolver registros

Devolver valor

Realizar accin
Debemos determinar los 10 mejores best sellers de la compaa.
____________________________________________________________
____________________________________________________________
Debemos determinar el beneficio neto de un determinado trimestre.
____________________________________________________________
____________________________________________________________
Debemos cambiar todos los prefijos telefnicos 425 de Estados Unidos por
el prefijo 415.
____________________________________________________________
____________________________________________________________

Invocar procedimientos almacenados con Microsoft ADO.NET

Debemos determinar qu registros tienen el prefijo telefnico 425 de


Estados Unidos.
_____________________________________________________________
_____________________________________________________________
Debemos eliminar todos los elementos que se han dejado de fabricar de una
determinada categora.
_____________________________________________________________
_____________________________________________________________

Invocar procedimientos almacenados con Microsoft ADO.NET

Leccin: invocar procedimientos almacenados

Invocar procedimientos almacenados

Demostracin: invocar un procedimiento almacenado

Prctica: mostrar datos de un procedimiento


almacenado

Utilizar parmetros

Pasar parmetros de entrada

Utilizar parmetros de salida

Demostracin: pasar parmetros

*****************************

Introduccin

Antes de poder invocar un procedimiento almacenado, debemos identificar el


nombre del procedimiento y los parmetros que utiliza. Una vez identificado el
procedimiento almacenado, podemos invocarlo, pasarle los parmetros de
entrada que se requieran para procesar nuestra peticin y gestionar los
parmetros de salida incluidos en la respuesta.
En esta leccin, aprenderemos cmo invocar procedimientos almacenados,
pasar parmetros de entrada y gestionar parmetros de salida.

Objetivos de la leccin

En esta leccin, aprenderemos a:

Invocar un procedimiento almacenado desde un formulario Web Form.

Identificar el tipo de parmetros disponibles cuando se invocan los


procedimientos almacenados.

Pasar parmetros de entrada cuando se invocan procedimientos


almacenados desde un formulario Web Form.

Utilizar los parmetros de salida de un procedimiento almacenado.

10

Invocar procedimientos almacenados con Microsoft ADO.NET

Invocar procedimientos almacenados

Identificar el procedimiento almacenado

Configurar la propiedad SelectCommand del DataAdapter

Dim
Dim daCategory
daCategory As
As New
New SqlDataAdapter()
SqlDataAdapter()
daCategory.SelectCommand
daCategory.SelectCommand == New
New SqlCommand()
SqlCommand()
daCategory.SelectCommand.Connection
daCategory.SelectCommand.Connection == conn
conn
daCategory.SelectCommand.CommandText
daCategory.SelectCommand.CommandText == "ProductCategoryList"
"ProductCategoryList"
daCategory.SelectCommand.CommandType
daCategory.SelectCommand.CommandType == CommandType.StoredProcedure
CommandType.StoredProcedure
SqlDataAdapter
SqlDataAdapter daCategory
daCategory == new
new SqlDataAdapter();
SqlDataAdapter();
daCategory.SelectCommand
daCategory.SelectCommand == new
new SqlCommand();
SqlCommand();
daCategory.SelectCommand.Connection
daCategory.SelectCommand.Connection == conn;
conn;
daCategory.SelectCommand.CommandText
daCategory.SelectCommand.CommandText == "ProductCategoryList";
"ProductCategoryList";
daCategory.SelectCommand.CommandType
daCategory.SelectCommand.CommandType == CommandType.StoredProcedure;
CommandType.StoredProcedure;

Ejecutar el procedimiento almacenado y almacenar los


registros devueltos
daCategory.Fill(ds,
daCategory.Fill(ds, "Categories")
"Categories")
daCategory.Fill(ds,
daCategory.Fill(ds, "Categories");
"Categories");

*****************************

Introduccin

Para invocar un procedimiento almacenado, en primer lugar debemos


identificarlo, crear un objeto DataAdapter, y configurar el objeto
DataAdapter para que apunte a la conexin de la base de datos. Seguidamente,
establecer la propiedad CommandText al nombre del procedimiento
almacenado identificado y, finalmente, establecer la propiedad CommandType
en CommandType.StoredProcedure.

Identificar el
procedimiento
almacenado

El primer paso para utilizar un procedimiento almacenado es identificar el tipo


y el nombre del mismo. Podemos utilizar un objeto DataAdapter o un objeto
DataReader para invocar los tres tipos de procedimientos almacenados. El
mtodo que invoquemos para ejecutar el procedimiento almacenado variar
dependiendo del tipo de procedimiento almacenado que invoquemos:

Procedimientos almacenados que devuelven registros


Cuando invocamos un procedimiento que devuelve un conjunto de registros,
necesitamos almacenar ese conjunto de registros en un DataSet, o
directamente en un control enlazado a lista utilizando un DataReader. Si
deseamos utilizar un DataSet, debemos utilizar un DataAdapter y el
mtodo Fill. Si deseamos utilizar un DataReader, debemos utilizar un
objeto Command y el mtodo ExecuteReader, y vincular el registro
devuelto al control enlazado a lista.

Procedimientos almacenados que retornan un valor


Cuando invocamos un procedimiento almacenado que devuelve un valor,
invocamos el mtodo ExecuteScalar del objeto Command, y guardamos el
resultado en una variable del tipo de datos apropiado.

Procedimientos almacenados que realizan una accin


Cuando invocamos un procedimiento almacenado que realiza alguna accin
en la base de datos pero no devuelve un conjunto de registros o un valor,
utilizamos el mtodo ExecuteNonQuery del objeto Command.

Invocar procedimientos almacenados con Microsoft ADO.NET

Establecer la propiedad
SelectCommand

Para configurar la llamada al procedimiento almacenado, debemos crear un


objeto SqlCommand y guardarlo como la propiedad SelectCommand de un
DataAdapter. A continuacin, debemos establecer las propiedades
Connection, CommandText y CommandType.
Podemos configurar visualmente la llamada a un procedimiento almacenado
utilizando las herramientas para procedimientos almacenados del Cuadro de
herramientas de Microsoft Visual Studio .NET, o podemos escribir
manualmente el cdigo para invocar el procedimiento almacenado. Los
siguientes ejemplos utilizan cdigo manual para mostrar tanto el cdigo
completo como el proceso lgico de invocacin de un procedimiento
almacenado.
Los siguientes ejemplos invocan el procedimiento almacenado
ProductCategoryList. El procedimiento almacenado ProductCategoryList
devuelve una lista de IDs y nombres de categoras de la tabla Categories:
Procedure ProductCategoryList
As
SELECT CategoryID,CategoryName
FROM Categories

El siguiente cdigo utiliza un objeto Connection y un objeto DataAdapter


para invocar el procedimiento almacenado que devuelve registros
ProductCategoryList:
Visual Basic .NET

Dim daCategory as New SqlDataAdapter()


daCategory.SelectCommand = New SqlCommand()
daCategory.SelectCommand.Connection = conn
daCategory.SelectCommand.CommandText = _
"ProductCategoryList"
daCategory.SelectCommand.CommandType = _
CommandType.StoredProcedure

C#

SqlDataAdapter daCategory = new SqlDataAdapter();


daCategory.SelectCommand = new SqlCommand();
daCategory.SelectCommand.Connection = conn;
daCategory.SelectCommand.CommandText =
"ProductCategoryList";
daCategory.SelectCommand.CommandType =
CommandType.StoredProcedure;

Nota Tambin podemos establecer directamente la conexin y el texto del


comando cuando creamos el objeto SqlDataAdapter. El siguiente cdigo
realiza la misma tarea que el cdigo anterior:
Visual Basic .NET

Dim daCategory As New SqlDataAdapter _


("ProductCategoryList", conn)
daCategory.SelectCommand.CommandType = _
CommandType.StoredProcedure

C#

SqlDataAdapter daCategory = new SqlDataAdapter


("ProductCategoryList", conn);
daCategory.SelectCommand.CommandType =
CommandType.StoredProcedure;

11

12

Invocar procedimientos almacenados con Microsoft ADO.NET

Ejecutar el
procedimiento
almacenado

Para ejecutar el procedimiento almacenado y guardar los registros devueltos en


un DataSet, invocar el mtodo Fill del objeto SqlDataAdapter. Este mtodo
rellena un objeto DataTable con los registros devueltos del procedimiento
almacenado.
Por ejemplo, el siguiente cdigo rellena el objeto DataSet ds con los registros
devueltos desde el procedimiento almacenado ProductCategoryList utilizando
el daCategory SqlDataAdapter:

Visual Basic .NET

daCategory.Fill(ds, "Categories")

C#

daCategory.Fill(ds, "Categories");

Tras rellenar un DataTable con los resultados de un procedimiento almacenado


Select, podemos vincular el DataTable a un control enlazado a lista para
mostrar los datos.

Invocar procedimientos almacenados con Microsoft ADO.NET

13

Demostracin: invocar un procedimiento almacenado

*****************************

Introduccin

En esta demostracin, veremos cmo invocar un procedimiento almacenado de


una base de datos Microsoft SQL Server, y vincular los resultados a un
DataGrid.

Ejecutar la demostracin
1. Abrir la pgina SPGetRecords.aspx del proyecto Demo09VB o Demo09CS
que se pueden encontrar dentro del fichero demos9.zip.
2. Generar y examinar la pgina.
El DataGrid est vinculado al procedimiento almacenado Ten Most
Expensive Products de la base de datos Northwind Traders.
3. En Visual Studio .NET, visualizar la pgina de cdigo subyacente de la
pgina SPGetRecords.aspx.
4. En el procedimiento de evento Page_Load, mostrar el cdigo que realiza lo
siguiente:
Crea el objeto SqlConnection.
Crea los objetos SqlDataAdapter y SqlCommand.
Establece las propiedades del objeto SqlCommand para invocar el
procedimiento almacenado.
Crea un nuevo DataSet y lo rellena desde el DataAdapter.

14

Invocar procedimientos almacenados con Microsoft ADO.NET

Prctica: mostrar datos de un procedimiento almacenado

Los estudiantes:
z

Arrastrarn un procedimiento almacenado


desde el Explorador de servidores a un
formulario Web Form ASP.NET
Crearn un objeto DataReader para leer
los datos del procedimiento almacenado
Vincularn un DataGrid al DataReader

Tiempo: 15 minutos

*****************************

Introduccin

En esta prctica, crearemos un objeto DataReader para invocar un


procedimiento almacenado en una base de datos SQL Server, y vincularemos
los resultados a un DataGrid.

Ejecutar la prctica
1. Crear un nuevo proyecto de aplicacin Web y establecer su ubicacin en
Visual Basic .NET

http://localhost/Pract09VB

C#

http://localhost/Pract09CS
2. Abrir la pgina WebForm1.aspx.
3. Abrir el Explorador de servidores y expandir las siguientes carpetas:
nombre_mquina, Servidores SQL Server, nombre_mquina, Northwind y
Procedimientos almacenados.
4. Hacer clic en el procedimiento almacenado Ten Most Expensive Products
y arrastrarlo a la pgina WebForm1.aspx.
Visual Studio .NET crea automticamente un objeto SqlConnection
denominado sqlConnection1 y un objeto SqlCommand denominado
sqlCommand1.
5. Utilizando el Cuadro de herramientas, ubicar un control DataGrid en la
pgina WebForm1.aspx.

Invocar procedimientos almacenados con Microsoft ADO.NET

15

6. Crear un procedimiento de evento Page_Load y agregar el siguiente cdigo


para crear un DataReader desde el objeto SqlCommand y vincularlo al
DataGrid:
Visual Basic .NET

Dim dr As SqlClient.SqlDataReader
SqlConnection1.Open()
dr = SqlCommand1.ExecuteReader()
DataGrid1.DataSource = dr
DataGrid1.DataBind()
dr.Close()
SqlConnection1.Close()

C#

SqlDataReader dr;
sqlConnection1.Open();
dr = sqlCommand1.ExecuteReader();
DataGrid1.DataSource = dr;
DataGrid1.DataBind();
dr.Close();
sqlConnection1.Close();

C#

7. Si se est utilizando C# para generar este proyecto, debemos introducir el


siguiente cdigo al inicio de la pgina de cdigo subyacente.
using System.Data.SqlClient;

8. Generar y examinar la pgina WebForm1.aspx.

16

Invocar procedimientos almacenados con Microsoft ADO.NET

Utilizar parmetros

Identificar los parmetros disponibles


z

Input

Output

InputOutput

ReturnValue

Incluir parmetros en la coleccin de parmetros


o

Incluir valores de parmetros en la cadena de comando

*****************************

Introduccin

Cuando utilizamos procedimientos almacenados en una base de datos SQL


Server o en cualquier otra base de datos basada en procedimientos, se pueden
utilizar parmetros para pasar informacin y recuperar datos del procedimiento
almacenado.
Cuando utilizamos parmetros con una base de datos SQL Server, los nombres
de los parmetros que se agregan a la coleccin Parameters del objeto
Command deben coincidir con los nombres de los parmetros del
procedimiento almacenado; no obstante, el orden de los parmetros es flexible.
Nota Cuando utilizamos parmetros en una base de datos OLE DB, el orden de
los parmetros en la coleccin Parmetros debe coincidir con el orden de los
parmetros definidos en el procedimiento almacenado.
La siguiente tabla describe los tipos de parmetros disponibles en los
procedimientos almacenados.
Parmetro

Uso

Input

Utilizado por la aplicacin Web para enviar valores de datos


especficos a un procedimiento almacenado.

Output

Utilizado por un procedimiento almacenado para enviar valores


especficos de retorno a la aplicacin Web que lo invoca.

InputOutput

Utilizado por un procedimiento almacenado tanto para recuperar


informacin enviada por nuestra aplicacin Web como para enviar
valores de retorno especficos a la aplicacin Web.

ReturnValue

Utilizado por un procedimiento almacenado para enviar un valor de


retorno a la aplicacin Web que lo invoca.

Invocar procedimientos almacenados con Microsoft ADO.NET

17

Pasar parmetros de entrada

Crear el parmetro, establecer la direccin y el valor,


agregar a la coleccin de parmetros
SqlParameter
param
SqlParameter
SqlParameter
param == new
new _
SqlParameter
param
== New
param
New SqlParameter
SqlParameter
_
("@Beginning_Date",
SqlDbType.DateTime);
("@Beginning_Date",
SqlDbType.DateTime);
("@Beginning_Date",
SQLDbType.DateTime)
("@Beginning_Date",
SQLDbType.DateTime)
param.Direction
== ParameterDirection.Input;
param.Direction =
ParameterDirection.Input;
param.Direction
param.Direction
= ParameterDirection.Input
ParameterDirection.Input
param.Value
=
Convert.ToDateTime
param.Value = Convert.ToDateTime
param.Value
param.Value == CDate(txtStartDate.Text)
CDate(txtStartDate.Text)
(txtStartDate.Text);
(txtStartDate.Text);
da.SelectCommand.parmetros.Add(param)
da.SelectCommand.parmetros.Add(param)
da.SelectCommand.parmetros.Add(param);
da.SelectCommand.parmetros.Add(param);

Ejecutar el procedimiento almacenado y almacenar los


registros devueltos
ds
DataSet()
ds == New
New DataSet();
DataSet();
DataSet()
da.Fill(ds,
"Products")
da.Fill(ds, "Products");
"Products");
"Products")

Cdigos de ejemplo
*****************************

Introduccin

Una vez identificados los parmetros soportados por un procedimiento


almacenado, debemos agregar los parmetros que utilizaremos a la coleccin
Parameters del objeto Command.

Crear un parmetro

Para crear un parmetro, crear un nuevo objeto SqlParameter con el nombre y


tipo de datos del parmetro, segn lo especificado por el procedimiento
almacenado. A continuacin, establecer la propiedad Direction del nuevo
parmetro para indicar la forma en que el procedimiento almacenado utilizar el
parmetro. Si el procedimiento almacenado devuelve un valor de retorno, crear
un parmetro denominado returnValue. Si el parmetro es de entrada,
establecer la propiedad Value para especificar los datos que deberan enviarse
al SQL Server.
Por ejemplo, el procedimiento almacenado ProductsByCategory toma un
parmetro de entrada, denominado @CategoryID de tipo int, como muestra el
siguiente cdigo:
Procedure ProductsByCategory (
@CategoryID int )
As
SELECT ProductID, ModelName, UnitCost, ProductImage,
Chairman
FROM Products
WHERE CategoryID=@CategoryID

18

Invocar procedimientos almacenados con Microsoft ADO.NET

Para invocar el procedimiento almacenado ProductsByCategory, crear un


parmetro de entrada denominado @CategoryID y establecer su valor con el
valor de un cuadro de texto:
Visual Basic .NET

Dim workParam1 As New SqlParameter _


("@CategoryID", SqlDbType.Int)
workParam1.Direction = ParameterDirection.Input
workParam1.Value = Cint(txtStartDate.Text)

C#

SqlParameter workParam1 = new SqlParameter


("@CategoryID", SqlDbType.Int);
workParam1.Direction = ParameterDirection.Input;
workParam1.Value = Convert.ToInt16(txtStartDate.Text);

Nota Deberamos validar siempre el contenido de un cuadro de texto antes de


enviar la entrada del usuario al procedimiento almacenado. Para una mayor
simplicidad, el cdigo anterior no lo hace.
Una vez creado el objeto Parameter, utilizar el mtodo Add de la coleccin
Parameters del objeto SelectCommand. Si un procedimiento almacenado
tiene ms de un parmetro, no importa en qu orden los agreguemos puesto que
los creamos por nombre:
Visual Basic .NET

Dim daSales as New SqlDataAdapter()


daSales.SelectCommand = New SqlCommand()
daSales.SelectCommand.Connection = conn
daSales.SelectCommand.CommandText = "ProductsByCategory"
daSales.SelectCommand.CommandType = _
CommandType.StoredProcedure
daSales.SelectCommand.Parameters.Add(workParam1)

C#

SqlDataAdapter daSales = new SqlDataAdapter();


daSales.SelectCommand = new SqlCommand();
daSales.SelectCommand.Connection = conn;
daSales.SelectCommand.CommandText = "ProductsByCategory";
daSales.SelectCommand.CommandType =
CommandType.StoredProcedure;
daSales.SelectCommand.Parameters.Add(workParam1);

Ejecutar un
procedimiento
almacenado

Una vez creado el objeto Command, utilizamos el mtodo Fill para ejecutar el
procedimiento almacenado y recuperar los registros:

Visual Basic .NET

ds = New DataSet()
daSales.Fill(ds, "Products")

C#

ds = new DataSet();
daSales.Fill(ds, "Products");

Invocar procedimientos almacenados con Microsoft ADO.NET

19

Utilizar parmetros de salida

Crear el parmetro, establecer direccin y aadir a la


coleccin Parameters
param
param == New
New SqlParameter("@ItemCount",
SqlParameter("@ItemCount", SQLDbType.Int)
SQLDbType.Int)
param.Direction
param.Direction == ParameterDirection.Output
ParameterDirection.Output
da.SelectCommand.parameters.Add(param)
da.SelectCommand.parameters.Add(param)
param
param == new
new SqlParameter("@ItemCount",
SqlParameter("@ItemCount", SqlDbType.Int);
SqlDbType.Int);
param.Direction
param.Direction == ParameterDirection.Output;
ParameterDirection.Output;
da.SelectCommand.parameters.Add(param);
da.SelectCommand.parameters.Add(param);

Ejecutar el procedimiento almacenado y almacenar los


registros devueltos
ds
ds == new
new DataSet()
DataSet()
da.Fill(ds)
da.Fill(ds)

ds
ds == new
new DataSet();
DataSet();
da.Fill(ds);
da.Fill(ds);

iTotal
Leer losda.parameters("@ItemCount").Value
parmetros de salida
iTotal == da.parameters("@ItemCount").Value
iTotal
iTotal == da.parameters("@ItemCount").Value;
da.parameters("@ItemCount").Value;
*****************************

Introduccin

Para leer el valor de un parmetro de salida o un valor de retorno de un


procedimiento almacenado que devuelve registros, debemos acceder al valor
del parmetro de salida en la coleccin Parmetros despus de que el
procedimiento almacenado se haya ejecutado.

Ejemplo de uso de
parmetros de salida

El procedimiento almacenado OrdersCount toma un ID de cliente y devuelve


el nmero de pedidos pendientes que ste tiene, pero no los pedidos actuales. El
procedimiento almacenado utiliza los parmetros de entrada @CustomerID, y
el parmetro de salida @ItemCount, ambos del tipo int, como muestra el
siguiente procedimiento almacenado:
Procedure OrdersCount (
@CustomerID int,
@ItemCount int OUTPUT )
As
SELECT @ItemCount=COUNT(OrderID)
FROM Orders
WHERE CustomerID=@CustomerID

Como el procedimiento almacenado anterior devuelve el nmero de filas y no


los datos de dichas filas, no necesitamos utilizar un objeto DataAdapter. En
lugar de ello, podemos utilizar un objeto Command directamente, e invocar el
mtodo ExecuteNonQuery para ejecutar el procedimiento almacenado.
Invocar un
procedimiento
almacenado que
devuelve un valor

Para invocar el procedimiento almacenado OrdersCount, necesitamos crear un


parmetro de entrada denominado @CustomerID y un parmetro de salida
denominado @ItemCount y aadirlos a la coleccin Parameters de un objeto
Command, y a continuacin invocar a ExecuteNonQuery para ejecutar el
procedimiento almacenado:

20

Invocar procedimientos almacenados con Microsoft ADO.NET

Visual Basic .NET

Dim myCmd As SqlCommand = New SqlCommand("OrdersCount", conn)


myCmd.CommandType = CommandType.StoredProcedure
'add an input parameter
Dim workParam as SqlParameter
workParam = New SqlParameter("@CustomerID", SqlDbType.Int)
workParam.Direction = ParameterDirection.Input
workParam.Value = CInt(txtCustID.Text)
myCmd.Parameters.Add (workParam)
'add an output parameter
workParam = New SqlParameter("@ItemCount", SqlDbType.Int)
workParam.Direction = ParameterDirection.Output
myCmd.Parameters.Add (workParam)

C#

SqlCommand myCmd = new SqlCommand("OrdersCount", conn);


myCmd.CommandType = CommandType.StoredProcedure;
// add an input parameter
SqlParameter workParam;
workParam = new SqlParameter("@CustomerID", SqlDbType.Int);
workParam.Direction = ParameterDirection.Input;
workParam.Value = Convert.ToInt16(txtCustID.Text);
myCmd.Parameters.Add(workParam);
// add an output parameter
workParam = new SqlParameter("@ItemCount", SqlDbType.Int);
workParam.Direction = ParameterDirection.Output;
myCmd.Parameters.Add(workParam);

Ejecutar el procedimiento
almacenado

El siguiente cdigo ejecuta el procedimiento almacenado MyCmd:

Visual Basic .NET

conn.Open()
myCmd.ExecuteNonQuery()
conn.Close()

C#

conn.Open();
myCmd.ExecuteNonQuery();
conn.Close();

Leer parmetros de
salida

Si estamos recuperando un valor de un procedimiento almacenado que devuelve


valores o establece un parmetro de salida, necesitamos utilizar el mtodo
Value del parmetro devuelto en la coleccin Parameters. Podemos
referenciar el valor del parmetro de salida por el nombre o por el ndice. El
siguiente ejemplo de cdigo recupera el valor del parmetro de salida
@ItemCount por el nombre:

Visual Basic .NET

curSales = myCmd.Parameters("@ItemCount").Value

C#

curSales = myCmd.Parameters["@ItemCount"].Value;

Invocar procedimientos almacenados con Microsoft ADO.NET

21

Demostracin: pasar parmetros

*****************************

Introduccin

En esta demostracin, veremos cmo invocar un procedimiento almacenado


con dos parmetros de entrada y a continuacin enlazar los resultados a un
DataGrid.

Para ejecutar la demostracin


1. Abrir la pgina SPUseParameters.aspx del proyecto Demo09VB o
Demo09CS que se pueden encontrar dentro del fichero demos9.zip.
2. Generar y examinar.
Introducir las fechas de inicio y final en Beginning Date y Ending Date y a
continuacin hacer clic en Get Sales by Year.
Se enlaza un DataGrid al procedimiento almacenado Sales by Year en la
base de datos Northwind Traders.
3. En Visual Studio .NET, visualizar el cdigo subyacente de la pgina
SPUseParameters.aspx.
4. En el procedimiento de evento cmdSale_Click, mostrar el cdigo que
realiza lo siguiente:
Crea la SqlConnection.
Crea el SqlDataAdapter y establece las propiedades del
SelectCommand para invocar el procedimiento almacenado Sales by
Year.
Crear dos parmetros de entrada.
Crear un nuevo DataSet y rellenar el DataSet desde el DataAdapter.

También podría gustarte