Cuando queremos ejecutar un procedimiento almacenado, por norma general necesitaremos dos parámetros: una cadena con el nombre del procedimiento, y una lista de parámetros que contendrá los filtros por los cuales el procedimiento almacenado limitará su búsqueda. Tomando como ejemplo una base de datos Sql Server, pensemos en el siguiente procedimiento almacenado:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Daniel García -- Create date: 11/05/2009 -- Description: Autentica un usuario -- ============================================= CREATE PROCEDURE SP_AutenticarUsuario @NombreUsuario VARCHAR(20) = NULL, @Password INT = NULL AS BEGIN SET NOCOUNT ON; SELECT IdUsuario, Nombre, Apellido1, Apellido2 FROM USUARIO WHERE NombreUsuario = @NombreUsuario AND Password = @Password END GO
El código necesario para ejecutar un procedimiento almacenado sería el siguiente:
' Declaramos una conexión, pasándole como parámetro la cadena de conexión a la Base de Datos Dim conexion As New SqlClient.SqlConnection("Data Source=SRVSQL2005;Initial Catalog=DatosCliente;User Id=DBUser;Password=DBPassword;") ' Declaramos un SqlCommand a partir del nombre del procedimiento y la conexión que hemos creado. Dim command As New SqlClient.SqlCommand("SP_AutenticarUsuario", conexion) ' Indicamos que vamos a ejecutar un procedimiento almacenado command.CommandType = CommandType.StoredProcedure ' Rellenamos los parámetros de entrada del procedimiento. ' NOTA: Se trata de un EJEMPLO. No hagáis esto en casa, niños, seguridad ante todo... =) Dim nombreUsuario As String = "admin" Dim password As String = "123456" ' Añadimos los parámetros al SqlCommand command.Parameters.Add(New SqlClient.SqlParameter("@NombreUsuario", nombreUsuario)) command.Parameters.Add(New SqlClient.SqlParameter("@Password", password)) ' Declaramos un DataAdapter a partir del SqlCommand y un DataSet para almacenar los datos. Dim da As New SqlClient.SqlDataAdapter(command) Dim ds As New DataSet ' Por último, rellenamos el DataSet da.Fill(ds)
Con esto rellenaríamos el DataSet con una tabla que contendría los campos IdUsuario, Nombre, Apellido1 y Apellido2, tal y como mostraba el procedimiento.
Este proceso es sencillo, pero tiene un problema: aumenta de forma dramática el acoplamiento, al codificar la lógica de acceso a datos de forma monolítica. Si posteriormente necesitáramos añadir o eliminar algún campo de la consulta, deberíamos acceder a este código y modificarlo. Más adelante veremos cómo abstraer un poco la entidad a la cual se referencia y el acceso a datos, utilizando el llamado patrón DAO.