Day: 11 mayo 2009

Rellenando un DataSet con una invocación a procedimiento almacenado


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.

Rellenando un DataSet con una invocación a procedimiento almacenado


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.