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 1 2 9

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 z z

Devolver registros Devolver un valor Realizar accin


Formulario Web Form Procedimiento Procedimiento almacenado almacenado Base datos Servidor ServidorWeb Web SQL SQLServer Server

Cliente Cliente

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

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. 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:

Acceso programtico a una base de datos

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. 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. 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. 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.

Programacin modular

Distribucin del trabajo

Incremento de la seguridad de la base de datos

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. 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.

Proporciona flexibilidad

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. 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:

Identificar el procedimiento almacenado

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

11

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 SqlDataAdapter daCategory = new SqlDataAdapter(); daCategory.SelectCommand = new SqlCommand(); daCategory.SelectCommand.Connection = conn; daCategory.SelectCommand.CommandText = "ProductCategoryList"; daCategory.SelectCommand.CommandType = CommandType.StoredProcedure;

C#

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 SqlDataAdapter daCategory = new SqlDataAdapter ("ProductCategoryList", conn); daCategory.SelectCommand.CommandType = CommandType.StoredProcedure;

C#

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 C#

daCategory.Fill(ds, "Categories") 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 C# http://localhost/Pract09VB 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() SqlDataReader dr; sqlConnection1.Open(); dr = sqlCommand1.ExecuteReader(); DataGrid1.DataSource = dr; DataGrid1.DataBind(); dr.Close(); sqlConnection1.Close();

C#

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 z z 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 Input Output InputOutput Uso Utilizado por la aplicacin Web para enviar valores de datos especficos a un procedimiento almacenado. Utilizado por un procedimiento almacenado para enviar valores especficos de retorno a la aplicacin Web que lo invoca. 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. Utilizado por un procedimiento almacenado para enviar un valor de retorno a la aplicacin Web que lo invoca.

ReturnValue

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 = param = New New SqlParameter SqlParameter _ ("@Beginning_Date", SqlDbType.DateTime); ("@Beginning_Date", SqlDbType.DateTime); ("@Beginning_Date", SQLDbType.DateTime) ("@Beginning_Date", SQLDbType.DateTime) param.Direction = param.Direction = = ParameterDirection.Input; ParameterDirection.Input; param.Direction param.Direction = ParameterDirection.Input ParameterDirection.Input param.Value = Convert.ToDateTime param.Value = CDate(txtStartDate.Text) Convert.ToDateTime param.Value param.Value = = 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. 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

Crear un parmetro

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) SqlParameter workParam1 = new SqlParameter ("@CategoryID", SqlDbType.Int); workParam1.Direction = ParameterDirection.Input; workParam1.Value = Convert.ToInt16(txtStartDate.Text);

C#

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) 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);

C#

Ejecutar un procedimiento almacenado Visual Basic .NET C#

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

ds = New DataSet() daSales.Fill(ds, "Products") 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);

Leer los parmetros de salida iTotal iTotal = = da.parameters("@ItemCount").Value 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. 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

Ejemplo de uso de parmetros de salida

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


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)

Visual Basic .NET

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 Visual Basic .NET

El siguiente cdigo ejecuta el procedimiento almacenado MyCmd:

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

C#

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:
curSales = myCmd.Parameters("@ItemCount").Value curSales = myCmd.Parameters["@ItemCount"].Value;

Visual Basic .NET C#

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